Compartilhamento de tecnologia

Experiência de primeira entrevista (estagiário de desenvolvimento java)

2024-07-08

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Perguntas do entrevistador

  • Gostaria de perguntar se você já fez algum projeto aqui?
  • Você poderia nos contar sobre os projetos em que trabalhou, qual pilha de tecnologia você usou e qual conteúdo você foi responsável pelo desenvolvimento? (Experiência de projeto)
  • Quais são os oito tipos básicos de dados? (Base)
  • Você pode me dizer se o tipo longo pode ser executado diretamente? A questão deveria ser se isso pode ser calculado diretamente. (Base)
  • Você entende o padrão singleton? Você pode falar sobre isso (Padrões de Design)
  • Qual é a diferença entre o modo preguiçoso e o modo faminto?
  • Quais são as características das transações? (transação)
  • Conte-me sobre alguma exceção que você encontrou ao trabalhar em projetos? (anormal)
  • Vamos falar sobre as três categorias de tempo comumente usadas? (Base)
  • Fale sobre três métodos de calendário?
  • Vamos falar sobre o ciclo de vida da sessão. (sessão)
  • Você já encontrou perda de precisão de ponto flutuante enquanto trabalhava em um projeto? Como você resolveu isso?
  • Então temos um cálculo usando ponto flutuante. Qual tipo de dados você escolheria para calcular?
  • Você pode me dizer algumas anotações comumente usadas? Primavera? Ou alguma outra coisa?
  • Você sabe sobre tópicos?
    • Qual é a diferença entre thread e processo?
  • Então me diga o que é segurança de thread?
  • Diga-me a diferença entre == e igual?
  • Então você já usou Linux? Você pode falar brevemente sobre alguns comandos comumente usados?

problema resolvido

- 我想问一下你这边有做过什么项目吗?

Acho que você pode escolher apenas um ou dois projetos relativamente proficientes para falar.

- 你方便讲一下你做过的那些项目吗,用了什么技术栈,包括你负责开发的内容是什么?

Escolha o projeto mais familiar para falar.

- 八大基本数据类型是什么?

byte, curto, int, longo, flutuante, duplo, char, booleano

- 你说一下long类型能直接运转吗(Acho que estou perguntando se dados de tipo longo podem ser operados diretamente)

Os dados do tipo longo podem ser operados diretamente. Quando você mistura valores do tipo int e longo em uma expressão, o valor do tipo int será automaticamente promovido para o tipo longo para garantir que o resultado de toda a expressão seja do tipo longo.

- 你了解单例模式吗?你可以讲一下吗

Singleton Pattern é um padrão de design de software comumente usado. Seu objetivo é garantir que uma classe tenha apenas uma instância e fornecer um ponto de acesso global para obter essa instância exclusiva. Esse padrão é útil quando você precisa controlar o acesso a recursos ou quando a instanciação de objetos exige muitos recursos ou consome muito tempo e apenas um desses recursos ou instâncias é necessário globalmente. Os métodos comuns de implementação do modo singleton incluem principalmente: modo preguiçoso e modo faminto.

- 懒汉模式跟饿汉模式有什么区别?

  1. Pode ser obtido emTempo de inicialização de objetos, segurança de thread e utilização de recursosCompare em outros aspectos:

      1. Tempo de inicialização
      • modo preguiçoso: O modo preguiçoso é um延迟加载 padrão único.É caracterizado por第一次使用时创建实例对象 , em vez de criá-lo quando a classe for carregada.Este padrão evita a necessidade de objetos de instância quando资源浪费, criado apenas quando necessário.
      • Modo faminto: O modo homem faminto é uma espécie de在类加载时就创建实例 padrão único. Sua característica é que o objeto instância é criado quando a classe é carregada, independente de ser utilizada.Este método garante que o mesmo objeto de instância possa ser obtido em qualquer circunstância, mas pode causar alguns性能和资源上的浪费, especialmente em alguns casos o objeto de instância não é usado.
      1. segurança do fio
      • modo preguiçoso: O próprio modo preguiçoso é非线程安全的 , porque existe a possibilidade de vários threads chamarem o método getInstance() ao mesmo tempo e inserirem a instrução de julgamento ao mesmo tempo, resultando na criação de várias instâncias.Para obter segurança de thread, você pode usar o método getInstance()添加synchronized关键字 , mas isso trará sobrecarga de desempenho. Além disso, você também pode usar o bloqueio de verificação dupla (bloqueio de verificação dupla) e outros métodos para reduzir a sobrecarga de sincronização.
      • Modo faminto: O modo com fome é线程安全Sim, como o objeto de instância foi criado quando a classe é carregada, não há problema de competição em um ambiente multithread.
      1. Utilização e desempenho de recursos
      • modo preguiçoso : o modo lento pode economizar recursos porque evita o desperdício de recursos quando os objetos de instância não são necessários. Entretanto, como ele precisa ser inicializado na primeira vez em que for usado, o desempenho poderá ser afetado se o processo de inicialização for complexo ou demorar muito.
      • Modo faminto : o modo faminto pode não ser tão flexível quanto o modo preguiçoso em termos de utilização de recursos, porque ele cria objetos de instância independentemente de serem usados. Porém, como o objeto de instância já foi criado quando a classe é carregada, ele é mais rápido na primeira chamada porque não é necessária inicialização.
  2. Cena aplicável

    • modo preguiçoso: Aplicável aUm cenário em que o objeto é criado apenas quando é usado pela primeira vez e não há requisitos complexos de segurança de thread durante o processo de inicialização do objeto de instância. . Por exemplo,gerenciador de arquivosEste é um exemplo típico, porque talvez você não precise ler e gravar arquivos imediatamente quando o aplicativo é iniciado, mas apenas executar operações relacionadas quando necessário.
    • Modo faminto : Adequado para recursos que precisam ser inicializados quando o programa é iniciado e são usados ​​durante todo o ciclo de vida do aplicativo. Por exemplo, um logger é um bom candidato para o Hungry Pattern porque a funcionalidade de registro geralmente precisa estar pronta no início do aplicativo e registrar mensagens durante todo o tempo de execução do aplicativo.
    • Em resumo, o modo do homem preguiçoso e o modo do homem faminto têm, cada um, suas próprias vantagens e desvantagens e, em aplicações práticas, devem ser considerados de forma abrangente e projetados de acordo com cenários específicos.

- 说一下事务的几种特性?

  1. As transações têm quatro características básicas, também chamadas deÁCIDOOs recursos incluem especificamente:
    • Atomicidade : Atomicidade significa que todas as operações em uma transação são concluídas ou não executadas. Elas são uma unidade de trabalho indivisível. Caso ocorra algum erro ou falha durante a execução da transação, as operações realizadas serão desfeitas (revertidas) e toda a transação será como uma operação que nunca aconteceu. Esse recurso garante integridade e consistência da transação.
    • Consistência : Consistência significa que uma transação deve transformar o banco de dados de um estado de consistência para outro estado de consistência. Antes do início e após o término da transação, as restrições de integridade do banco de dados (como restrições de chave primária, restrições de chave estrangeira, etc.) não são destruídas e todos os dados mantêm consistência lógica. Se a integridade do banco de dados for comprometida durante a execução de uma transação, a transação será abortada e as operações executadas serão revertidas.
    • Isolamento : Isolamento significa que quando várias transações são executadas simultaneamente, cada transação é isolada uma da outra e a execução de uma transação não pode ser interferida por outras transações. O sistema de banco de dados fornece um certo nível de isolamento para que as transações executadas simultaneamente não interfiram entre si, garantindo assim a correção e consistência dos dados. O isolamento geralmente é obtido por meio de mecanismos como bloqueios (como bloqueios de linha, bloqueios de tabela, etc.) ou controle de simultaneidade multiversão (MVCC).
    • Durabilidade : Durabilidade, também chamada de permanência, significa que uma vez que uma transação é confirmada, suas modificações no banco de dados são permanentes e não serão perdidas mesmo se o sistema falhar. O sistema de banco de dados garante a durabilidade das transações por meio de logs e mecanismos de recuperação. Mesmo que ocorra uma falha no sistema, o sistema pode recuperar as modificações no banco de dados por meio de transações confirmadas por meio de logs.

- 说一下你在做项目的过程中都遇到过哪些异常吗?(Basta listar alguns)

  1. Exceções de código
    • Null Pointer Exception : lançado ao tentar acessar ou operar um objeto não inicializado. É comum esquecer de verificar se o objeto é nulo e utilizá-lo diretamente.
    • Exceção de matriz fora dos limites (ArrayIndexOutOfBoundsException): Um índice inválido foi usado ao acessar o array (o índice é menor que 0 ou maior ou igual ao tamanho do array).
    • Exceção de conversão de tipo (ClassCastException): durante a conversão, o objeto que está sendo convertido não é uma instância do tipo de destino ou de sua subclasse.
    • ArithmeticException // por zero: Ao realizar a operação de divisão, o divisor é zero.
  2. Exceções de dados
    • Erro de formato de dados: por exemplo, ao analisar dados JSON ou XML, o formato dos dados não atende às expectativas.
    • Exceção de integridade de dados: se uma restrição de chave estrangeira no banco de dados falhar, as regras de integridade de dados serão violadas ao tentar inserir ou atualizar dados.
    • Exceção de dados não encontrados: Se os dados correspondentes não forem encontrados de acordo com as condições fornecidas ao consultar o banco de dados.
  3. Exceções de rede
    • Tempo limite de conexão (ConnectTimeoutException): ao tentar estabelecer uma conexão de rede, a solicitação de conexão expirou enquanto aguardava uma resposta.
    • Tempo limite de leitura (SocketTimeoutException): A operação expirou durante a leitura de dados da conexão.
    • A rede está inacessível (UnknownHostException):não pode resolver o nome do host.
    • Conexão recusada (ConnectionRefusedError): a máquina de destino recusou a solicitação de conexão.
  4. Exceções de recursos do sistema
    • Estouro de memória (OutOfMemoryError): a JVM não tinha espaço de memória suficiente disponível ao tentar alocar memória.
    • O arquivo não existe (FileNotFoundException): o arquivo ou diretório que você está tentando acessar não existe.
    • Permissões insuficientes (SecurityException/AccessDeniedException): Permissões insuficientes para realizar uma operação, como leitura e gravação de arquivos, acesso a recursos de rede, etc.
  5. Exceções de serviços de terceiros
    • O serviço não está disponível (ServiceUnavailableException): o serviço de terceiros dependente está temporariamente indisponível.
    • Limite da API (RateLimitException): a solicitação à API de terceiros excede seu limite (como limite de frequência de solicitação).
    • Falha na autenticação (AuthenticationException): ao acessar serviços de terceiros, as informações de autenticação são inválidas ou expiraram.
  6. Exceções Lógicas
    • Erro de lógica de negócios: Por exemplo, o valor do pedido foi calculado incorretamente, o estoque é insuficiente, mas o pedido ainda está processado, etc.
    • Status inconsistente: Um determinado estado do sistema é inconsistente com as expectativas, resultando na impossibilidade de operações subsequentes.

- 说一下时间常用的三个类?

LocalDate, LocalTime, LocalDateTime. (Basta listar quaisquer três)

  • Em Java, as classes comumente usadas para tempo de processamento são classes nos três pacotes java.util.Date, java.util.Calendar e java.time introduzidos no Java 8 (comoData local, hora local, data e hora localespere)

- 说一下日历的三个方法?

Quando se trata de operações relacionadas ao calendário, geralmente pensamos na classe java.util.Calendar, porque é uma classe abstrata que fornece métodos para operar campos de calendário (como ano, mês, dia, hora, etc.).A partir do Java 8, uma nova API de data e hora (localizada no pacote java.time) foi introduzida, fornecendo melhores capacidades de processamento de data e hora.

  • Introdução aos métodos comuns de LocalDateTime:
      1. Criar objeto LocalDateTime
      • now(): Cria um objeto LocalDateTime representando a data e hora atuais.
      • of(): Cria um objeto LocalDateTime com ano, mês, dia, hora, minuto, segundo especificados (e nanossegundos opcionais). Por exemplo: LocalDateTime.of(2023, Mês.JANEIRO, 1, 12, 0, 0).
      1. Obtenha as propriedades do objeto LocalDateTime
      • getYear(), getMonth(), getDayOfMonth(), getHour(), getMinute(), getSecond(), etc.: usados ​​para obter os atributos ano, mês, dia, hora, minuto e segundo no objeto LocalDateTime respectivamente.
      1. Modifique as propriedades do objeto LocalDateTime
      • withYear(), withMonth(), withDayOfMonth(), withHour(), withMinute(), withSecond(), etc.: Defina uma propriedade do objeto LocalDateTime para o valor especificado e retorne um novo objeto LocalDateTime. . variável (porque LocalDateTime é imutável).
      1. Adição e subtração de data e hora
      • plusYears(), plusMonths(), plusDays(), plusHours(), plusMinutes(), plusSeconds(), etc.: Adicione o período de tempo especificado ao objeto LocalDateTime e retorne um novo objeto LocalDateTime. minusYears(), minusMonths(), minusDays(), minusHours(), minusMinutes(), minusSeconds(), etc.: subtraia o período de tempo especificado do objeto LocalDateTime e retorne um novo objeto LocalDateTime.
      1. Comparar objetos LocalDateTime
      • isBefore(LocalDateTime other): Determine se o objeto atual é anterior ao objeto LocalDateTime especificado.
      • isAfter (LocalDateTime other): Determine se o objeto atual é posterior ao objeto LocalDateTime especificado.
      1. Formatar objeto LocalDateTime
      • format(DateTimeFormatter formatador): Formate o objeto LocalDateTime em uma string no formato de data e hora especificado. Por exemplo: Formatador DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); String formattedDateTime = dateTime.format(formatter);.
      1. Calcular a diferença horária
      • Embora LocalDateTime em si não forneça um método para calcular diretamente a diferença de horário, você pode usar a classe Duration ou a classe ChronoUnit para calcular a diferença de horário entre dois objetos LocalDateTime.
      • Use a classe Duration: Duration duration = Duration.between(start, end); e então você pode obter o valor específico da diferença de horário, como segundos, milissegundos, etc., por meio do objeto de duração.
      • Usando a classe ChronoUnit: você pode especificar a unidade para calcular a diferença horária, como ano, mês, dia, hora, etc. Por exemplo: dias longos = ChronoUnit.DAYS.between(início, fim);.

- 说一下session的生命周期吧。

  1. Criação de sessão
    • Hora de criação:Session é usado quando o usuário acessa o servidor pela primeira vez e solicita JSP, Servlet, etc.动态资源 criado quando.Acesse apenas HTML, imagens, etc.静态资源 Isso não acionará a criação da Sessão. Se necessário, você pode forçar a geração da sessão chamando request.getSession(true).
    • local de armazenamento: A sessão é armazenada no lado do servidor, geralmente na memória do servidor para acesso rápido.
  2. Manutenção de sessão
    • Atualizar o horário do último acesso: Enquanto o usuário continuar acessando o servidor, o servidor atualizará o horário do último acesso da Sessão e manterá a Sessão para cada solicitação, independentemente de ler ou gravar a Sessão. Isso indica que a sessão do usuário está em estado "ativo".
    • singularidade da sessão : Cada usuário terá uma Sessão independente, identificada exclusivamente pelo ID da Sessão. O ID da sessão geralmente é enviado ao cliente através de um cookie (denominado JSESSIONID) para que o servidor possa identificar diferentes sessões do usuário.
  3. Destruição de sessão
    • Destruir automaticamente : Quando o ciclo de vida da sessão expira (ou seja, não há atividade por um longo período), o servidor a limpará automaticamente da memória. Esse tempo geralmente é configurável e o padrão é 30 minutos no Tomcat.
    • Destruição manual : os desenvolvedores podem destruir manualmente a sessão chamando o método invalidate() da sessão. Isso geralmente é usado para cenários como logout e tempo limite.
  4. Configurações do ciclo de vida da sessão
    • Definido no Servlet: Defina o tempo limite da sessão em segundos chamando o método session.setMaxInactiveInterval(int interval).
    • Definido em web.xml: No arquivo web.xml do aplicativo web,通过