Este artigo organiza principalmente perguntas comuns da entrevista em Java para sua referência. O conteúdo específico é o seguinte
1. A diferença entre dormir e esperar em java
① Esses dois métodos vêm de diferentes classes, o sono vem da aula de threads e a espera vem da classe de objeto.
O sono é um método de classe estática de thread. Quem o chama vai dormir. Mesmo que o método de sono de B seja chamado no thread A, ele ainda vai dormir. Para fazer o Thread B dormir, você deve ligar para o sono no código de b.
② Lock: o mais importante é que o método do sono não libera o bloqueio, enquanto o método de espera libera o bloqueio, para que outros threads possam usar blocos ou métodos de controle síncrono.
O sono não transfere recursos do sistema; Espere é inserir o pool de espera do tópico para esperar, transferir recursos do sistema e outros threads podem ocupar a CPU. Geralmente, a espera não adicionará um limite de tempo, porque se o thread de espera for executado em recursos insuficientes, será inútil sair novamente. Você deve esperar que outros threads chamem o Notify/NotifyAll para acordar todos os threads no pool de espera antes de entrar na fila pronta e aguardar o sistema operacional alocar recursos do sistema. O sono (milissegundos) pode ser especificado para acordá -lo automaticamente. Se o tempo for menor que o tempo, você só poderá ligar para interromp () para forçar a interrupção.
A função do Thread.Sleep (0) é "acionar o sistema operacional para recompicar a CPU mais uma vez".
③ Escopo de uso: aguarde, notificar e notificar todos os métodos de controle de sincronização ou blocos de controle de sincronização, enquanto o sono pode ser usado em qualquer lugar.
sincronizado (x) {x.notify () // ou wait ()}2. A diferença entre hashmap e hashtable em java
① Razões históricas: a hashtable é dada à antiga classe dictonary. Hashmap é uma implementação da interface do mapa introduzida pelo Java 1.2.
② Hashmap permite pares de valor-chave vazios, enquanto a hashtable não
③ Sincronização de hashtable, enquanto o hashmap assíncrono é mais eficiente do que a hashtable
3. Descreva brevemente a diferença entre arremesso e arremessos em exceções
① O arremesso representa uma ação, o que significa que uma exceção é lançada; Os arremessos representam um estado, o que significa que o método pode ter uma exceção lançada ② arremesso é usado na implementação do método, enquanto os arremessos são usados na declaração de método ③ O arremesso só pode ser usado para lançar uma exceção, enquanto os lances podem lançar várias exceções
4. A diferença entre transbordamento de memória e vazamento de memória
O transbordamento de memória fora da memória refere -se ao fato de que, quando um programa se aplica à memória, não há espaço de memória suficiente para ele usar e a memória aparece; Por exemplo, se um número inteiro for aplicado, mas pode economizar muito tempo, será o excesso de memória.
Vazamento de memória vazamento de memória refere -se à incapacidade do programa de liberar o espaço de memória que foi solicitado após a solicitação de memória. O dano de um vazamento de memória pode ser ignorado, mas as consequências do acúmulo de vazamentos de memória são muito graves. Não importa quanta memória seja, ela será ocupada mais cedo ou mais tarde.
O vazamento de memória acabará por levar a fora da memória!
O excesso de memória significa que a memória necessária para alocar excede o que o sistema pode fornecer e o sistema não pode atender às necessidades, portanto ocorre um estouro.
Os vazamentos de memória são quando você se aplica ao sistema para alocar memória para uso (novo), mas após o uso, ele não retorna (excluir). Como resultado, você não pode mais acessar a memória que solicitou (talvez tenha perdido o endereço), e o sistema não pode alocá -lo ao programa necessário novamente. Se você usar todos os métodos para preencher uma placa, só poderá conter 4 frutas. Se você preencher 5, você cairá no chão e não poderá comê -lo. Isso está transbordante! Por exemplo, se a pilha estiver cheia, ele inevitavelmente causará transbordamento de espaço quando a pilha estiver cheia, o que é chamado de transbordamento. Se a pilha estiver vazia, também causará um excesso de espaço quando a pilha estiver vazia, o que é chamado de subfluxo. Isso significa que a memória alocada não é suficiente para abaixar a sequência de itens de dados, que é chamada de transbordamento de memória.
Classificação da maneira que ocorre, os vazamentos de memória podem ser divididos em 4 categorias:
① vazamentos de memória frequentes. O código que ocorre com um vazamento de memória será executado várias vezes e, cada vez que for executado, fará com que um pedaço de memória vaze.
② Vazamento ocasional de memória. O código que ocorre com vazamentos de memória ocorrerá apenas em determinados ambientes ou operações específicas. Regulares e ocasionais são relativos. Para um ambiente específico, a ocasião pode se tornar frequente. Portanto, o ambiente de teste e os métodos de teste são cruciais para detectar vazamentos de memória.
③ Vazamento de memória único. O código que ocorre com um vazamento de memória será executado apenas uma vez, ou devido a defeitos algorítmicos, sempre haverá apenas uma peça de vazamento de memória. Por exemplo, a memória é alocada no construtor da classe, mas a memória não é liberada no destruidor, portanto os vazamentos de memória acontecem apenas uma vez.
④ Vazamento implícito de memória. O programa aloca continuamente a memória durante a operação, mas não libera a memória até que seja concluído. Estritamente falando, não há vazamento de memória aqui porque o programa finalmente libera toda a memória solicitada. Mas para um programa de servidor, leva vários dias, semanas ou até meses para ser executado, e não liberar memória no tempo também pode levar ao final de esgotar toda a memória no sistema. Portanto, chamamos esse tipo de vazamento de memória de vazamento implícito de memória.
Do ponto de vista dos usuários que usam programas, os próprios vazamentos de memória não causarão nenhum dano. Como usuário comum, você não pode sentir a existência de vazamentos de memória. O que é realmente prejudicial é o acúmulo de vazamentos de memória, que acabará por consumir toda a memória no sistema. Nessa perspectiva, os vazamentos de memória únicos não são prejudiciais porque não se acumulam, enquanto vazamentos implícitos de memória são muito prejudiciais porque são mais difíceis de detectar do que vazamentos de memória frequentes e ocasionais.
5. A diferença entre string, stringbuffer e stringbuilder
① Variável e imutável
A classe String usa uma matriz de caracteres para salvar strings, como segue: como existe um modificador "final", você pode saber que os objetos da string são imutáveis.
Valor de char final privado [];
Tanto o StringBuilder quanto o StringBuffer são herdados da classe AbstractStringBuilder. No AbstractStringBuilder, as matrizes de personagens são usadas para salvar strings. Como segue, pode -se observar que ambos os objetos são mutáveis.
Char [] valor;
② é multi-thread e seguro
Os objetos na string são imutáveis, para que possam ser entendidos como constantes, que são obviamente seguros de threads.
AbstractStringBuilder é uma classe pública de pais do StringBuilder e StringBuffer, que define algumas operações básicas de strings, como expansão de capacidade, anexar, inserir, indexOF e outros métodos públicos.
O StringBuffer possui um bloqueio de sincronização no método ou um bloqueio de sincronização no método chamado, para que seja seguro. Veja o seguinte código -fonte:
public sincronizado stringbuffer reverse () {super.Reverse (); devolver isso; } public int indexOf (string str) {return indexof (str, 0); // Existe um método público sincronizado INT (String str, int a partir de Index)} O StringBuilder não adiciona bloqueios de sincronização ao método, por isso não é segura.
③StringBuilder e StringBuffer em comum
StringBuilder e StringBuffer têm classes de pais públicas AbstractStringBuilder (classe abstrata).
Uma das diferenças entre classes abstratas e interfaces é que alguns métodos públicos de subclasses podem ser definidos em classes abstratas. As subclasses precisam apenas adicionar novas funções e não precisam repetir os métodos existentes; enquanto as interfaces definem apenas métodos e constantes.
Os métodos do StringBuilder e StringBuffer chamarão de métodos públicos no AbstractStringBuilder, como Super.append (...). É apenas que o StringBuffer adicionará uma palavra -chave sincronizada ao método e executará a sincronização.
Por fim, se o programa não for multithread, o uso do StringBuilder será mais eficiente que o StringBuffer.
6. A diferença entre matrizes e listas vinculadas
Ambos pertencem a uma estrutura de dados
Da estrutura lógica:
① A matriz deve definir um comprimento fixo (número de elementos) com antecedência e não pode se adaptar ao aumento dinâmico e diminuição dos dados. Quando os dados aumentam, o número de elementos pode exceder o originalmente definido; Quando os dados diminuem, o desperdício de memória será causado; A matriz pode ser acessada diretamente de acordo com o subscrito.
List A lista vinculada é armazenada e alocada dinamicamente, que pode se adaptar ao aumento dinâmico e diminuição dos dados e pode inserir e excluir facilmente itens de dados. (Ao inserir e excluir itens de dados na matriz, você precisa mover outros itens de dados, o que é muito pesado) A lista vinculada deve encontrar o próximo elemento de acordo com o próximo ponteiro.
Do armazenamento de memória:
① As matrizes (estáticas) alocam espaço da pilha, que é conveniente e rápido para programadores, mas tem pouca liberdade.
② A lista vinculada aloca espaço da pilha, que tem muita liberdade, mas é mais problemática para se candidatar à gerência.
A partir da comparação acima, podemos ver que, se você precisar acessar rapidamente dados e raramente ou não inserir e excluir elementos, você deve usar uma matriz; Pelo contrário, se você precisar inserir e excluir elementos com frequência, precisará usar uma estrutura de dados da lista vinculada.
7. A diferença entre Arraylist e LinkedList
①ArrayList implementa uma estrutura de dados com base em matrizes dinâmicas, e o LinkedList é baseado em uma estrutura de dados com base em uma lista vinculada.
② Para acesso aleatório para obter e definir, o ArrayList se sente melhor do que o LinkedList porque o LinkedList precisa mover o ponteiro.
③ Para as operações de adição e exclusão, adicionar e remover, o LinedList tem uma vantagem relativamente, porque o ArrayList precisa mover os dados.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.