Neste artigo, discutiremos vários tipos de perguntas da entrevista em entrevistas de Java que permitem que os empregadores testem Java dos candidatos e recursos comuns de programação orientados a objetos. Os capítulos a seguir são divididos em dois artigos anteriores e próximos. O primeiro artigo discutirá a programação orientada a objetos e suas características, perguntas comuns sobre Java e suas funções, aulas de coleta de Java, coletores de lixo e o segundo artigo discutirá principalmente o manuseio de exceções, Java Applets, Swing, JDBC, Chamadas de Método Remoto (RMI), servlets e JSP.
começar!
Índice
Programação orientada a objetos (OOP)
Problemas Java comuns
Tópicos Java
Classe de coleção Java
Coletor de lixo
Programação orientada a objetos (OOP)
O Java é uma linguagem de programação de computador que suporta concorrente, baseada em classes e orientada a objetos. As vantagens do desenvolvimento de software orientadas a objetos estão listados abaixo:
A programação orientada a objetos tem muitas características importantes, como: encapsulamento, herança, polimorfismo e abstração. Nos capítulos seguintes, analisaremos essas características uma a uma.
Pacote
O encapsulamento fornece aos objetos a capacidade de ocultar recursos e comportamentos internos. Um objeto fornece alguns métodos que podem ser acessados por outros objetos para alterar os dados dentro dele. Em Java, existem 3 modificadores: público, privado e protegido. Cada modificador fornece diferentes direitos de acesso a outros objetos localizados no mesmo pacote ou em pacotes diferentes.
Aqui estão alguns dos benefícios do uso do encapsulamento:
Consulte este documento para obter mais detalhes e exemplos sobre encapsulamento.
Polimórfico
O polimorfismo é uma capacidade de linguagens de programação para demonstrar as mesmas interfaces para diferentes tipos de dados subjacentes. As operações em um tipo polimórfico podem ser aplicadas a outros tipos de valores.
herdar
A herança fornece aos objetos a capacidade de obter campos e métodos de classes base. A herança fornece linhas de código reutilizadas e também pode adicionar novos recursos às classes existentes sem modificá -las.
resumo
A abstração é a etapa de separar idéias de instâncias concretas; portanto, crie classes com base em sua funcionalidade e não nos detalhes da implementação. O Java suporta a criação de classes abstratas que apenas expõem interfaces, mas não incluem implementações de métodos. O principal objetivo desta técnica abstrata é separar o comportamento da classe dos detalhes da implementação.
A diferença entre abstração e encapsulamento
Abstração e encapsulamento são conceitos complementares. Por um lado, abstrato se concentra no comportamento dos objetos. Por outro lado, o encapsulamento se concentra nos detalhes do comportamento do objeto. Geralmente, o encapsulamento é alcançado ocultando as informações internas do estado do objeto. Portanto, o encapsulamento pode ser considerado uma estratégia para fornecer abstração.
Problemas Java comuns
1. O que é uma máquina virtual Java? Por que Java é chamado de "linguagem de programação independente da plataforma"?
Uma máquina virtual Java é um processo de máquina virtual que pode executar o Java ByteCode. O arquivo de origem Java é compilado em um arquivo bytecode que pode ser executado por uma máquina virtual Java.
O Java foi projetado para permitir que os aplicativos sejam executados em qualquer plataforma sem exigir que os programadores reescrevi ou recomponham cada plataforma separadamente. As máquinas virtuais Java tornam isso possível porque conhece o comprimento da instrução e outros recursos da plataforma de hardware subjacente.
2. Qual é a diferença entre JDK e JRE?
O Java Runtime Environment (JRE) é uma máquina virtual Java que executará os programas Java. Ele também inclui plug -ins de navegador necessário para executar applets. O Java Development Toolkit (JDK) é um pacote completo de desenvolvimento de software Java que inclui JRE, compilador e outras ferramentas (como Javadoc, Java Debugger), que permite que os desenvolvedores desenvolvam, compilem e executem aplicativos Java.
3. O que significa a palavra -chave "estática"? Posso substituir um método privado ou estático em Java?
A palavra -chave "estática" indica que uma variável de membro ou método pode ser acessada sem uma variável de instância da classe à qual pertence.
O método estático em Java não pode ser substituído porque o método substituído é baseado na ligação dinâmica de tempo de execução, enquanto o método estático é a ligação estática no tempo de compilação. O método estático não está relacionado a nenhuma instância da classe, por isso não se aplica conceitualmente.
4. É possível acessar variáveis não estáticas em um ambiente estático?
A variável estática pertence à classe em Java, e seu valor em todas as instâncias é o mesmo. Quando a classe é carregada por uma máquina virtual Java, a variável estática será inicializada. Se o seu código tentar acessar variáveis não estáticas sem instâncias, o compilador relatará um erro porque essas variáveis ainda não foram criadas e ainda não foram associadas a nenhuma instância.
5. Quais são os tipos de dados suportados pelo Java? O que é desmontagem automática?
Os tipos de dados básicos suportados pela linguagem Java são:
O boxe automático é uma conversão feita pelo compilador Java entre o tipo de dados básico e o tipo de wrapper de objeto correspondente. Por exemplo: converter int em número inteiro, dobrar em dobro, etc. Caso contrário, é o Unboxing automático.
6. O que significa substituição do método e sobrecarga de método em java?
A sobrecarga do método em Java ocorre quando dois ou mais métodos têm os mesmos nomes de métodos, mas parâmetros diferentes na mesma classe. Por outro lado, a substituição do método significa que a subclasse redefine o método da classe pai. As substituições do método devem ter o mesmo nome do método, lista de parâmetros e tipo de retorno. O substituto não pode restringir o acesso aos métodos que abrange.
7. O que é um construtor em Java? O que é a sobrecarga do construtor? O que é um construtor de cópia?
Quando um novo objeto é criado, o construtor é chamado. Cada classe tem um construtor. Quando o programador não fornece um construtor para a classe, o compilador Java criará um construtor padrão para a classe.
A sobrecarga do construtor e a sobrecarga do método em Java são muito semelhantes. Vários construtores podem ser criados para uma classe. Cada construtor deve ter sua própria lista de parâmetros exclusivos.
O Java não suporta construtores de cópia como no C ++. Essa diferença é porque, se você não escrever o construtor, o Java não criará o construtor de cópia padrão.
8. Java suporta a herança múltipla?
Não suportado, o Java não suporta herança múltipla. Cada classe pode herdar apenas uma classe, mas pode implementar várias interfaces.
9. Qual é a diferença entre uma interface e uma classe abstrata?
O Java fornece e suporta a criação de classes e interfaces abstratas. Suas implementações têm semelhanças, e as diferenças são:
Você também pode se referir à diferença entre classes abstratas e interfaces no JDK8
10. O que a passagem de valor e a passagem de referência?
O objeto é passado por um valor, o que significa que uma cópia do objeto é passada. Portanto, mesmo que a cópia do objeto seja alterada, o valor do objeto de origem não será afetado.
Um objeto é passado por referência, o que significa que não é o objeto real passado, mas a referência do objeto. Portanto, alterações externas no objeto referenciado serão refletidas em todos os objetos.
Tópicos Java
11. Qual é a diferença entre um processo e um thread?
Um processo é um aplicativo de execução e um thread é uma sequência de execução dentro do processo. Um processo pode ter vários threads. Os threads também são chamados de processos leves.
12. Quantas maneiras diferentes existem para criar threads? Qual você gosta? Por que?
Existem três maneiras de criar threads:
A implementação da interface executável é mais popular porque não requer herdar a classe de threads. Quando outros objetos foram herdados no design do aplicativo, isso requer herança múltipla (enquanto o Java não suporta herança múltipla), ele só pode implementar interfaces. Ao mesmo tempo, os pools de threads também são muito eficientes e fáceis de implementar e usar.
13. Uma explicação resumida de vários estados disponíveis de threads.
Durante a execução, os tópicos podem estar nos seguintes estados:
14. Qual é a diferença entre o método de sincronização e o bloco de código de sincronização?
Na linguagem Java, cada objeto tem um bloqueio. Os threads podem usar a palavra -chave sincronizada para obter bloqueios em objetos. A palavra-chave sincronizada pode ser aplicada no nível do método (bloqueio de granulação grossa) ou no nível do bloco de código (bloqueio de granulação fina).
15. Como sincronizar threads dentro do monitor? Que nível de sincronização o programa deve fazer?
Monitores e bloqueios são usados juntos em máquinas virtuais Java. O monitor monitora um bloco de código síncrono, garantindo que apenas um thread execute o bloco de código síncrono por vez. Cada monitor está associado a uma referência de objeto. Os threads não permitem que o código de sincronização seja executado antes de adquirir o bloqueio.
16. O que é o impasse?
Quando os dois processos aguardam a outra parte concluir a execução antes de continuar a executar, ocorre um impasse. O resultado é que ambos os processos estão presos na espera infinita.
17. Como garantir que N tópicos possam acessar os recursos N sem causar impasse?
Ao usar o Multithreading, uma maneira muito simples de evitar impasses é especificar a ordem em que os bloqueios são adquiridos e forçar o thread a adquirir os bloqueios na ordem especificada. Portanto, se todos os threads bloquearem trava na mesma ordem, não haverá impulso.
Classe de coleção Java
18. Quais são as interfaces básicas da estrutura de classe de coleção Java?
As classes de coleta Java fornecem um conjunto bem projetado de interfaces e classes que suportam operações em um conjunto de objetos. As interfaces mais básicas nas aulas de coleção Java são:
19. Por que a classe de coleta não implementa as interfaces cloneáveis e serializáveis?
A interface da classe de coleção especifica um conjunto de objetos chamados elementos. Cada classe de implementação específica da interface da classe de coleção pode optar por salvar e classificar elementos à sua maneira. Algumas aulas de coleção permitem teclas duplicadas, enquanto outras não.
20. O que é um iterador?
A interface do iterador fornece muitas maneiras de iterar os elementos de coleta. Cada classe de coleta contém métodos iterativos que podem retornar uma instância do iterador. O iterador pode excluir elementos da coleção subjacente durante a iteração.
A semântica e os significados da clonagem ou serialização estão relacionados a implementações específicas. Portanto, a implementação específica da classe de coleta deve determinar como ser clonada ou serializada.
21. Qual é a diferença entre iterador e listiterator?
A diferença está listada abaixo:
22. Qual é a diferença entre falha rápida (falha-rápida) e falha segura (segura por falhas)?
A falha de segurança do iterador é baseada na fabricação de cópias da coleção subjacente, para que não seja afetada por modificações na coleção de origem. Todas as classes de coleta no pacote java.util falham rapidamente, enquanto todas as classes no pacote java.util.concurrent falham com segurança. Um iterador falhado rápido lançará uma exceção do ConcurrentModificationException, enquanto um iterador falhado seguro nunca lançará essa exceção.
23. Qual é o princípio de trabalho do Hashmap em Java?
O hashmap nos elementos Java armazena na forma de pares de valor-chave. O hashmap requer uma função de hash que usa métodos hashcode () e equals () para adicionar e recuperar elementos para/para a coleção. Quando o método put () for chamado, o hashmap calculará o valor de hash da chave e armazena os pares do valor da chave no índice apropriado no conjunto. Se a chave já existir, o valor será atualizado para um novo valor. Algumas características importantes do hashmap são sua capacidade, fator de carga e redimensionamento limite.
24. Onde a importância dos métodos HashCode () e Equals () reflete?
HashMap em Java usa métodos hashcode () e equals () para determinar o índice de pares de valor-chave. Esses dois métodos também serão usados ao obter valores com base nas teclas. Se esses dois métodos não forem implementados corretamente, duas chaves diferentes podem ter o mesmo valor de hash e, portanto, podem ser consideradas iguais pelo conjunto. Além disso, esses dois métodos também são usados para descobrir elementos duplicados. Portanto, a implementação desses dois métodos é crucial para a precisão e correção do hashmap.
25. Qual é a diferença entre hashmap e hashtable?
26. Qual é a diferença entre uma matriz (matriz) e uma lista (Arraylist)? Quando devo usar o Array em vez de Arraylist?
Os seguintes lista as diferenças entre o Array e o Arraylist:
27. Qual é a diferença entre ArrayList e LinkedList?
As interfaces da lista de implementação do ArrayList e do LinkedList e têm as seguintes diferenças:
A ArrayList é uma interface de dados baseada em índice e sua camada subjacente é uma matriz. Permite acesso aleatório a elementos com complexidade do tempo O (1). Da mesma forma, o LinkedList armazena seus dados na forma de uma lista de elementos, cada elemento está vinculado aos seus elementos anteriores e seguintes. Nesse caso, a complexidade do tempo de encontrar um elemento é O (n).
Comparado ao ArrayList, a inserção, a adição e a exclusão do LinkedList é mais rápida porque, quando os elementos são adicionados a qualquer posição na coleção, não há necessidade de recalcular o tamanho ou atualizar o índice como uma matriz.
O LinkedList ocupa mais memória do que o ArrayList porque o LinkedList armazena duas referências para cada nó, um apontando para o elemento anterior e um apontando para o próximo elemento.
Você também pode se referir ao ArrayList vs. LinkedList.
28. O que as interfaces comparáveis e comparador fazem? Liste suas diferenças.
O Java fornece uma interface comparável que contém apenas um método compareto (). Este método pode classificar dois objetos. Especificamente, ele retorna um número negativo, 0 e um número positivo para indicar que o objeto de entrada é menor que, igual a e maior que o objeto já existente.
O Java fornece uma interface comparadora que inclui dois métodos: compare () e iguals (). O método compare () é usado para classificar dois parâmetros de entrada, retornando um número negativo, 0, e um número positivo indica que o primeiro parâmetro é menor que, igual a e maior que o segundo parâmetro. O método iguals () requer um objeto como um parâmetro, usado para determinar se o parâmetro de entrada é igual ao comparador. Esse método retorna verdadeiro somente quando o parâmetro de entrada também é um comparador e o parâmetro de entrada e o resultado atual de classificação do comparador são os mesmos.
29. O que é uma fila de prioridade Java?
O PriorityQueue é uma fila ilimitada com base na pilha de prioridade e seus elementos são classificados em ordem natural. Quando criado, podemos fornecer um comparador responsável pela classificação de elementos. O PriorityQueue não permite valores nulos porque eles não têm ordem natural ou não possuem comparadores associados. Finalmente, o PriorityQueue não é seguro para roscas, e a complexidade do tempo de entrada e despedimento é O (log (n)).
30. Você entende o grande símbolo O (notação big-o)? Você pode dar exemplos de diferentes estruturas de dados?
O grande símbolo O descreve o quão boa a escala ou o desempenho do algoritmo está no pior cenário quando os elementos da estrutura de dados aumentam.
Grandes símbolos O também podem ser usados para descrever outros comportamentos, como o consumo de memória. Como as classes de coleta são na verdade estruturas de dados, geralmente usamos grandes símbolos para escolher a melhor implementação com base no tempo, memória e desempenho. Grandes símbolos O podem fornecer uma boa explicação do desempenho de grandes quantidades de dados.
31. Como trocar se o uso não ordenado ou uma matriz ordenada?
A maior vantagem de uma matriz ordenada é que a complexidade do tempo da pesquisa é O (log n), enquanto a matriz não ordenada é O (n). A desvantagem das matrizes ordenadas é que a complexidade do tempo da operação de inserção é O (n), porque elementos com grandes valores precisam ser movidos para trás para abrir espaço para o novo elemento. Por outro lado, a complexidade do tempo de inserção de uma matriz não ordenada é a constante O (1).
32. Quais são as melhores práticas para estruturas de classe de coleção Java?
Selecionar corretamente o tipo de coleção a ser usado de acordo com as necessidades do aplicativo é muito importante para o desempenho. Por exemplo: se o tamanho do elemento for corrigido e puder ser conhecido com antecedência, devemos usar a matriz em vez de ArrayList.
Algumas classes de coleta permitem especificar a capacidade inicial. Portanto, se pudermos estimar o número de elementos armazenados, podemos definir a capacidade inicial para evitar recalcular o valor do hash ou expandi -lo.
Para segurança, legibilidade e robustez, os genéricos são sempre usados. Ao mesmo tempo, o uso de genéricos também pode evitar o ClassCastException no tempo de execução.
O uso da classe imutável fornecida pelo JDK como a chave do mapa pode evitar a implementação dos métodos HashCode () e Equals () para nossas próprias classes.
As interfaces são melhores que a implementação ao programar.
Quando a coleção subjacente estiver realmente vazia, retorne um conjunto ou matriz com o comprimento 0 e não retorne nulo.
33. Quais são as diferenças entre a interface de enumeração e a interface do iterador?
A enumeração é duas vezes mais rápida que o iterador, enquanto consome menos memória. No entanto, o iterador é muito mais seguro que a enumeração, porque outros threads não podem modificar os objetos na coleção que está sendo atravessada pelo iterador. Ao mesmo tempo, o iterador permite que o chamador exclua elementos na coleção subjacente, o que é impossível para a enumeração.
34. Qual é a diferença entre Hashset e Treeset?
O hashset é implementado por uma tabela de hash, para que seus elementos não sejam ordenados. A complexidade do tempo dos métodos add (), remover () e contém () é O (1).
Por outro lado, o TreeSet é implementado por uma estrutura em forma de árvore, e os elementos dentro dele são ordenados. Portanto, a complexidade do tempo dos métodos add (), remover () e contém () é O (logn).
Coletores de lixo
35. Qual é o objetivo da coleção de lixo em Java? Quando o lixo será coletado?
O objetivo da coleta de lixo é identificar e descartar objetos que o aplicativo não usa mais para libertar e reutilizar recursos.
36. O que o System.GC () e RunTime.GC () farão?
Esses dois métodos são usados para solicitar a JVM a executar a coleta de lixo. No entanto, iniciar imediatamente ou atrasar a coleta de lixo depende da JVM.
37. Quando o método finalize () é chamado? Qual é o propósito dos destruidores?
Antes de liberar a memória ocupada pelo objeto, o coletor de lixo chama o método finalize () do objeto. Geralmente é recomendável liberar recursos mantidos por objetos neste método.
38. Se a referência do objeto for definida, o coletor de lixo liberará imediatamente a memória ocupada pelo objeto?
Não, esse objeto será reciclável no próximo ciclo de coleta de lixo.
39. Como é a estrutura da pilha Java? O que é o espaço de gen na pilha?
A pilha da JVM é a área de dados de tempo de execução, e todas as instâncias e matrizes de classes são alocadas na memória na pilha. É criado quando a JVM é iniciada. A memória da pilha ocupada pelo objeto é coletada pelo sistema de gerenciamento automático de memória, ou seja, o coletor de lixo.
A memória da pilha é composta por objetos que sobrevivem e morrem. Os objetos sobreviventes são acessíveis ao aplicativo e não serão coletados de lixo. O objeto morto é um objeto que não é acessível ao aplicativo e não foi reciclado pelo coletor de lixo. Eles ocuparão o espaço de memória de heap até que o coletor de lixo recupere esses objetos.
40. Qual é a diferença entre um coletor em série e coletor de rendimento?
Os coletores de taxa de transferência usam versões paralelas da próxima geração de coletores de lixo, que são usados para aplicações com dados de tamanho médio e em larga escala. Os coletores em série são suficientes para a maioria das aplicações pequenas (precisam de cerca de 100m de memória nos processadores modernos).
41. Em Java, quando os objetos podem ser coletados de lixo?
Quando um objeto se torna inacessível para o aplicativo atualmente usando esse objeto, o objeto pode ser reciclado.
42. A coleta de lixo ocorrerá na geração permanente de JVM?
A coleta de lixo não ocorrerá na geração permanente. Se a geração permanente estiver cheia ou exceder o valor crítico, ela acionará a coleta completa do lixo (GC completo). Se você verificar cuidadosamente as informações de saída do coletor de lixo, descobrirá que a geração permanente também será reciclada. É por isso que o tamanho correto da geração permanente é muito importante para evitar o GC completo. Consulte Java 8: da geração permanente para a área de metadados
(Nota do tradutor: a geração permanente foi removida em Java 8, e uma nova área de memória nativa chamada área de metadados foi adicionada)
O exposto acima é uma compilação das informações para perguntas da entrevista em Java. Continuaremos a adicionar informações relevantes no futuro. Obrigado pelo seu apoio a este site!