Resumo Java Completo
Resumo Java Completo
Java
Completo
Modificadores de Variáveis
void exibir() {
int x = 10; // variável local
}
class Pessoa {
String nome; // de instância
}
3. Estática (static) – Compartilhada entre todos os objetos
Exemplo:
static int contador = 0;
Dicas Rápidas
Tarefa Tipo mais usado
Contar coisas Int
Cálculos com casas decimais Double
Verificar condições Boolean
Guardar letras Char
Armazenar textos String
Valor comum a todos os objetos Static
1. Tipos Primitivos
Simples, leves e de uso direto.
Dicas Rápidas
Use int para números inteiros, a menos que o valor seja muito grande → use long.
Use double por padrão para números decimais, exceto se estiver lidando com poucos recursos
→ use float.
Use boolean sempre que precisar tomar uma decisão (ex: ligado/desligado).
Use char se precisar trabalhar com uma letra apenas (ex: iniciais).
Use String para qualquer informação textual.
Prefira tipos primitivos quando quiser melhor desempenho e economia de memória.
Prefira tipos por referência quando precisar de mais funcionalidades (ex: métodos prontos de
String ou List).
Intervalo
Tipo Tamanho Exemplo Quando Usar
aproximado
Dados pequenos, sensores, economia de
byte 8 bits -128 a 127 byte b = 120;
memória
short 16 bits -32.768 a 32.767 short s = 1000; Cálculos pequenos onde int é exagero
int 32 bits -2 bilhões a 2 bilhões int x = 2024; Contagens, operações gerais (mais usado)
Valores muito grandes, como tempo em
long 64 bits ±9 quintilhões long l = 999999L;
milissegundos
~7 dígitos de
float 32 bits float f = 3.14f; Decimais simples (economia de memória)
precisão
~15 dígitos de double d =
double 64 bits Decimais mais precisos (mais usado)
precisão 3.1415;
Quando usar: Finanças, valores monetários, cálculo com casas decimais exatas.
Quando usar: Quando você está passando um valor menor para um tipo maior, sem risco de perda de
informação.
Exemplo:
int x = 10;
double y = x; // conversão implícita de int para double
Quando usar: Quando você precisa controlar exatamente como os dados são convertidos, mesmo
correndo riscos.
Exemplo:
double preco = 19.99;
int inteiro = (int) preco; // Resultado: 19 (perde o .99)
Tabela Resumo
Risco de
Tipo de Conversão Exemplo Quando Usar
Perda?
Tipos compatíveis, sem perda de
Implícita (Widening) int x = 10; double y = x; ❌ Não
dados
double d = 3.14; int i = (int)
Explícita (Narrowing) ✅ Sim Necessário reduzir o tipo
d;
Conversões Entre Tipos Incompatíveis (Usando Métodos)
Às vezes, você precisa converter tipos que não se conversam diretamente, como String → int ou int →
String.
String → Número
int idade = Integer.parseInt("30");
double preco = Double.parseDouble("19.99");
Quando usar: Ao receber dados do teclado, arquivos, ou da web (sempre vêm como String).
Número → String
int x = 50;
String texto = String.valueOf(x);
// ou
String texto2 = x + "";
Dicas Importantes
Sempre verifique se há risco de perda de dados com conversão explícita.
Prefira conversões com métodos prontos (Integer.parseInt, Double.valueOf) para evitar erros.
Em valores monetários com String, use BigDecimal para evitar arredondamentos inesperados.
Operadores em Java
Operadores são símbolos usados para realizar operações com variáveis e valores. Em Java, eles se
dividem em categorias:
1. Aritméticos
Usados para fazer cálculos matemáticos.
2. Atribuição
Usados para atribuir valores a variáveis.
Operador Exemplo Equivalente a
= x = 10; -
+= x += 5; x = x + 5;
-= x -= 3; x = x - 3;
*= x *= 2; x = x * 2;
/= x /= 4; x = x / 4;
Operador Exemplo Equivalente a
%= x %= 2; x = x % 2;
3. Comparação (Relacionais)
Comparam dois valores e retornam true ou false.
4. Lógicos
Combinam expressões booleanas.
5. Incremento e Decremento
Alteram o valor de uma variável em 1.
6. Ternário
Forma curta de if-else.
Dicas Finais
Evite == com String, use .equals():
if (nome.equals("Maria")) { ... }
Combine operadores lógicos e relacionais em condições complexas.
O ternário deixa o código mais limpo em retornos simples.
Use ++/-- com cuidado dentro de expressões para evitar confusão.
Strings em Java
Em Java, String é uma classe imutável usada para trabalhar com textos (sequência de caracteres).
1. Declaração de String
String nome = "João";
String cidade = new String("São Paulo"); // menos comum
Quando usar: Sempre que lidar com texto, como nomes, mensagens, comandos, entrada de usuário.
3. Concatenação de Strings
Forma Exemplo
Com + "Olá, " + nome
Com concat() "Olá, ".concat(nome)
Com StringBuilder new StringBuilder().append(...)
Quando usar:
Use + para juntar poucas Strings.
Use StringBuilder para concatenar em loops ou grandes volumes, por ser mais eficiente.
4. Comparações de String
Evite ==! Use .equals().
String a = "java";
String b = "java";
String c = new String("java");
Exemplo prático
String frase = " Java é poderoso! ";
System.out.println(frase.trim().toUpperCase().replace("PODEROSO", "INCRÍVEL"));
// Resultado: JAVA É INCRÍVEL!
1. Constantes
Constante Descrição
Math.PI Valor de π (3.14159...)
Math.E Valor de Euler (2.71828...)
2. Operações Básicas
Método Exemplo Descrição Quando usar
Math.abs(x) Math.abs(-10) → 10 Valor absoluto Para evitar números negativos
Math.max(a, b) Math.max(5, 8) → 8 Maior valor Comparar e escolher maior número
Math.min(a, b) Math.min(5, 8) → 5 Menor valor Comparar e escolher menor número
Math.sqrt(x) Math.sqrt(16) → 4.0 Raiz quadrada Cálculos matemáticos, física
Math.pow(a, b) Math.pow(2, 3) → 8.0 Potência (a^b) Cálculos exponenciais
3. Arredondamentos
Método Exemplo Resultado Quando usar
Math.round(3.6) → Arredonda para o inteiro Quando quer arredondar
Math.round(float/double)
4 mais próximo valores decimais
Math.floor(3.9) → Arredonda para baixo
Math.floor(double) Para arredondar para baixo
3.0 (menor inteiro)
Math.ceil(3.1) → Arredonda para cima (maior
Math.ceil(double) Para arredondar para cima
4.0 inteiro)
4. Funções Trigonométricas
Método Exemplo Descrição Quando usar
Math.sin(Math.PI / 2) → Geometria, física,
Math.sin(angleRadians) Seno do ângulo (radianos)
1 gráficos
Método Exemplo Descrição Quando usar
Cosseno do ângulo Geometria, física,
Math.cos(angleRadians) Math.cos(0) → 1
(radianos) gráficos
Math.tan(Math.PI / 4) →
Math.tan(angleRadians) Tangente do ângulo Geometria, física
1
Dicas Rápidas
Use Math.pow() para elevar números a potências.
Use Math.sqrt() para raiz quadrada.
Use arredondamento adequado dependendo do contexto (floor, ceil ou round).
Use funções trigonométricas em ângulos convertidos para radianos:
double graus = 90;
double rad = Math.toRadians(graus);
double seno = Math.sin(rad);
Booleanos em Java
O tipo boolean representa valores lógicos, que podem ser true (verdadeiro) ou false (falso).
1. Declaração de boolean
boolean ligado = true;
boolean conectado = false;
2. Operadores booleanos
Operador Exemplo Descrição Resultado Quando usar
&& true && false E (AND) false Quando todas condições devem ser verdadeiras
` ` `true
! !true Negação (NOT) false Para inverter o valor booleano
3. Uso em decisões
boolean temCarteira = true;
if (temCarteira) {
System.out.println("Pode dirigir.");
} else {
System.out.println("Não pode dirigir.");
}
4. Expressões booleanas
Podem ser criadas comparando valores:
int idade = 20;
boolean maiorDeIdade = (idade >= 18); // true
Dicas Importantes
Nunca use == para comparar Boolean objetos, prefira .equals() ou compare boolean primitivo.
Use boolean para controlar flags, estados e decisões lógicas simples.
1. Estrutura básica
if (condição) {
// executa se condição for verdadeira
} else {
// executa se condição for falsa
}
Exemplo:
int idade = 18;
if (idade >= 18) {
System.out.println("Maior de idade");
} else {
System.out.println("Menor de idade");
}
Quando usar: Quando só precisa executar algo se a condição for verdadeira e nada caso contrário.
4. Expressões booleanas no if
A condição pode ser qualquer expressão que retorne true ou false.
if (senha.equals("1234")) {
System.out.println("Acesso permitido");
}
5. Operadores lógicos em if
Combine condições usando && (AND), || (OR) e ! (NOT):
if (idade >= 18 && temCNH) {
System.out.println("Pode dirigir");
}
Dicas rápidas
Sempre use {} mesmo para blocos de uma linha para evitar erros.
Use else if para evitar vários if separados, tornando o código mais claro.
A condição do if deve ser obrigatoriamente booleana (true ou false).
1. Estrutura básica
switch (variável) {
case valor1:
// código se variável == valor1
break;
case valor2:
// código se variável == valor2
break;
default:
// código se nenhum case for atendido
break;
}
2. Exemplo prático
int dia = 3;
switch (dia) {
case 1:
System.out.println("Domingo");
break;
case 2:
System.out.println("Segunda-feira");
break;
case 3:
System.out.println("Terça-feira");
break;
default:
System.out.println("Dia inválido");
break;
}
Resultado: Terça-feira
3. Quando usar
Quando tiver várias condições baseadas no valor exato de uma variável.
Melhor que vários if-else if para múltiplas comparações de igualdade.
Suporta tipos: byte, short, int, char, String (Java 7+), enums.
4. Dicas importantes
Use break para evitar o efeito fall-through (execução contínua dos casos).
O bloco default é opcional, serve como "else" para casos não previstos.
A variável usada no switch deve ser compatível com os tipos suportados.
5. Switch com String
String comando = "sair";
switch (comando) {
case "entrar":
System.out.println("Entrando...");
break;
case "sair":
System.out.println("Saindo...");
break;
default:
System.out.println("Comando desconhecido");
}
1. Sintaxe básica
while (condição) {
// código a ser repetido
}
Exemplo:
int contador = 1;
while (contador <= 5) {
System.out.println("Contador: " + contador);
contador++;
}
Resultado: imprime números de 1 a 5.
2. Quando usar
Quando você não sabe exatamente quantas vezes o loop vai executar.
Quando a repetição depende de uma condição que pode mudar dentro do bloco.
Útil para loops que dependem de variáveis externas e condições dinâmicas.
3. Loop infinito
Se a condição nunca virar false, o loop roda para sempre:
while (true) {
// cuidado! loop infinito
}
Use com cuidado e inclua um break para sair quando necessário.
Dicas rápidas
Sempre atualize a variável da condição para evitar loops infinitos.
Use while para repetir com condição incerta (ex: ler dados até condição de parada).
Para loops com número definido de repetições, prefira for.
Loop for em Java
O for é uma estrutura de repetição usada quando sabemos de antemão quantas vezes o código deve ser
executado.
1. Sintaxe básica
for (inicialização; condição; atualização) {
// código a ser repetido
}
Exemplo:
for (int i = 1; i <= 5; i++) {
System.out.println("i = " + i);
}
Resultado: imprime i de 1 até 5.
2. Componentes do for
Inicialização: cria e inicializa a variável de controle (ex: int i = 0;).
Condição: define até quando o loop roda (i < 10).
Atualização: atualiza a variável de controle a cada iteração (i++).
3. Quando usar
Quando sabemos exatamente o número de repetições.
Para percorrer arrays ou coleções com índice.
Para loops com passo fixo (incrementos ou decrementos).
1. break
Encerra imediatamente o loop atual, saindo dele.
Usa-se para interromper um loop quando uma condição específica for satisfeita.
Exemplo:
for (int i = 1; i <= 10; i++) {
if (i == 5) {
break; // sai do loop quando i == 5
}
System.out.println(i);
}
Resultado: imprime 1, 2, 3, 4 e para.
2. continue
Pula a iteração atual do loop e vai direto para a próxima repetição.
Usa-se para ignorar determinadas condições sem sair do loop.
Exemplo:
for (int i = 1; i <= 5; i++) {
if (i == 3) {
continue; // pula o número 3
}
System.out.println(i);
}
Resultado: imprime 1, 2, 4, 5 (pula o 3).
3. Quando usar
Palavra-chave Quando usar
break Para sair do loop ao encontrar uma condição específica
continue Para ignorar apenas a iteração atual e continuar o loop
Dicas importantes
Use break para evitar execuções desnecessárias e otimizar loops.
Use continue para filtrar casos dentro do loop sem parar tudo.
Cuidado com loops infinitos e lógica complexa ao usar break e continue.
Arrays em Java
Arrays são estruturas que armazenam múltiplos valores do mesmo tipo em uma única variável.
1. Array Unidimensional
Representa uma lista linear de elementos.
Usado para armazenar uma sequência de dados.
Declaração e inicialização:
int[] numeros = new int[5]; // array com 5 posições (valores default 0)
int[] idades = {18, 21, 30, 25}; // array já inicializado
Declaração e inicialização:
int[][] matriz = new int[3][3]; // matriz 3x3, valores default 0
int[][] tabuleiro = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
Dicas rápidas
Arrays em Java têm tamanho fixo — para tamanho variável, use ArrayList.
Índices começam em zero (0).
Sempre verifique o tamanho (length) para evitar ArrayIndexOutOfBoundsException.
Métodos em Java
Métodos são blocos de código que executam uma tarefa específica e podem ser reutilizados várias vezes.
Eles ajudam a organizar e modularizar o programa.
2. Chamada do método
int resultado = soma(5, 3);
System.out.println(resultado); // imprime 8
5. Parâmetros e argumentos
Parâmetros são variáveis definidas na assinatura do método.
Argumentos são os valores passados ao chamar o método.
Dicas rápidas
Use nomes claros para métodos que descrevam a ação.
Métodos podem chamar outros métodos.
Pode ter métodos sobrecarregados (mesmo nome, parâmetros diferentes).
Métodos estáticos (static) pertencem à classe, não ao objeto.
1. Classes e Objetos
Classe: molde que define atributos (dados) e métodos (comportamentos).
Objeto: instância concreta de uma classe.
Exemplo:
public class Pessoa {
String nome;
int idade;
void falar() {
System.out.println("Olá, meu nome é " + nome);
}
}
// Criando objeto
Pessoa p = new Pessoa();
p.nome = "Ana";
p.idade = 25;
p.falar(); // Olá, meu nome é Ana
2. Encapsulamento
Esconder detalhes internos da classe.
Usar private para atributos e public métodos getters/setters para acesso.
public class Pessoa {
private String nome;
3. Herança
Permite criar uma nova classe baseada em uma existente (reutilização de código).
Usa extends.
public class Animal {
void fazerSom() {
System.out.println("Som genérico");
}
}
4. Polimorfismo
Capacidade de um objeto assumir várias formas.
Métodos com mesmo nome, comportamento diferente (sobrescrita).
Animal a = new Cachorro();
a.fazerSom(); // Saída: Au au
5. Abstração
Focar no essencial, escondendo detalhes complexos.
Usar classes/métodos abstratos ou interfaces.
abstract class Forma {
abstract void desenhar();
}
6. Quando usar POO
Projetos grandes e complexos.
Quando precisar modelar entidades do mundo real.
Para facilitar manutenção, reutilização e organização do código.
Dicas rápidas
Sempre comece modelando classes com atributos e métodos.
Use encapsulamento para proteger dados.
Utilize herança para evitar duplicação.
Aproveite polimorfismo para flexibilizar o código.
Interface em Java
Uma interface é um contrato que define um conjunto de métodos que uma classe deve implementar, sem
fornecer a implementação. Serve para garantir que classes diferentes sigam um mesmo padrão.
1. Declaração de interface
public interface Animal {
void fazerSom();
void mover();
}
4. Exemplo prático
public interface Veiculo {
void acelerar();
void frear();
}
Dicas rápidas
Métodos em interface são public e abstratos por padrão.
Desde Java 8, interfaces podem ter métodos default com implementação.
Use interfaces para projetar sistemas flexíveis e escaláveis.
Evite usar interfaces para implementar comportamento (usar classes abstratas para isso).
4. Exemplo prático
public abstract class Forma {
public abstract double calcularArea();
@Override
public double calcularArea() {
return Math.PI * raio * raio;
}
}
Dicas rápidas
Não pode criar objetos de classes abstratas: Animal a = new Animal(); → erro.
Classes que estendem a abstrata devem implementar todos os métodos abstratos ou também
serem abstratas.
Permite compartilhar código comum e garantir implementação de métodos essenciais.
Enums em Java
Enums (enumerações) são tipos especiais que representam um conjunto fixo de constantes, agrupando
valores relacionados.
2. Uso do enum
DiaSemana hoje = DiaSemana.QUINTA;
StatusPedido(int codigo) {
this.codigo = codigo;
}
Dicas rápidas
Enums são tipos seguros — garantem que só valores definidos possam ser usados.
Permitem métodos, construtores e implementam interfaces.
Úteis para estados, categorias, dias da semana, opções fixas, etc.
1. Importação e criação
import java.util.Scanner;
System.out.println("\nResumo:");
System.out.println("Nome: " + nome);
System.out.println("Idade: " + idade);
System.out.println("Altura: " + altura);
System.out.println("Estudante: " + estudante);
scanner.close();
}
}
2. Exemplos básicos
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.LocalDateTime;
Dicas rápidas
Evite usar java.util.Date e java.util.Calendar (antigos e complicados).
Use java.time (Java 8+) para melhor manipulação de datas/horas.
Para entrada e saída, formate as datas com DateTimeFormatter.
1. Array (vetor)
Estrutura básica, tamanho fixo.
Métodos: arrays não têm métodos próprios além dos da classe Arrays para manipulação.
Exemplo:
int[] numeros = {1, 2, 3, 4, 5};
System.out.println(numeros[2]); // Acessa índice 2 (valor 3)
2. ArrayList
Lista dinâmica, permite crescimento.
Implementa List.
Principais métodos:
Método Descrição
add(E e) Adiciona elemento no fim
add(int index, E e) Adiciona elemento na posição
get(int index) Retorna elemento na posição
set(int index, E e) Substitui elemento na posição
remove(int index) Remove elemento pela posição
remove(Object o) Remove a primeira ocorrência
size() Retorna tamanho da lista
clear() Remove todos os elementos
contains(Object o) Verifica se contém o elemento
isEmpty() Verifica se está vazia
Exemplo:
ArrayList<String> lista = new ArrayList<>();
lista.add("Ana");
lista.add("Pedro");
System.out.println(lista.get(1)); // Pedro
lista.remove("Ana");
System.out.println(lista.size()); // 1
3. LinkedList
Lista duplamente ligada.
Implementa List e Deque.
Método Descrição
add(E e) Adiciona elemento no fim
addFirst(E e) Adiciona no início
addLast(E e) Adiciona no fim
get(int index) Retorna elemento na posição
remove(int index) Remove elemento na posição
removeFirst() Remove primeiro elemento
removeLast() Remove último elemento
size() Retorna tamanho
Método Descrição
contains(Object o) Verifica se contém elemento
clear() Limpa lista
Exemplo:
LinkedList<String> fila = new LinkedList<>();
fila.add("Maria");
fila.addFirst("João");
System.out.println(fila.get(0)); // João
fila.removeLast();
4. HashSet
Conjunto não ordenado, elementos únicos.
Implementa Set.
Principais métodos:
Método Descrição
add(E e) Adiciona elemento (não duplica)
remove(Object o) Remove elemento
contains(Object o) Verifica se contém
size() Retorna tamanho
clear() Limpa conjunto
isEmpty() Verifica se vazio
Exemplo:
HashSet<Integer> numeros = new HashSet<>();
numeros.add(1);
numeros.add(2);
numeros.add(2); // Ignorado
System.out.println(numeros.size()); // 2
5. HashMap
Mapa chave-valor, chave única.
Implementa Map.
Principais métodos:
Método Descrição
put(K chave, V valor) Adiciona ou atualiza valor pela chave
get(Object chave) Retorna valor da chave
remove(Object chave) Remove par chave-valor
containsKey(Object chave) Verifica se chave existe
containsValue(Object valor) Verifica se valor existe
size() Tamanho do mapa
clear() Limpa mapa
keySet() Retorna conjunto das chaves
values() Retorna coleção dos valores
Exemplo:
HashMap<String, Integer> idades = new HashMap<>();
idades.put("Carlos", 30);
idades.put("Ana", 25);
System.out.println(idades.get("Ana")); // 25
idades.remove("Carlos");
6. Stack
Pilha LIFO (último a entrar, primeiro a sair).
Extende Vector.
Principais métodos:
Método Descrição
push(E e) Empilha elemento
pop() Remove e retorna topo
peek() Retorna topo sem remover
empty() Verifica se pilha está vazia
Exemplo:
Stack<String> pilha = new Stack<>();
pilha.push("Tarefa1");
pilha.push("Tarefa2");
System.out.println(pilha.pop()); // Tarefa2
System.out.println(pilha.peek()); // Tarefa1
7. Queue (Fila)
Fila FIFO (primeiro a entrar, primeiro a sair).
Implementada por classes como LinkedList.
Principais métodos:
Método Descrição
add(E e) Adiciona elemento (lança exceção se falhar)
offer(E e) Adiciona elemento (retorna false se falhar)
remove() Remove e retorna cabeça da fila (exceção se vazia)
poll() Remove e retorna cabeça (null se vazia)
element() Retorna cabeça sem remover (exceção se vazia)
peek() Retorna cabeça sem remover (null se vazia)
Exemplo:
Queue<String> fila = new LinkedList<>();
fila.offer("Pessoa1");
fila.offer("Pessoa2");
System.out.println(fila.poll()); // Pessoa1
System.out.println(fila.peek()); // Pessoa2
2. ArrayList
Situação ideal: Quando precisa de uma lista que pode crescer ou diminuir dinamicamente.
Exemplo prático: Lista de alunos que podem ser adicionados ou removidos durante a
execução.
Vantagem: Permite acesso rápido por índice e crescimento automático.
Limitação: Inserções/remover no meio da lista são mais lentas (O(n)).
3. LinkedList
Situação ideal: Quando você vai inserir ou remover muitos elementos no começo, meio ou fim
da lista.
Exemplo prático: Implementar uma fila de espera, onde pessoas entram e saem
frequentemente.
Vantagem: Inserções e remoções rápidas em qualquer posição (O(1) se tiver referência).
Limitação: Acesso a elementos por índice é lento (O(n)).
4. HashSet
Situação ideal: Quando você precisa garantir que os elementos sejam únicos e a ordem não
importa.
Exemplo prático: Armazenar números de identificação únicos, palavras-chave sem repetição.
Vantagem: Operações rápidas de inserção e busca (O(1) em média).
Limitação: Não mantém ordem dos elementos.
5. HashMap
Situação ideal: Quando você precisa associar pares chave-valor e acessar valores rapidamente
pela chave.
Exemplo prático: Armazenar nomes de usuários e suas senhas, ou produtos e seus preços.
Vantagem: Busca, inserção e remoção rápidas (O(1) em média).
Limitação: Não mantém a ordem das chaves.
6. Stack (Pilha)
Situação ideal: Quando você precisa de estrutura LIFO — o último elemento inserido é o
primeiro a ser retirado.
Exemplo prático: Histórico de navegação, desfazer/refazer operações, avaliar expressões
matemáticas.
Vantagem: Controle simples de "último a entrar, primeiro a sair".
Limitação: Acesso apenas ao topo da pilha.
7. Queue (Fila)
Situação ideal: Quando você precisa de estrutura FIFO — o primeiro elemento inserido é o
primeiro a ser retirado.
Exemplo prático: Filas de impressão, atendimento ao cliente, processamento de tarefas.
Vantagem: Mantém a ordem natural de chegada.
Limitação: Acesso apenas ao início e ao fim da fila.
Resumo rápido:
Java Generics
O que são Generics?
Generics permitem criar classes, interfaces e métodos que funcionam com tipos genéricos (não
fixos).
Garantem segurança de tipo em tempo de compilação, evitando erros de ClassCastException.
Evitam necessidade de cast explícito.
Sintaxe básica
class Caixa<T> {
private T objeto;
public T abrir() {
return objeto;
}
}
Exemplos de uso
Exemplo 1: Usando uma classe genérica
Caixa<String> caixaDeString = new Caixa<>();
caixaDeString.guardar("Olá");
String texto = caixaDeString.abrir();
System.out.println(texto);
Exemplo 2: Método genérico
public static <T> void imprimirArray(T[] array) {
for (T elemento : array) {
System.out.println(elemento);
}
}
Resumo:
Conceito Descrição
T, E, K, V Convenções para tipos genéricos (ex: T=Tipo)
Classe genérica Classe parametrizada por tipo
Método genérico Método parametrizado por tipo
Segurança de tipo Erros detectados em tempo de compilação
Evita cast explícito Menos erro em tempo de execução
Java Exceptions
O que são Exceptions?
Exceptions são erros que ocorrem durante a execução do programa.
Permitem tratar falhas de forma controlada sem quebrar o programa.
Tipos de Exceptions
try-catch-finally
try {
int resultado = 10 / 0;
} catch (ArithmeticException e) {
System.out.println("Erro: divisão por zero.");
} finally {
System.out.println("Sempre executa!");
}
try → bloco que pode lançar exceção
catch → bloco que trata a exceção
finally → sempre executa, mesmo com erro
1. ArithmeticException
int x = 10 / 0;
Uso: erros aritméticos como divisão por zero.
2. NullPointerException
String nome = null;
System.out.println(nome.length());
Uso: acessar membros de objetos nulos.
3. ArrayIndexOutOfBoundsException
int[] nums = {1, 2, 3};
System.out.println(nums[5]);
Uso: acessar índice inexistente de array.
4. IOException
BufferedReader reader = new BufferedReader(new FileReader("arquivo.txt"));
Uso: leitura/gravação de arquivos — Checked, precisa de try-catch.
5. FileNotFoundException
new FileInputStream("inexistente.txt");
Uso: arquivo não encontrado — é uma subclasse de IOException.
6. SQLException
Uso: erros relacionados a banco de dados — sempre tratar com try-catch.
7. ClassCastException
Object x = "texto";
Integer y = (Integer) x; // erro
Uso: conversão de tipos incompatíveis.
8. IllegalArgumentException
public void setIdade(int idade) {
if (idade < 0) {
throw new IllegalArgumentException("Idade inválida");
}
}
Uso: validar argumentos inválidos passados para métodos.
Boas práticas
Trate exceções específicas, evite catch (Exception e) genérico.
Use finally para liberar recursos (como arquivos, conexões).
Crie suas próprias exceções se necessário:
class SaldoInsuficienteException extends Exception {
public SaldoInsuficienteException(String msg) {
super(msg);
}
}
Resumo
Bloco Função
try Testa código que pode lançar erro
catch Trata a exceção
finally Sempre executado (liberação de recursos)
throw Lança manualmente uma exceção
throws Declara que um método pode lançar
Importações necessárias:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
Principais Métodos
Método Descrição
Pattern.matches(regex, str) Verifica se a string inteira bate com o padrão
Pattern.compile(regex) Cria um padrão reutilizável
matcher.find() Procura ocorrência parcial
matcher.matches() Verifica se toda a string combina
matcher.group() Retorna o que foi capturado
Exemplos práticos
Verificar se o texto é um número
System.out.println(Pattern.matches("\\d+", "12345")); // true
\\d+ = um ou mais dígitos (0-9)
Validar e-mail
String email = "[email protected]";
boolean valido = email.matches("^[\\w.-]+@[\\w.-]+\\.[a-zA-Z]{2,6}$");
System.out.println(valido); // true
Dicas rápidas:
Sempre use \\ no Java para escapar caracteres (\d vira "\\d").
Prefira Pattern.compile() para usar o mesmo padrão várias vezes.
Regex pode ser difícil no início, mas muito poderoso quando dominado.
Java Threads
O que são Threads?
Thread é uma unidade de execução dentro de um programa.
Permite executar várias tarefas simultaneamente (concorrência).
Ideal para tarefas demoradas que não devem travar a interface ou o programa.
new MinhaThread().start();
- Simples e direto.
- Não pode herdar outra classe (limitação do Java por só permitir herança única).
Métodos úteis
Método Descrição
start() Inicia a thread
run() Lógica da thread (não chama diretamente)
sleep(ms) Pausa a thread por x milissegundos
join() Espera a thread terminar antes de seguir
isAlive() Verifica se a thread ainda está rodando
interrupt() Interrompe a execução (sinaliza parada)
1. Interface Comparable<T>
Define a ordem natural de um objeto.
Como usar:
Implemente Comparable<T> na classe.
Override do método compareTo().
Exemplo:
class Produto implements Comparable<Produto> {
String nome;
double preco;
// Uso:
List<Produto> lista = new ArrayList<>();
lista.add(new Produto("TV", 2000));
lista.add(new Produto("Celular", 1500));
Collections.sort(lista); // ordena por preço
2. Interface Comparator<T>
Permite múltiplas formas de ordenação externas à classe.
Como usar:
Crie uma classe que implemente Comparator<T>.
Override do método compare().
Exemplo:
class ComparadorPorNome implements Comparator<Produto> {
public int compare(Produto p1, Produto p2) {
return p1.nome.compareTo(p2.nome);
}
}
// Uso:
Collections.sort(lista, new ComparadorPorNome());
Diferenças principais
Característica Comparable Comparator
Onde é implementado? Na própria classe Em uma classe externa (ou lambda)
Método compareTo() compare()
Ordem Apenas uma ordem natural Pode criar várias formas de ordenação
Uso com Collections.sort() Collections.sort(lista) Collections.sort(lista, comparator)
Situação Use
Quer ordenar sempre por um atributo Comparable
Quer ordenar por vários critérios Comparator
Precisa de flexibilidade de ordenação Comparator (pode ser externa ou lambda)
Usa Java 8+ Comparator.comparing() com lambda
if (!arquivo.exists()) {
try {
arquivo.createNewFile();
System.out.println("Arquivo criado!");
} catch (Exception e) {
e.printStackTrace();
}
} else {
System.out.println("Arquivo já existe.");
}
}
}
Quando usar?
Verificar se o arquivo existe.
Criar ou deletar arquivos e diretórios.
Trabalhar com informações do arquivo (nome, tamanho, caminho etc).
Quando usar?
Leitura simples e rápida, útil para arquivos pequenos ou scripts.
// Escrever (sobrescreve)
Files.write(caminho, List.of("Linha 1", "Linha 2"));
// Adicionar (append)
Files.write(caminho, List.of("Nova linha"), StandardOpenOption.APPEND);
}
}
Quando usar?
Trabalhar com arquivos pequenos/moderados de forma moderna e limpa.
Ideal para projetos com Java 8+.
Dicas importantes
Sempre use try-with-resources ou feche os recursos (.close()).
Trate exceções com try-catch ou throws IOException.
Prefira Files e BufferedReader para desempenho e simplicidade.
Exemplo simples:
StringBuilder sb = new StringBuilder("Olá");
sb.append(" mundo!");
System.out.println(sb); // Olá mundo!
sb.append(" é legal");
sb.insert(4, "Script"); // JavaScript é legal
sb.replace(0, 4, "Type"); // TypeScript é legal
sb.delete(10, 15); // remove " é"
sb.reverse(); // inverte
sb.setCharAt(0, '!'); // troca primeiro caractere
sb.reverse(); // volta ao normal
System.out.println("Texto final: " + sb);
System.out.println("Substring: " + sb.substring(0, 4));
System.out.println("Index of 'S': " + sb.indexOf("S"));
}
}
Exercícios de Java
1. Variáveis e Tipos Primitivos
Crie um programa que declare e imprima variáveis dos seguintes tipos:
int, double, char, boolean, byte, short, long, float
4. Strings
Receba uma String do usuário e:
Conte o número de caracteres
Transforme em maiúscula
Verifique se contém a letra "a"
5. Java Math
Gere dois números aleatórios entre 1 e 100 e calcule:
Raiz quadrada
Potência
Valor absoluto da subtração
6. Booleanos e Condicionais
Verifique se uma pessoa pode votar com base na idade (>= 16).
Use uma variável booleana para armazenar o resultado.
7. If/Else
Crie um programa que diga se o número digitado é positivo, negativo ou zero.
8. Switch
Peça um número de 1 a 7 e mostre o dia da semana correspondente.
Use switch.
9. While Loop
Imprima todos os números pares de 1 a 20 usando while.
12. Arrays
Crie um array de 5 nomes e imprima todos com for.
Depois, transforme em caixa alta usando toUpperCase().
14. Métodos
Crie um método soma(int a, int b) que retorne a soma.
Chame o método no main.
18. Enums
Crie um enum com os dias da semana e imprima uma mensagem diferente para DOMINGO.
System.out.println(idade + ", " + salario + ", " + genero + ", " + ativo + ", " + b + ", " + s + ", " + l + ", " + f);
Exercício 3: Operadores
int a = 10, b2 = 20;
System.out.println(a + b2);
System.out.println(a > b2);
System.out.println(a < b2 && b2 > 15);
Exercício 4: Strings
Scanner sc = new Scanner(System.in);
String entrada = sc.nextLine();
System.out.println(entrada.length());
System.out.println(entrada.toUpperCase());
System.out.println(entrada.contains("a"));
Exercício 5: Math
int n1 = (int)(Math.random() * 100 + 1);
int n2 = (int)(Math.random() * 100 + 1);
System.out.println(Math.sqrt(n1));
System.out.println(Math.pow(n1, 2));
System.out.println(Math.abs(n1 - n2));
Exercício 6: Booleanos
int idadeVoto = 17;
boolean podeVotar = idadeVoto >= 16;
System.out.println(podeVotar);
Exercício 7: If/Else
int numero = -5;
if (numero > 0) System.out.println("Positivo");
else if (numero < 0) System.out.println("Negativo");
else System.out.println("Zero");
Exercício 8: Switch
int dia = 3;
switch (dia) {
case 1 -> System.out.println("Domingo");
case 2 -> System.out.println("Segunda");
case 3 -> System.out.println("Terça");
case 4 -> System.out.println("Quarta");
case 5 -> System.out.println("Quinta");
case 6 -> System.out.println("Sexta");
case 7 -> System.out.println("Sábado");
default -> System.out.println("Dia inválido");
}
Exercício 9: While
int count = 1;
while (count <= 20) {
if (count % 2 == 0) System.out.println(count);
count++;
}