Como passar em uma entrevista de Java: analisando as principais perguntas com exemplos
Uma entrevista para a posição de desenvolvedor Java não é apenas um teste de teoria, mas também uma demonstração de pensamento prático. Os empregadores querem ver que você não apenas memorizou a sintaxe, mas entende como a máquina virtual funciona, como as coleções são estruturadas e como escrever código thread-safe. Neste artigo, reunimos as principais perguntas frequentemente feitas em entrevistas técnicas e fornecemos respostas detalhadas com exemplos em Java.
1. Perguntas sobre fundamentos de Java Core e POO
Toda entrevista começa com princípios básicos. O entrevistador verifica o quão profundamente você entende o paradigma da programação orientada a objetos e a estrutura da linguagem. Aqui estão as 3 principais perguntas desta categoria.
Qual a diferença entre uma classe abstrata e uma interface?
Isso é clássico. Uma classe abstrata pode conter tanto métodos abstratos quanto métodos comuns com implementação, além de campos e construtores. Uma interface (antes do Java 8) continha apenas assinaturas de métodos. A partir do Java 8, as interfaces ganharam métodos default e static, e com o Java 9, métodos private. A principal diferença: você pode herdar apenas uma classe abstrata, mas pode implementar múltiplas interfaces.
// Classe abstrataabstract class Animal { String name; abstract void sound(); void sleep() { System.out.println("Zzz"); }}
// Interfaceinterface Flyable { void fly(); default void glide() { System.out.println("Gliding..."); }}
class Bird extends Animal implements Flyable { @Override void sound() { System.out.println("Chirp"); } @Override public void fly() { System.out.println("Flying"); }}O que é polimorfismo? Dê um exemplo.
Polimorfismo é a capacidade de um objeto assumir múltiplas formas. Em Java, ele é implementado através de herança e interfaces. O exemplo mais comum é a sobrescrita de métodos.
List<String> list = new ArrayList<>();// Referência do tipo List, mas objeto ArrayList.// O método add() será chamado da implementação ArrayList.list.add("Exemplo de polimorfismo");Qual a diferença entre == e equals()?
== compara referências (endereços de memória), enquanto equals() compara o conteúdo lógico. Para classes wrapper (Integer, String), o equals() é sobrescrito e compara os valores. No entanto, para Integer existe um cache de -128 a 127, então == pode funcionar de forma inesperada.
Integer a = 100;Integer b = 100;System.out.println(a == b); // true (ambos do cache)
Integer c = 200;Integer d = 200;System.out.println(c == d); // false (objetos diferentes)System.out.println(c.equals(d)); // true2. Coleções Java: estruturas de dados e algoritmos
Coleções são o coração de qualquer aplicação Java. Sem entendê-las, é impossível passar em uma entrevista, mesmo de nível Junior. Os entrevistadores adoram perguntar sobre a complexidade das operações e a estrutura interna.
Como o HashMap funciona? Como funciona o hashing?
HashMap armazena pares chave-valor em um array de "baldes" (buckets). Ao adicionar um elemento, o hash code da chave é calculado e, com base nele, o número do balde é determinado. Se o balde já contiver elementos, uma lista encadeada ou árvore é usada (se houver mais de 8 elementos). No Java 8+, para otimização em caso de colisões, a lista é transformada em uma árvore rubro-negra.
Map<String, Integer> map = new HashMap<>();map.put("Java", 1);map.put("Python", 2);// Se "Java" e "Python" tiverem o mesmo hashCode — haverá colisão.System.out.println(map.get("Java")); // O(1) em médiaQual a diferença entre ArrayList e LinkedList? Quando usar cada um?
ArrayList é baseado em um array dinâmico. Acesso por índice — O(1), inserção/remoção no meio — O(n). LinkedList é baseado em uma lista duplamente encadeada. Acesso por índice — O(n), inserção/remoção no início ou no final — O(1). Use ArrayList quando precisar de acesso rápido por índice e iteração. Use LinkedList quando houver muitas inserções/remoções no início ou no final da lista.