📚Noções básicas de Java
1. Quais são as características do Java?
Compreenda os principais recursos da linguagem Java
- Orientado a objetos:Suporta recursos como encapsulamento, herança e polimorfismo
- Independência de plataforma:Escreva uma vez, execute em qualquer lugar (WORA)
- Gerenciamento automático de memória:Mecanismo de coleta de lixo libera memória automaticamente
- Suporte multithread:Mecanismo de thread integrado para facilitar a programação simultânea
- Segurança forte:Fornece mecanismos de segurança, como verificação de tipo e tratamento de exceções
- Características dinâmicas:Verificação de tipo de tempo de execução e carregamento dinâmico
2. Quais são as diferenças entre JDK, JRE e JVM?
Compreenda a estrutura de três camadas do Java Runtime Environment
- JVM (Máquina Virtual Java):Máquina virtual, um computador abstrato que executa bytecode para obter recursos de plataforma cruzada
- JRE (Java Runtime Environment):Ambiente de tempo de execução, incluindo JVM e bibliotecas de classes necessárias para execução
- JDK (kit de desenvolvimento Java):Kit de ferramentas de desenvolvimento, incluindo JRE + compilador + ferramentas de depuração e outras ferramentas de desenvolvimento
- Relação de inclusão:JDK > JRE > JVM
3. O que é bytecode? Por que Java é multiplataforma?
Compreenda profundamente os princípios do mecanismo de plataforma cruzada do Java
- Definição de bytecode:O código intermediário gerado pela compilação do código-fonte Java, a extensão do arquivo é .class
- Princípio de plataforma cruzada:Código fonte Java → bytecode → execução JVM em diferentes plataformas
- Vantagens:Compile uma vez, execute em qualquer lugar; os desenvolvedores não precisam reescrever o código para plataformas diferentes
- Processo de execução:O compilador javac compila o arquivo .java em um arquivo .class, que é então interpretado e executado pela JVM de cada plataforma.
4. Quais são os tipos básicos de dados em Java?
Sistema de tipos do Master Java
- Tipo inteiro:byte (1 byte), curto (2 bytes), int (4 bytes), longo (8 bytes)
- Tipo de ponto flutuante:float (4 bytes), duplo (8 bytes)
- Tipo de personagem:char (2 bytes, suporta Unicode)
- Tipo booleano:booleano (1 byte, verdadeiro/falso)
- Valor padrão:inteiro 0, float 0,0, booleano falso, char '\u0000'
- Categoria de embalagem:Integer, Long, Float, Double, Boolean e outros tipos de referência correspondentes
5. Qual é a diferença entre final, finalmente e finalizar?
Distinguir entre três conceitos semelhantes, mas completamente diferentes
- final (palavra-chave):As classes modificadas não podem ser herdadas, os métodos modificados não podem ser substituídos e as variáveis modificadas não podem ser reatribuídas.
- finalmente (palavra-chave):O bloco de código em try-catch-finalmente será executado independentemente de haver uma exceção e é frequentemente usado para liberação de recursos.
- finalizar (método):Método da classe Object, chamado antes do objeto ser coletado como lixo, usado para limpar recursos (obsoleto)
- Cenários de aplicação:final é usado para controle de imutabilidade, finalmente é usado para segurança de exceções, finalize foi substituído por try-with-resources
🎯 Programação orientada a objetos
6. O que é orientado a objetos? Quais são as quatro características principais?
Compreenda os conceitos básicos de OOP
- Definição orientada a objetos:A ideia de programação baseada em objetos, enfatizando as propriedades e comportamentos dos objetos
- Quatro recursos principais:
- Resumo:Extraia características comuns das coisas e ignore detalhes não essenciais
- Pacote:Oculte detalhes internos de implementação, exponha as interfaces necessárias e melhore a segurança
- Herança:As subclasses herdam as propriedades e métodos da classe pai para conseguir a reutilização do código
- Polimorfismo:Diferentes implementações da mesma interface, ligação dinâmica em tempo de execução
7. O que é polimorfismo? Quais são as maneiras de implementar o polimorfismo?
Compreensão aprofundada do mecanismo de polimorfismo Java
- Definição polimórfica:Um objeto possui múltiplas formas e a mesma chamada de método possui desempenhos diferentes em objetos diferentes.
- Método de implementação:
- Polimorfismo em tempo de compilação (sobrecarga):Métodos com o mesmo nome, mas com parâmetros diferentes, devem ser chamados durante a compilação.
- Polimorfismo de tempo de execução (substituído):A referência da classe pai aponta para o objeto da classe filha e o tempo de execução determina o método real chamado.
- Condições polimórficas de tempo de execução:Herdar, reescrever, transformação ascendente
- Vantagens:Melhore a flexibilidade e a capacidade de manutenção do código e ofereça suporte à programação de interface
8. Qual é a diferença entre interface e classe abstrata?
Compare as semelhanças e diferenças entre os dois mecanismos abstratos
- Classe abstrata:Usando modificação abstrata, pode haver métodos abstratos e métodos concretos
- Interface:Use a definição de interface, o método padrão é public abstract (Java 8+ suporta implementação padrão)
- Relação de herança:Uma classe só pode herdar uma única classe abstrata, mas pode implementar múltiplas interfaces
- Modificadores de acesso:As classes abstratas podem ser privadas/protegidas e os membros da interface podem ser públicos por padrão.
- Variáveis:Classes abstratas possuem variáveis de instância, interfaces possuem apenas constantes estáticas
- Cenários de uso:Classes abstratas são usadas para compartilhar especificações de definição de código e interface
9. O que são sobrecarga e substituição?
Distinguir entre dois conceitos semelhantes, mas diferentes
- Sobrecarga:
- Na mesma classe, os nomes dos métodos são os mesmos, mas os tipos/número/ordem dos parâmetros são diferentes.
- É determinado em tempo de compilação e pertence à ligação estática.
- Os tipos de valor de retorno podem ser diferentes (mas não podem ser diferenciados apenas pelo valor de retorno)
- Substituir:
- A subclasse reimplementa o método da classe pai e a assinatura do método é exatamente a mesma
- Determinado em tempo de execução e pertence à ligação dinâmica
- Os tipos de valor de retorno e as exceções devem ser compatíveis
10. Quais são os modificadores de acesso? Qual é o escopo da ação?
Mecanismo de controle de acesso do Master Java
- público:Público, acessível a todas as turmas
- protegido:Protegido, acessível no mesmo pacote e subclasses
- padrão (sem modificador):Por padrão, o mesmo pacote está acessível
- privado:Privado, acessível apenas dentro da classe
- Comparação do escopo de acesso:público > protegido > padrão > privado
- Melhores práticas:Minimize os direitos de acesso e siga o princípio do encapsulamento
💾 Gerenciamento de memória e coleta de lixo
11. O que inclui a estrutura de memória Java?
Noções básicas sobre alocação de memória JVM
- Pilha:Armazena instâncias de objetos, compartilhadas por todas as threads, área principal para coleta de lixo, tamanho configurável
- Pilha:Armazene variáveis locais e chamadas de método, exclusivas para cada thread, e libere memória automaticamente
- Área de Método:Informações estruturais da classe de armazenamento, pool de constantes de tempo de execução, variáveis estáticas, etc., são compartilhadas por todos os threads
- Contador de programa:Registre o endereço da instrução de bytecode executada pelo thread atual
- Pilha de métodos locais:Executar método nativo (código C/C++)
12. O que é coleta de lixo? Quais são os algoritmos de coleta de lixo?
Compreensão profunda do mecanismo de GC
- Definição de coleta de lixo:Recuperar automaticamente a memória ocupada por objetos que não são mais usados
- Algoritmo principal:
- Marcar claro:Marque objetos vivos, limpe o lixo e gere fragmentos
- Algoritmo de cópia:Divida a memória em duas partes e copie os objetos sobreviventes durante a limpeza. Sem fragmentação, mas desperdício de memória.
- Classificação de tags:Compressão e desfragmentação após marcação, sem fragmentação, mas com baixo desempenho
- Algoritmo geracional:Os objetos são divididos em nova geração e antiga geração, e diferentes gerações usam estratégias diferentes.
- Vantagens:Gerenciamento automático de memória para evitar vazamentos de memória
13. Qual é a diferença entre heap e pilha?
Compare duas áreas importantes da memória
- Conteúdo de armazenamento:Heap objetos, tipos básicos de pilha e referências
- Tópico:O heap é compartilhado por todos os threads e cada thread possui uma pilha independente
- Gestão:O heap é gerenciado pelo coletor de lixo e a pilha é liberada automaticamente
- Tamanho:O heap é geralmente maior e a pilha é relativamente menor.
- Desempenho:A alocação de pilha é rápida, a alocação de heap é relativamente lenta
- Exceção:Estouro de pilha OutOfMemoryError, estouro de pilha StackOverflowError
14. O que é vazamento de memória? Como evitá-lo?
Reconheça problemas comuns de memória
- Definição de vazamento de memória:A memória solicitada pelo programa não pode ser liberada e a memória fica ocupada por muito tempo.
- Razões comuns:
- Objetos de vida longa referem-se a objetos de vida curta
- Os objetos da coleção não são limpos a tempo
- Ouvinte ou retorno de chamada não registrado
- A coleção estática cresce infinitamente
- Como evitar:Libere referências imediatamente, use try-with-resources e verifique o uso de memória regularmente
15. O que são referências fortes, referências suaves, referências fracas e referências virtuais?
Entenda os quatro tipos de referência do Java
- Citação forte:Referência comum, o objeto não é reciclado até que não haja uma referência forte
- Referência suave:Ele é reciclado quando não há memória suficiente e é usado para armazenamento em cache.
- Referência Fraca:Será reciclado no próximo GC e usado para WeakHashMap
- Referência Fantasma:Pode ser reciclado a qualquer momento e deve ser usado com uma fila de referência para rastrear a reciclagem de objetos
- Prioridade de reciclagem:Referência virtual > Referência fraca > Referência suave > Referência forte
📦 Estrutura de coleção
16. Qual é a estrutura do Java Collections Framework?
Domine o conceito geral de estrutura de coleção
- Interface de coleta:
- Lista:Ordenado e repetível, como ArrayList, LinkedList
- Definir:Não ordenado e não repetitivo, como HashSet, TreeSet
- Fila:Filas, como LinkedList, PriorityQueue
- Interface do mapa:
- Mapeamento de pares de valores-chave:HashMap, TreeMap, ConcurrentHashMap
- Nível geral:Iterável → Coleção/Mapa → classe de implementação concreta
17. Qual é a diferença entre ArrayList e LinkedList?
Compare duas implementações de lista comumente usadas
- Estrutura de dados:ArrayList é baseado em arrays, LinkedList é baseado em listas duplamente vinculadas
- Acesso aleatório:ArrayList O(1), LinkedList O(n)
- Inserção e exclusão:ArrayList O (n), LinkedList O (1)
- Uso de memória:ArrayList é contínuo, LinkedList é disperso (sobrecarga do ponteiro)
- Segurança do fio:Nenhum dos dois está sincronizado, você pode usar Collections.synchronizedList() ou CopyOnWriteArrayList
- Selecione:Use ArrayList para consultas frequentes e LinkedList para inserções e exclusões frequentes.
18. Qual é o princípio e desempenho do HashMap?
Compreensão profunda de como o HashMap funciona
- Estrutura de dados:Matriz + lista vinculada + árvore vermelha e preta (JDK 8+)
- Como funciona:hash(chave) % table.length Calcula o subscrito do array, link ou árvore em caso de conflito
- Fator de carga:O padrão é 0,75, expande quando usado capacidade ≥ capacidade × fator de carga
- Mecanismo de expansão:Capacidade duplicada, elementos reformulados
- Complexidade de tempo:Média O(1), pior O(n) (quando há muitos conflitos)
- Segurança do fio:Não sincronizado, use ConcurrentHashMap ou Collections.synchronizedMap() para multithreading
19. Como garantir que o HashSet não duplique?
Entenda o mecanismo de desduplicação do Set
- Implementação de baixo nível:Baseado no HashMap, a chave é o elemento e o valor é o objeto fixo
- Mecanismo de desduplicação:Primeiro compare hashCode() e, em seguida, use equals() para determinar a igualdade.
- Adicionar processo:Calcular hash → verificar se existe → adicionar se não existir → ignorar se existir
- Objetos personalizados:equals() e hashCode() devem ser reescritos para garantir consistência
- Desempenho:Adicionando, excluindo e pesquisando média O(1), dependendo da qualidade do hash
20. O que é fail-fast e fail-safe?
Compreenda o mecanismo de segurança do iterador de coleções
- falhar rápido:
- Modificar a coleção durante o processo de iteração lançará ConcurrentModificationException
- Detectado via modCount e esperadoModCount
- Como ArrayList, HashMap (não thread-safe)
- à prova de falhas:
- A iteração é baseada em um instantâneo ou cópia da coleção. Modificar a coleção original não afeta a iteração.
- Como CopyOnWriteArrayList, ConcurrentHashMap
- Sugestões de uso:Ao iterar, use remove() do iterador ou use uma coleção à prova de falhas.
⚠️Tratamento de exceções
21. Sistema de exceção Java?
Entenda a classificação das exceções Java
- Lançável (classe raiz):
- Exceção:exceção recuperável
- Erro:Erro no nível da máquina virtual, irrecuperável
- Categoria de exceção:
- Exceção verificada (verificada):Deve ser capturado ou declarado, como IOException
- Exceção não verificada (desmarcada):Não pode ser capturado, como NullPointerException, IndexOutOfBoundsException
- Exceções comuns:NPE, ClassCastException, ArrayIndexOutOfBoundsException, etc.
22. Ordem de execução try-catch-finally?
Domine o fluxo de execução do tratamento de exceções
- Situação normal:tente → finalmente → retorne normalmente
- Exceção:try → exceção ocorre → catch → finalmente → exceção é passada ou retornada
- finalmente apresenta:Deve ser executado, mesmo que return, throw, System.exit() em catch
- Exceções:O retorno em finalmente substituirá o retorno em try/catch
- Liberação de recursos:Recomenda-se usar try-with-resources para fechar recursos automaticamente
- Melhores práticas:Não altere o valor de retorno em finalmente, pois isso fará com que as exceções sejam perdidas
23. Qual é a diferença entre arremessos e arremessos?
Distinguir entre duas palavras-chave de tratamento de exceções
- lançar:
- Lançar instâncias de exceção manualmente, deve ser usado dentro do método
- Formato: lançar nova exceção("mensagem")
- lança:
- Declarar possíveis exceções lançadas na assinatura do método
- Formato: método public void() lança IOException
- Método de processamento:throw é declarado por throws e throws é tratado pelo chamador
- Aplicação:throw é usado para tratamento de exceções específicas, throws é usado para entrega de exceções
24. Como personalizar exceções?
Crie classes de exceção específicas do projeto
- Relação de herança:Herdar Exceção (exceção verificada) ou RuntimeException (exceção não verificada)
- Peças necessárias:
- Forneça um construtor sem parâmetros
- Forneça uma mensagem ao construtor
- Forneça a um construtor a mensagem e a causa
- Exemplo de código:classe pública CustomException estende Exceção {...}
- Melhores práticas:Nomenclatura clara, documentação clara e herança de classes de exceção apropriadas
25. Quais são os benefícios da sintaxe try-with-resources?
Entenda o gerenciamento automático de recursos
- Sintaxe:try (InputStream is = ...) { ... } fechar recursos automaticamente
- Requisitos:Os recursos devem implementar a interface AutoCloseable
- Vantagens:
- Chame automaticamente o método close() sem gerenciamento manual
- Tratamento correto de exceções quando suprimidas
- O código é mais conciso e evita vazamento de recursos
- Cenários aplicáveis:Classes de recursos como Arquivo, Stream, Conexão, Instrução, etc.
🔤 String, StringBuilder, StringBuffer
26. String é imutável e por quê?
Entenda as considerações profundas por trás do design de String
- Definição imutável:O objeto String não pode ser modificado após ser criado e qualquer operação de modificação retorna um novo objeto.
- Método de implementação:A matriz de valores é modificada finalmente e não possui método setter.
- Razões imutáveis:
- Otimização do buffer pool de strings para evitar criação repetida
- Thread seguro, sem necessidade de sincronização
- Suporta cache hashCode, adequado para chave HashMap
- Desvantagens:Modificações frequentes criam um grande número de objetos intermediários
27. Quais são as diferenças entre String, StringBuilder e StringBuffer?
Escolha a classe de manipulação de string apropriada
- Sequência:Imutável, thread-safe, baixo desempenho (modificação frequente)
- Construtor de strings:Variável, não thread-safe, excelente desempenho (single-threaded)
- StringBuffer:Mutável, thread-safe (métodos sincronizados), desempenho médio (multithreading)
- Comparação de desempenho:StringBuilder > StringBuffer > String
- Sugestões de uso:
- Concatenação de string de thread único usando StringBuilder
- StringBuffer para concatenação de strings multithread
- Não há necessidade de modificar, use String
28. Qual é o conjunto de constantes de string?
Entenda o mecanismo de cache de strings
- Definição:Cache de string mantido pela JVM, armazenando literais de string
- Localização:JDK 7+ no heap, anteriormente na área de métodos
- Mecanismo de criação:
- Literais como "abc" entram automaticamente no conjunto de constantes
- new String("abc") Se "abc" não estiver no pool, adicione-o
- método interno():Adicione uma string ao pool constante ou retorne uma referência existente
- Efeito de otimização:Economize memória e acelere comparações de strings
29. Como comparar strings quanto à igualdade?
Aprenda a comparar strings
- == Comparar:Compara se as referências são iguais, não compara o conteúdo
- comparação igual():Compare o conteúdo da string para ver se eles são iguais. É recomendado usar
- Comparação equalsIgnoreCase():Ignorar conteúdo de comparação de casos
- compararTo() comparação:Comparação lexicográfica, retornando um número inteiro
- Objetos.equals():Lidando com comparações seguras de valores nulos
- Melhores práticas:Use equals() para comparar o conteúdo da string, evite usar ==
30. Quais são os problemas de desempenho da concatenação de Strings?
Otimize o desempenho da concatenação de strings
- Pergunta:String s = "a" + "b" + "c" produz vários objetos intermediários e cópias
- Razão:String é imutável e um novo objeto é criado toda vez que é emendado.
- Impacto no desempenho:Complexidade de tempo O (n²) ao unir loops
- Plano de otimização:
- Direct + fora do loop: o compilador irá otimizar para StringBuilder
- Use explicitamente StringBuilder ou StringBuffer
- Use ferramentas como String.join(), StringJoiner, etc.
🔄 Multithreading e simultaneidade
31. O que é um tópico? Como criar um tópico?
Domine os conceitos básicos e métodos de criação de threads
- Definição do tópico:Fluxo de execução independente dentro do processo, memória compartilhada, mas pilha independente
- Como criar:
- Herdar Tópico:classe pública MyThread estende Thread { public void run() {} }
- Implementar executável:classe pública MyRunnable implementa Runnable { public void run() {} }
- Implementar chamável:Valores de retorno e suporte a exceções
- Diferença:Runnable é recomendado para evitar restrições de herança única
- Começar:Chame thread.start(), você não pode chamar run() diretamente
32. Ciclo de vida e status do thread?
Compreenda as várias transições de estado dos threads
- NOVO:Tópico criado mas não iniciado
- EXECUTÁVEL:Status executável (aguardando execução ou execução)
- BLOQUEADO:Estado bloqueado, aguardando para adquirir o bloqueio
- ESPERANDO:Estado de espera, aguardando notificação de outros threads
- TIMED_WAITING:Aguarde o tempo especificado
- TERMINADO:Tópico encerrado
- Transição de estado:NOVO → EXECUTÁVEL → BLOQUEADO/ESPERANDO → TERMINADO
33. Como funciona o sincronizado?
Entenda o mecanismo de bloqueio integrado do Java
- Mecanismo de sincronização:Sincronização usando o bloqueio integrado do objeto
- Como usar:
- Método de sincronização:método void sincronizado público() {}
- Bloco de sincronização:sincronizado(obj) { ... }
- Como funciona:
- Todo objeto possui um monitor
- O thread adquire o bloqueio e entra na seção crítica, execução mutuamente exclusiva
- Bytecode: monitorenter, monitorexit
- Recursos:Reentrante, exclusivo, liberação automática
34. Qual é o papel da palavra-chave volátil?
Compreender a visibilidade da memória e desabilitar a reordenação de instruções
- Função:
- Visibilidade:Garanta que as alterações sejam imediatamente visíveis para outros tópicos
- Refluxo proibido:Impedir otimizações de reordenação de compilador e CPU
- Implementação:Barreira de memória, forçando a leitura e escrita da memória principal
- Limitações:A atomicidade não é garantida e não pode substituir a sincronização
- Cenários de aplicação:Bit de sinalização, singleton de verificação dupla, marca de status
- Comparar sincronizado:volátil é mais leve, mas tem funcionalidade limitada
35. Quais são as funções e diferenças de wait(), notify() e notifyAll()?
Domine o mecanismo de comunicação entre threads
- espere():
- O thread atual libera o bloqueio e espera até que seja despertado
- Deve ser chamado dentro de um bloco sincronizado
- notificar():
- Ativar um tópico em espera (selecionado aleatoriamente)
- Não libere o bloqueio, espere até o final do bloco de sincronização antes de liberá-lo
- notificarTodos():
- Acorde todos os threads em espera
- Modo de uso:Modo produtor-consumidor, modo monitor
💡 Dicas de preparação para entrevistas
Aprofunde o básico:Não apenas conhecer os conceitos, mas também compreender os princípios e detalhes de implementação
Faça mais exercícios:Consolidar o conhecimento através da prática de codificação, especialmente relacionada a multi-threading e simultaneidade
Leia o código fonte:Estude o código-fonte da biblioteca Java (coleções, simultaneidade, etc.) para aprofundar sua compreensão
Preste atenção aos detalhes:Domine armadilhas comuns e práticas recomendadas, como comparação de strings, modificação de coleções e muito mais
Exemplo:Use exemplos específicos para ilustrar conceitos durante a entrevista e aumentar seu poder expressivo.