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.
- 你说一下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.
- 懒汉模式跟饿汉模式有什么区别?
Pode ser obtido emTempo de inicialização de objetos, segurança de thread e utilização de recursosCompare em outros aspectos:
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.
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.
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.
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.
- 说一下事务的几种特性?
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)
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.
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.
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.
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.
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.
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.
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:
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).
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.
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).
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.
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.
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);.
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的生命周期吧。
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.
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.
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.
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,通过