Índice
1. A diferença entre interface e classe abstrata
2. A diferença entre sobrecarregar e reescrever
3. A diferença entre == e igual
4. Mecanismo de tratamento de exceções
6. E se você quiser um HashMap seguro para threads?
7. Como o ConcurrentHashMap garante a segurança do thread?
8. A diferença entre HashTable e HashMap
9. A diferença entre ArrayList e LinkedList
10. Como garantir a segurança do thread do ArrayList?
11. A diferença entre String, StringBuffer e StringBuilder
13. A diferença entre orientado a objetos e orientado a processos
4. Cópia profunda e cópia superficial
17. Cinco maneiras de criar objetos em Java?
1. A diferença entre interface e classe abstrata
Semelhança:
① Nem podem ser instanciadas
② Subclasses comuns que implementam interfaces ou herdam classes abstratas
Esses métodos abstratos devem ser implementados
diferença:
① Classes abstratas podem conter métodos comuns e blocos de código ,
As interfaces só podem conter métodos abstratos, métodos estáticos
e o método padrão
② Classes abstratas podem ter construtores , mas interfaces não
③ As variáveis-membro na classe abstrata podem ser de vários tipos
Sim, as variáveis-membro da interface só podem ser públicas
tipo final estático e deve ser atribuído
2. A diferença entre sobrecarregar e reescrever
① A sobrecarga ocorre na mesma classe com o mesmo nome de método,
Listas de parâmetros, tipos de retorno, modificadores de permissão podem
diferente
②A reescrita ocorre em subclasses , nomes de métodos, colunas de parâmetros
A tabela e o tipo de retorno são iguais e o modificador de permissão deve ser maior
Para o método da classe pai, o escopo da exceção declarada é menor que o da classe pai
método, mas métodos finais e privados modificados
não regravável
3. A diferença entre == e igual
① == compara tipos básicos, compara valores , == compara
Comparado com o tipo de referência , o endereço de memória é comparado
② equlas é um método da classe Object, que é essencialmente o mesmo que
==, mas algumas classes substituem o método equals
método, como os iguais de String são reescritos,
A comparação é um valor de caractere e equlas é reescrito
Depois disso, o método hashcode() também deve ser substituído
4. Mecanismo de tratamento de exceções
① Use try, catch, finalmente para capturar exceções, finalmente
O código será executado, após a detecção da exceção, o programa irá
continuar a executar
② Use throws para declarar as exceções que o método pode lançar
Tipo constante, após ocorrer uma exceção, o programa termina
5. Princípio do HashMap
(1) HashMap
Após Jdk1.8, ele é implementado com base em array + lista vinculada + árvore vermelha e preta
Agora, a característica é que a chave não pode ser repetida e pode ser nula.
tópico inseguro
(2) O mecanismo de expansão do HashMap:
A capacidade padrão do HashMap é 16 e o fator de carga padrão
é 0,75, quando o número de elementos no HashMap excede a capacidade multiplicada
Quando o número de fatores de carga é usado, um tamanho do anterior é criado
Duplique o novo array e copie os dados do array original
para a nova matriz, quando o comprimento da matriz atingir 64 e o comprimento da lista vinculada
Quando for maior que 8, a lista vinculada se transforma em uma árvore rubro-negra
(3) Princípio de acesso HashMap:
① Calcule o valor hash da chave e, em seguida, execute um segundo hash,
Encontre a posição do índice correspondente de acordo com o resultado do hash secundário
② Se houver um valor nesta posição, execute primeiro uma comparação de igualdade ,
Se o resultado for verdadeiro substitua o elemento, se o resultado for falso ,
Basta usar o método de tradução de bits alto e baixo para inserir o nó na lista vinculada (JDK 8
No passado, o método de inserção da cabeça era usado, mas o método de inserção da cabeça pode ser expandido simultaneamente
Pode causar lista vinculada circular ou perda de dados, enquanto tradução alta e baixa
ocorrerá a substituição de dados)
6. E se você quiser um HashMap seguro para threads?
① Use ConcurrentHashMap
② Use HashTable
③ Método Collections.synchronizedHashMap()
7. Como o ConcurrentHashMap garante a segurança do thread?
JDK 1.7 : Use bloqueios de segmento para dividir um mapa em
16 segmentos, cada segmento é um pequeno hashmap,
Cada operação bloqueia apenas um dos segmentos
JDK 1.8 : adotar linha garantida CAS + sincronizada
Segurança do programa, cada vez que os dados são inseridos, eles são julgados pela matriz atual
Se é a primeira vez que insere a marca, se sim, insira através do CAS
Digite e julgue se f.hash é igual a -1 , se sim, então
Isso significa que outros threads estão se expandindo e o thread atual também irá
Participe da expansão; o método delete é modificado com sincronizado ,
Garanta a segurança da remoção de elementos sob simultaneidade
8. A diferença entre HashTable e HashMap
① Cada método de HashTable usa sincronização
decoração, portanto é seguro para threads, mas ao mesmo tempo é eficiente em leitura e gravação
muito baixo
② A chave do HashTable não pode ser nula
③ HashTable faz hash da chave apenas uma vez,
HashMap Hash duas vezes
④ A matriz mais a lista vinculada usada na parte inferior do HashTable
9. A diferença entre ArrayList e LinkedList
A camada subjacente do ArratList usa um array dinâmico com capacidade padrão de
10. Quando o número de elementos atingir a capacidade, gere um novo
Matriz, o tamanho é 1,5 vezes o anterior e depois o original
copie o array; porque o array está conectado na memória
Endereço contínuo, para que ArrayList encontre dados mais rapidamente ,
Adicionar dados é menos
A camada inferior do LinkedList usa uma lista vinculada , que fica isolada na memória
Espalhados, sem mecanismo de expansão ; LinkedList está procurando dados
Os dados precisam ser percorridos desde o início , então a busca é lenta , mas adicionando
dados mais
10. Como garantir a segurança do thread do ArrayList?
① Use o método collentions.synchronizedList()
Bloqueie o ArrayList
② Use Vector, a camada inferior de Vector é igual a Arraylist
O mesmo, mas cada método é modificado por sincronização
enfeites, muito lento
③ Use CopyOnWriterArrayList em juc,
Esta classe implementa a operação de leitura sem bloqueio , e a operação de gravação é
list cria uma cópia , durante a qual outros threads leem
Ambas são a lista original e todas as operações de gravação são executadas na cópia.
Após a conclusão da escrita, aponte o ponteiro para a cópia
11. A diferença entre String, StringBuffer e StringBuilder
① String é composta por array char[], usando final
Modificação, toda vez que a String for alterada, ela será nova
Gere um objeto String e aponte o ponteiro para
novo objeto de referência
② StringBuffer é variável e seguro para threads
③ StringBuiler é variável, mas não é seguro para threads
① Use String para operar uma pequena quantidade de dados de caracteres;
② Use StringBuilder para operação de thread único de grandes quantidades de dados;
③Use StringBuffer para operação multithread de grandes quantidades de dados
12.hashCode和é igual
hashCode() e equals() são ambos da classe Object
método, hashCode() é calculado por endereço por padrão
código hash, mas pode ser reescrito para usar o conteúdo para calcular
código hash, equals() julga dois por endereço por padrão
Os objetos são iguais, mas podem ser substituídos pelo conteúdo
compara dois objetos, se dois objetos são iguais, seus
hashCode e equals devem ser iguais, mas
Dois objetos com hashCode iguais não são necessariamente iguais
Se você reescrever equals(), deverá reescrever hashCode() ,
Por exemplo, no HashMap, se a chave for String
Tipo, String Se apenas equals() for reescrito sem
Se hashcode() for reescrito, então dois equals()
chaves que se comparam a true porque os códigos hash são diferentes
Como resultado, duas chaves não aparecem em um índice, então
Haverá duas chaves idênticas no mapa
13. A diferença entre orientado a objetos e orientado a processos
Orientado a objetos tem características de encapsulamento, herança e polimorfismo , então
Comparado com orientado a processos, fácil de manter, fácil de reutilizar, fácil de expandir,
Mas como a classe precisa ser instanciada quando é chamada, a sobrecarga é alta
orientado para o processo
4. Cópia profunda e cópia superficial
Cópia superficial : A cópia superficial apenas copia uma referência a um objeto , enquanto
O objeto em si não é copiado e os objetos antigos e novos ainda compartilham o mesmo bloco
Cópia profunda da memória : a cópia profunda criará um objeto idêntico,O novo objeto não compartilha memória com o objeto original e a modificação do novo objeto não
mudará o objeto original
15. O papel do polimorfismo
A implementação do polimorfismo deve ser herdada, reescrita e a referência da classe pai aponta para
Objeto de subclasse, sua vantagem é que pode eliminar a lacuna entre os tipos
O relacionamento de acoplamento aumenta a escalabilidade e flexibilidade da classe.
16. O que é reflexão?
A reflexão é obtida obtendo o objeto de classe da classe e, em seguida, dinamicamente
Obtenha a estrutura interna desta classe e opere-a dinamicamente
Propriedades e métodos de classe
Cenário de aplicação:
Quando você deseja operar propriedades e métodos de classe com permissões insuficientes , implemente
Ao definir anotações , carregar dinamicamente pacotes jar de terceiros e adicionar
carregar classe, economizando tempo de compilação e inicialização;
Os métodos para obter objetos de classe são:
① class.forName (caminho da classe)
②classe.class()
③ getClass() do objeto
17. Cinco maneiras de criar objetos em Java?
(1) nova palavra-chave
(2) Classe.newInstance
(3) Construtor.newInstance
(4) Método de clonagem
(5) Desserialização