Questões relacionadas à coleta de procura de emprego no estágio JAVA

1. Introdução

Primeiro, descreva brevemente a estrutura da coleção em Java, dividida em duas categorias: coleção de coluna única Collection e conjunto de coleta de coluna dupla

Coleção de coluna única: ordenada e repetível, geralmente usada para substituir matrizes, chamadas matrizes variáveis

Mapa de coleção de coluna dupla:

 

A diferença entre ArrayList, Vector e LinkedList

ArrayList: Como uma das principais classes de implementação da interface List, o thread não é seguro e é altamente eficiente.A parte inferior usa Object [] elementData para armazenamento.

JDK7:

ArrayList list = new ArrayList (); // A camada inferior criou o Object [] array elementData de comprimento 10

list.add (123); // elementoDados [0] = novo número inteiro (123);

...

list.add (11); // Se essa adição resultar em capacidade insuficiente da matriz elementData subjacente, expanda a capacidade.

Por padrão, a capacidade é expandida para 1,5 vezes a capacidade original e os dados na matriz original precisam ser copiados para a nova matriz.

JDK8:

ArrayList list = new ArrayList (); // O ObjectData [] elementData subjacente é inicializado em {}. Uma matriz de comprimento 10 não é criada

list.add (123); // Quando a primeira chamada para adicionar (), a camada inferior criou uma matriz de comprimento 10 e adicionou os dados 123 ao elementData [0]

As operações subsequentes de adição e expansão não são diferentes do jdk 7.

Resumo resumido: A criação do objeto ArrayList no jdk7 é semelhante à fome do singleton, enquanto a criação do objeto ArrayList no jdk8 é semelhante ao preguiçoso do singleton, atrasando a criação da matriz e economizando memória.

LinkedList: Para operações frequentes de inserção e exclusão, o uso desse tipo de eficiência é maior que o ArrayList; a parte inferior usa um armazenamento de lista duplamente vinculado.

LinkedList list = new LinkedList (); a primeira e a última propriedade do tipo Node são declaradas internamente e o valor padrão é nulo

list.add (123); // Encapsula 123 no Node e cria o objeto Node.

Entre eles, Node é definido como: uma declaração que reflete a lista duplamente vinculada de LinkedList

classe estática privada Nó <E> {
            E item;
            Nó <E> próximo;
            Nó <E> anterior;

            Nó (Nó <E> anterior, elemento E, Nó <E> próximo) {
            this.item = elemento;
            this.next = next;
            this.prev = anterior;
            }
        }

Vetor: como a classe de implementação antiga da interface List; segurança de thread, baixa eficiência; a parte inferior usa o elemento Object []

Ao criar objetos através do construtor Vector () nos jdk7 e jdk8, a camada inferior cria uma matriz de comprimento 10.
Em termos de expansão da capacidade, a expansão da capacidade padrão é o dobro do comprimento da matriz original.

HashSet

A camada inferior do HashSet ainda usa armazenamento de matriz e lista vinculada, refletido principalmente em desordem e não repetibilidade

Ao adicionar o elemento a ao HashSet, primeiro chame o método hashCode () do elemento a para calcular o valor de hash do elemento a e calcule esse valor de hash através de um algoritmo de algoritmo de hash para calcular a posição i em uma matriz.Quando a posição i na matriz não existe Quando o elemento é adicionado, o elemento a é adicionado com êxito; se o elemento b existir na posição i, o valor do hash de be o valor do hash de a são comparados.Se não forem iguais, use uma lista vinculada para armazenar aeb na posição i; se o valor do hash for o mesmo, compare o método igual , O mesmo não é armazenado, o diferente é armazenado em uma lista vinculada.

HashMap

JDK7

Mapa HashMap = new HashMap (): Após a instanciação, a camada inferior cria uma tabela Entry [] de matriz unidimensional de comprimento 16.

... pode ter realizado várias operações de venda ...

 map.put (key1, value1): Primeiro, chame hashCode () da classe em que key1 pertence para calcular o valor do hash da chave 1. Após esse valor do hash ser calculado por um algoritmo, ele obtém o local de armazenamento na matriz Entry. Se os dados neste local estiverem vazios, key1-value1 será adicionado com sucesso. ---- Situação. Se os dados nesse local não estiverem vazios (o que significa que há um ou mais dados nesse local (na forma de uma lista vinculada)), compare o valor do hash da chave1 e um ou mais dados existentes: se a chave1 tiver O valor de esperança é diferente do valor de hash dos dados existentes.Neste momento, o key1-value1 é adicionado com êxito. ---- Caso 2. Se o valor do hash da chave1 for igual ao valor do hash de um dos dados existentes (valor da chave2), continue com a comparação: chame o método equals (key2) da classe em que a chave1 está localizada, compare: if equals () retorna false: key1-value1 foi adicionado com sucesso. ---- Caso 3. Se equals () retornar true: substitua value2 pelo value1. Suplemento: Sobre o Caso 2 e Caso 3: No momento, o valor da chave1 e os dados originais são armazenados em uma lista vinculada.

No processo de adição contínua, isso envolverá o problema de expansão.Quando o valor crítico for excedido (e o local a ser armazenado não estiver vazio), a expansão será realizada. Método de expansão padrão: expanda para o dobro da capacidade original e copie os dados originais.

O HashMap no jdk8 é diferente do jdk7 na implementação subjacente:
1. novo HashMap (): a camada inferior não cria uma matriz de comprimento
2. jdk 8 A matriz da camada inferior é: Nó [], não Entrada []
3 Quando o método put () é chamado pela primeira vez, a camada inferior cria uma matriz com um comprimento de 16.
4. A estrutura subjacente do jdk7 é apenas: matriz + lista vinculada. A estrutura subjacente do jdk8: array + lista vinculada + árvore vermelho-preta.
4.1 Ao formar uma lista vinculada, vá para cima e para baixo (jdk7: o novo elemento aponta para o elemento antigo. Jdk8: o elemento antigo aponta para o novo elemento)
4.2 Quando o elemento em uma determinada posição de índice da matriz existe na forma de uma lista vinculada> 8 e quando o comprimento da matriz atual é> 64, todos os dados nessa posição de índice agora são armazenados usando árvores vermelhas e pretas.

Árvore preta vermelha

Para resolver o problema de conflitos de hash, ou seja, uma lista longa vinculada fica suspensa sob um valor de hash, portanto, no jdk1.8, a camada inferior do HashMap consiste em matrizes, listas vinculadas e árvores vermelho-preto.A árvore vermelho-preto é uma árvore de pesquisa binária equilibrada. "Equilíbrio" significa que não há subárvore muito longa.

Várias características das árvores vermelho-pretas:

(1) O nó é vermelho ou preto

(2) O nó raiz deve ser preto

(3) O nó folha deve ser um nó nulo preto

(4) Os dois nós filhos de cada nó vermelho devem ser pretos

(5) O caminho de qualquer nó da árvore para cada nó folha contém o mesmo número de nós pretos

A árvore vermelho-preta pode garantir as três armas mágicas de auto-equilíbrio: canhoto, destro e descoloração

Rotação à esquerda: o nó direito do nó de rotação é o nó pai e a subárvore esquerda do nó direito é usada como a subárvore direita do nó de rotação

Rotação à direita: o nó esquerdo do nó de rotação se torna o nó pai e a subárvore direita do nó esquerdo se torna a subárvore esquerda do nó de rotação

Descoloração:

 

Publicado 111 artigos originais · Gosto 60 · 70.000 + visualizações

Acho que você gosta

Origin blog.csdn.net/Haidaiya/article/details/105528027
Recomendado
Clasificación