JavaRush /Blogue Java /Random-PT /Análise de perguntas e respostas de entrevistas para dese...

Análise de perguntas e respostas de entrevistas para desenvolvedor Java. Parte 1

Publicado no grupo Random-PT
Olá! Várias pessoas se reuniram no JavaRush. Alguns de nós querem apenas se tornar desenvolvedores Java, investindo muito tempo e esforço no desenvolvimento, enquanto outros já são desenvolvedores Java. Em um caso ou outro, você precisa estar preparado para testes - entrevistas técnicas. Essa prova não é fácil e, além da preparação moral, também é necessária preparação técnica. Análise de perguntas e respostas da entrevista.  Parte 1 - 1Recentemente me deparei com uma grande lista de perguntas da entrevista com desenvolvedores Java no dou. Essas questões são divididas em diferentes níveis – Júnior, Médio e Sênior. Não se assuste: nem todas as perguntas são fáceis, mas as que têm um asterisco raramente são feitas. As perguntas são boas, mas gostaria de tentar responder à maioria delas. É claro que não vou entrar no escopo de um artigo, afinal há muitas perguntas aí. Portanto, esta será uma série de artigos respondendo a essas questões. Deixe-me enfatizar imediatamente alguns pontos:
  1. Há um excelente artigo com as principais perguntas e respostas para eles. Algumas questões se sobrepõem à lista apresentada acima (250+), portanto essas questões serão ignoradas para não duplicar informações mais uma vez.

  2. As perguntas são apresentadas em ucraniano, mas como a maioria dos participantes do JavaRush fala russo (e em grande parte eu também), as respostas serão em russo.

  3. As respostas serão breves, pois se você escrever detalhadamente, as respostas a algumas perguntas poderão exigir um artigo separado. E durante as entrevistas não são necessárias respostas tão detalhadas e volumosas, porque o seu entrevistador só tem uma hora para entrevistá-lo sobre os temas necessários (e, como você lembra, isso é o suficiente). Para quem gosta de se aprofundar, deixarei links.

Então, vamos começar.

Perguntas e respostas de nível júnior

Análise de perguntas e respostas da entrevista.  Parte 1 - 2

Problemas gerais

1. Quais padrões de design você conhece? Conte-nos sobre os dois modelos que você usou em seu trabalho.

Há uma grande variedade de modelos: você pode começar a conhecê-los neste e neste artigo. Pois bem, para quem deseja se familiarizar com eles detalhadamente, recomendo a leitura do livro “De Cabeça. Padrões de design" . Com sua ajuda, você pode estudar detalhadamente e de maneira fácil os padrões de design mais básicos. Quando se trata de padrões de design que você pode usar como exemplo em uma entrevista, alguns que vêm à mente são:
  • Builder é um modelo usado com frequência, uma alternativa à criação clássica de objetos;
  • Padrão de estratégia , que representa inerentemente o polimorfismo. Ou seja, temos uma interface, mas o comportamento do programa mudará dependendo de qual implementação específica dessa interface foi transferida para a funcionalidade (agora a estratégia é praticamente usada em todos os lugares em aplicações Java).
Se isso não for suficiente para você, preste atenção no Spring (se você já estiver familiarizado com ele), pois é toda uma plataforma de frameworks, que por sua vez estão repletos de padrões para cima e para baixo. Aqui estão alguns exemplos do que estou falando:
  • Factory - no ApplicationContext (ou no BeanFactory);
  • Singleton - todos os beans são singletons por padrão;
  • Proxy - essencialmente tudo no Spring usa esse padrão de uma forma ou de outra, por exemplo, AOP;
  • Cadeia de responsabilidade é um padrão baseado no conceito de funcionamento do Spring Security;
  • Modelo - usado no Spring Jdbc.

Núcleo Java

Análise de perguntas e respostas da entrevista.  Parte 1 - 3

2. Quais tipos de dados existem em Java?

Java possui tipos de dados primitivos:
  • byte — inteiros no intervalo de -128 a 127, pesa 1 byte;
  • short — números inteiros no intervalo de -32768 a 32767, pesa 2 bytes;
  • int — números inteiros -2147483648 a 2147483647, pesa 4 bytes;
  • longo — números inteiros no intervalo 9223372036854775808 a 9223372036854775807, pesa 8 bytes;
  • float — números de ponto flutuante no intervalo -3,4E+38 a 3,4E+38, pesa 4 bytes;
  • double — números de ponto flutuante no intervalo -1,7E+308 a 1,7E+308, pesa 8 bytes;
  • char — caracteres únicos em UTF-16, pesa 2 bytes;
  • valores booleanos true/false , pesa 1 byte.
E referencie tipos de dados , que apontam para objetos no heap.

3. Como um objeto difere dos tipos de dados primitivos?

A primeira diferença: a quantidade de memória ocupada: os primitivos ocupam muito pouco, porque contêm apenas seu próprio valor, enquanto os objetos podem conter muitos, muitos valores diferentes: tanto primitivos quanto referências a outros objetos. A segunda diferença: Java é uma linguagem orientada a objetos, então tudo nela funciona através da interação entre objetos, e as primitivas não se encaixam muito bem (na verdade, é por isso que Java não é uma linguagem 100% orientada a objetos). Terceiro, na sequência do segundo: como Java está focado na interação entre objetos, esses objetos possuem muitos mecanismos diferentes para gerenciá-los. Por exemplo, construtores, métodos, exceções (que operam principalmente em objetos), etc. Na verdade, para que os primitivos pudessem de alguma forma se envolver (trabalhar) neste ambiente orientado a objetos, foram inventados wrappers para tipos primitivos ( Integer , Character , Double , Boolean ...)

4. Qual a diferença entre passar parâmetros por referência e por valor?

Os campos primitivos armazenam seu valor: por exemplo, se definirmos int i = 9; campo i armazena o valor 9 . Quando temos uma referência a um objeto, significa que temos um campo com uma referência ao objeto, ou seja, com o valor do endereço do objeto na memória.
Cat cat = new Cat();
Acontece que os campos com referência a um objeto também armazenam valores , valores de endereço de memória. Ou seja, cat armazena o valor do endereço do novo objeto Cat() na memória. Quando passamos um parâmetro para um método, seu valor é copiado. No caso de uma primitiva, o valor da primitiva será copiado. Assim, o método funcionará com uma cópia, cuja alteração não afetará o original. No caso de um tipo de referência, será copiado o valor do endereço de memória, respectivamente, o endereço será igual ao objeto para o qual aponta. E se mudarmos o objeto usando esse novo link, ele será trocado pelo antigo (afinal ambos apontam para o mesmo objeto).

5. O que é JVM, JDK, JRE?

JVM - Java Virtual Machine é uma máquina virtual que executa bytecode Java pré-gerado pelo compilador. JRE - Java Runtime Environment - é essencialmente um ambiente para execução de aplicações java, que contém JVM , bibliotecas padrão e outros componentes para execução de applets e aplicações escritas na linguagem de programação Java. Em outras palavras , o JRE é um pacote com tudo o que é necessário para executar um programa Java compilado, mas não contém ferramentas e utilitários como compiladores ou depuradores para desenvolvimento de aplicativos. JDK - Java Development Kit - um conjunto estendido de JRE , ou seja, um ambiente não apenas para lançamento, mas também para desenvolvimento de aplicações Java. O JDK contém tudo o que está no JRE, além de várias ferramentas adicionais - compiladores e depuradores necessários para criar aplicativos em Java (também contém documentos Java).Análise de perguntas e respostas da entrevista.  Parte 1 - 4

6. Por que usar JVM?

Conforme mencionado acima, Java Virtual Machine é uma máquina virtual que executa bytecode Java pré-gerado pelo compilador. Ou seja, a JVM não entende o código-fonte Java. Portanto, primeiro são compilados os arquivos .java , que após a compilação já possuem uma extensão .class e que são apresentados na forma do mesmo código de bytes que a JVM entende. Cada SO possui sua própria JVM, portanto, ao receber os arquivos de bytecode, a JVM o executa, adaptando-o ao SO em que ocorre. Na verdade, devido às diferentes JVMs, as versões do JDK (ou JRE) diferem para diferentes sistemas operacionais (cada um deles requer sua própria JVM). Vamos lembrar como funciona o desenvolvimento em outras linguagens de programação. Você desenvolve um programa, então seu código é compilado em código de máquina para um sistema operacional específico e então você pode executá-lo. Em outras palavras, você precisa escrever versões diferentes do programa para cada sistema. Já em Java, graças ao processamento duplo de código (compilação e processamento de bytes de código JVM), você pode aproveitar os benefícios da plataforma cruzada. Certa vez, criamos o código, recompilamos em bytecode, transferimos para qualquer sistema operacional e a JVM local executa o código. Esta é a propriedade lendária do Java - escreva uma vez, execute em qualquer lugar . Análise de perguntas e respostas da entrevista.  Parte 1 - 5Leia mais sobre isso no artigo “ Compilando e executando aplicações Java nos bastidores ”.

7. O que é bytecode?

Como disse acima, o compilador converte o código Java em bytecode intermediário (arquivos com extensão .java em arquivos com extensão .class). O bytecode é em muitos aspectos semelhante ao código de máquina, mas usa um conjunto de instruções não de um processador real, mas de um virtual. Além disso, pode incluir seções focadas na utilização de um compilador JIT, que otimiza a execução de comandos para o processador real no qual o programa está sendo executado. A compilação JIT, também chamada de compilação on-the-fly, é uma tecnologia que aumenta o desempenho de um programa usando bytecode, compilando o bytecode em uma máquina ou outro formato enquanto o programa está em execução. Como você deve ter adivinhado, a JVM usa um compilador JIT quando executa bytecode. Vamos dar uma olhada em um exemplo de bytecode: Análise de perguntas e respostas da entrevista.  Parte 1 - 6Não é muito legível, não é? Bem, esta não é uma instrução para nós, mas para a JVM. Aqui está um artigo que o ajudará a entender melhor esse problema.

8. Quais são as características de um JavaBean?

JavaBeans é uma classe Java com certas regras. Aqui estão algumas regras para escrever um JavaBean :
  1. A classe deve conter um construtor de acesso público vazio (sem parâmetros) com o modificador de acesso público . Este construtor permite criar um objeto desta classe sem problemas desnecessários (para que não haja confusão desnecessária com parâmetros).

  2. Os campos internos de uma classe são acessados ​​através dos métodos get e set , que devem ser padrão. Por exemplo, se o campo for name , então getName e setName, etc. Isso, por sua vez, permite que várias ferramentas (frameworks) determinem e atualizem automaticamente o conteúdo dos beans sem complicações.

  3. A classe deve conter versões substituídas dos métodos equals() hashCode() e toString() .

  4. A classe deve ser serializável, ou seja, deve possuir uma interface marcadora - Serializable ou implementar a interface Externalizable . Isso é necessário para que o estado do bean possa ser salvo, armazenado e restaurado de forma confiável.

Análise de perguntas e respostas da entrevista.  Parte 1 - 7Você pode ler sobre os tipos de JavaBeans neste material .

9. O que é OutOfMemoryError?

OutOfMemoryError é um dos erros críticos de tempo de execução associados à operação da Java Virtual Machine (JVM). Chamado quando a JVM não consegue alocar um objeto porque não há memória suficiente disponível para ele e o coletor de lixo não consegue alocar mais memória. Alguns tipos de OutOfMemoryError :
  • OutOfMemoryError: espaço de heap Java - o objeto não pode ser alocado no heap Java devido à memória insuficiente. O erro pode ser causado por um vazamento de memória ou porque o tamanho de heap padrão não é grande o suficiente para o aplicativo atual.

  • OutOfMemoryError: Limite de sobrecarga do GC excedido - devido ao fato de que a quantidade de dados mal cabe no heap, o coletor de lixo é executado o tempo todo e o programa Java é executado muito lentamente e, como resultado, o limite de sobrecarga do coletor de lixo é excedido e o aplicativo trava com esse erro.

  • OutOfMemoryError: O tamanho da matriz solicitada excede o limite da VM - indica que o aplicativo tentou alocar memória para uma matriz maior que o tamanho do heap, o que novamente pode ser devido à alocação de memória padrão insuficiente.

  • OutOfMemoryError: Metaspace — o heap ficou sem espaço alocado para metadados (metadados são instruções para classes e métodos).

  • OutOfMemoryError: solicita bytes de tamanho por motivo. Fora do espaço de troca - ocorreu alguma falha ao tentar alocar memória do heap e, como resultado, houve falta de memória no heap.

10. O que é rastreamento de pilha? Como conseguir isso?

Um Stack Trace é uma lista de classes e métodos que foram chamados até este ponto no aplicativo. Você pode chamar um rastreamento de pilha em um ponto específico do aplicativo assim:
StackTraceElement[] stackTraceElements =Thread.currentThread().getStackTrace();
Dessa forma, obteremos uma matriz de elementos de rastreamento de pilha organizados na ordem LIFO - Last In First Out . Análise de perguntas e respostas da entrevista.  Parte 1 - 8Em Java, como regra, quando falamos sobre rastreamento de pilha, queremos dizer o rastreamento de pilha que é exibido no console quando ocorre um erro (ou exceção). Você pode obter o rastreamento de pilha de exceções como este:
StackTraceElement[] stackTraceElements;
try{
                ...
} catch (Exception e) {
   stackTraceElements = e.getStackTrace();
}
Bem, se estamos falando sobre a saída do rastreamento de pilha de exceções no console:
try{
                ...
} catch (Exception e) {
  e.printStackTrace();
}
Além disso, se tivermos um erro, uma exceção não verificada ou uma exceção verificada , que não processaremos, mas apenas encaminharemos, quando o aplicativo travar, receberemos automaticamente um rastreamento de pilha de exceções no console. Um pequeno exemplo de exceção de rastreamento de pilha no console: Análise de perguntas e respostas da entrevista.  Parte 1 - 9Você pode ler mais sobre Stack Trace aqui . Vamos nos concentrar neste assunto hoje...Análise de perguntas e respostas da entrevista.  Parte 1 - 10
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION