A API de coleção Java fornece algumas classes e interfaces de coluna para nos ajudar a armazenar e gerenciar coleções de objetos. De fato, as coleções no Java funcionam como uma matriz, mas o tamanho da coleção pode ser alterado dinamicamente e as coleções também fornecem funções mais avançadas. Com a API da Javacollection, não precisamos escrever aulas de coleção. A maioria das aulas de coleção Java está localizada no pacote java.util , e algumas aulas de coleta relacionadas à simultaneidade estão localizadas no pacote java.util.concurrent . Aqui estão algumas das classes de coleta fornecidas pela API Java.
1. Visão geral das coleções Java
Existem duas categorias de coleções em Java, a saber:
1. Coleção
2. Mapa
A coleção da classe de coleção pode ser entendida como armazenando principalmente objetos únicos, enquanto a coleção da classe MAP armazena principalmente objetos de valor-chave. Essas duas categorias podem ser tomadas como garantidas para corresponder a duas interfaces, a saber, Collection接口e Map接口. A figura a seguir lista a árvore de herança dessas duas interfaces:
Na imagem acima, podemos ver que a interface de coleção derivou três ramos, a saber:
1. Lista
2. Conjunto
3. Fila
O mapa é relativamente simples, com apenas um ramo. Abaixo, apresentaremos cada classe de implementação da coleção Java em detalhes.
Nota: Para distinguir coleta e coleções, as coleções são uma interface para a coleção e as coleções são uma classe de ferramentas, que fornece alguns métodos estáticos para facilitar a operação de instâncias de coleta, ambas localizadas no pacote java.util .
2. Introduzir pela primeira vez na interface da coleção
A figura a seguir é uma captura de tela do código -fonte da interface de coleta. A partir dos métodos abstratos na interface, podemos ver que ela define um método comum para uma coleção geral:
- Adicione e exclua um elemento
- determinar se o elemento existe
- Obtenha o tamanho da coleção
- itera sobre uma coleção
2.1 Interface da lista da coleção
A interface da lista herda da interface de coleção. Sua característica é que os objetos nele sejam ordenados e cada objeto tenha um índice exclusivo. Podemos procurar um elemento através desse índice, e os objetos da lista podem ser repetidos, o que é semelhante a uma matriz. Para interface da lista, a API Java fornece a seguinte implementação:
- java.util.arraylist
- java.util.LinkedList
- java.util.Vector
- java.util.stack
Obviamente, existem algumas implementações no pacote java.util.concurrent , que serão descritas em detalhes em outro artigo.
A ArrayList é a coleção mais usada, e sua implementação interna é uma matriz , e o tamanho da Arraylist pode ser expandido dinamicamente. A eficiência de acesso aleatório para elementos é alta e a complexidade do tempo de acesso é O(1) . A eficiência da operação da cauda é alta e a complexidade do tempo é O(1) assim como o acesso aleatório. Se for operado a partir da cabeça, a eficiência será relativamente baixa, porque ao inserir ou excluir a cabeça, todos os seguintes elementos precisam ser movidos e a complexidade do tempo é O(ni) (n representa o número de elementos e i representa a posição do elemento).
LinkList: Como pode ser visto na figura acima, ela não apenas herda a interface List , mas também herda a interface Deque (ela será introduzida posteriormente). O Linklist é uma estrutura de dados com base em uma lista vinculada, e cada nó salva ponteiros nos nós anteriores e próximos. O Linklist é relativamente ineficiente para acesso aleatório, pois requer indexação do zero, portanto, sua complexidade de tempo é O(i) . No entanto, para a adição e exclusão de elementos, a lista de link é eficiente porque apenas os ponteiros frontal e traseira precisam ser modificados e sua complexidade de tempo é O(1) .
Vetor: das capturas de tela do código -fonte do vetor e do Arraylist, eles herdam as interfaces exatamente as mesmas. Portanto, o vetor pode ser considerado como um ArrayList segura para threads, que também é implementado com base em matrizes , mas quase todas as operações de coleta são adicionadas com a palavra-chave synchronized .
Pilha: O acima é uma captura de tela do código -fonte da classe de pilha. Vemos que a aula de pilha realmente herda do vetor. A pilha apenas adiciona vários métodos baseados no vetor para fornecer as características da pilha (o último na primeira saída LIFO). O recurso da Stack é que, quando adicionado, novos elementos serão adicionados à parte superior e, quando removidos, os elementos superiores serão removidos primeiro. Essa estrutura de dados é usada principalmente como alguns processos especiais de processamento de dados, como compilação de idiomas, análise XML, etc.
2.2 Interface de conjunto de coleções
A interface de set e list também é herdada da interface Collection e também é uma implementação de coleções. A maior diferença entre eles é que os objetos no conjunto não podem ser repetidos . Para interfaces Set , a API Java fornece a seguinte implementação:
- java.util.enumset
- java.util.hashset
- java.util.LinkedHashSet
- java.util.treeset
As funções dessas classes são um pouco diferentes e as diferenças são refletidas principalmente na ordem da iteração de objetos e na eficiência da inserção e pesquisa.
A implementação do hashset é muito simples e é um HashMap dentro, mas não garante a ordem dos elementos.
A implementação do LinkedHashSet também é muito simples e usa um LinkedHashMap internamente. Como LinkedHashMap mantém uma lista vinculada bidirecional internamente para manter a ordem, a característica do LinkedHashSet é que os elementos nela são ordenados e a ordem da iteração do elemento é a ordem de sua inserção. A reinserção dos elementos não afetará a ordem dos elementos originais.
TreeSet: A partir da relação de herança na figura acima, você deve primeiro entender NavigableSet TreeSet SortedSet .
Interface do STORDEDSET
Public Interface STORNEDSET <E> estende o conjunto <E> {comparador <?? super e> comparador (); SetedSet <E> subconjunto (e fromElement, E PoElement); SatedSet <e> fone de ouvido (E ELEMENT); SLATEDEDSET <E> TALEST (E FORMELEMENT); E primeiro (); } A partir da definição de interface acima, a interface do SortedSet é uma subinterface do conjunto. Além das características gerais do conjunto, seus elementos são ordenados internamente. A ordem dos elementos internos depende das regras de ordem dos elementos, ou seja, a ordem dos elementos depende da implementação da interface comparable do elemento ou de um comparator de comparador. Para a diferença entre comparável e comparador, consulte: https://www.vevb.com/article/93973.htm
Interface Navigableset
interface pública Navigableset <e> estende o STORNEDSET <E> {NAVIGABLESET <E> descendingset (); Iterador <e> descendingIterator (); SatedSet <e> fone de ouvido (E ELEMENT); SLATEDEDSET <E> TALEST (E FORMELEMENT); SetedSet <E> subconjunto (e fromElement, E PoElement); teto (), piso (), superior () e inferior () ...}Na definição de interface Navigableset, é uma subinterface do STORNEDSET e fornece alguns métodos de navegação. Quanto ao significado desses métodos de navegação, você pode verificar o Doc Java.
Portanto, a característica do TreeSet é que seus elementos internos são ordenados e há muitos métodos de navegação a serem implementados. Desde a primeira parte da visão geral da classe Java Collection, sabemos que o conjunto possui uma sub-interface SortedSet e o STOREDSET possui uma interface NavigableSet Sub-Interface. A API Java implementa apenas as interfaces de SortEdSet e NavigableSet, que é TreeSet .
2.3 Interface da fila da coleção
A interface da fila herda da interface Collection , que também representa uma fila ordenada. No entanto, a maior característica desta fila é que o elemento recém -inserido está localizado na cauda da fila e o objeto removido está localizado na cabeça da fila, que é semelhante à fila que checa no supermercado.
Já sabemos na visão geral da coleção Java na Seção 1 que a interface da fila também possui um deque sub-interface. Vamos dar uma olhada na definição dessas duas interfaces pela API Java:
Interface da fila:
fila de interface pública <e> estende a coleção <E> {boolean add (e e); oferta booleana (e e); E remover (); E pesquisa (); E peek ();}Interface deque:
interface pública deque <e> estende a fila <E> {void addfirst (e e); Void Addlast (E E); E removefirst (); E removefirst ();}Das definições dessas duas interfaces, acho que todo mundo já viu algumas pistas. A interface da fila define o método de operação de uma fila geral, enquanto Deque é uma fila de ponta dupla .
Para interfaces Queue , a API Java fornece duas implementações:
- java.util.LinkedList (também implementa a interface DEQUE)
- java.util.priorityQueue
LinkedList: O capítulo da lista anterior mencionou que é uma fila padrão.
PriorityQueue: A ordem na fila é semelhante à TreeSet, dependendo das regras de ordenação dos elementos, ou seja, a implementação dos elementos na interface comparável ou a um comparador do comparador.
Para a interface DEQUE, há outra implementação além da classe Linklist:
- java.util.arraydeque
Arraydeque: Como pode ser visto no nome, sua implementação interna é uma matriz.
3. Mapa de coleção Java
Desde a primeira parte da visão geral da classe Java Collection, sabemos que o mapa não herda da interface da coleção, mas está localizado em uma posição paralela com a interface de coleta. Portanto, o comportamento do mapa é muito diferente do comportamento da coleção introduzido acima. A principal característica do mapa é que os elementos que ele armazena são pares key-value . Vamos dar uma olhada na definição da interface do mapa:
mapa de interface pública <k, v> {v put (K -Key, V Valor); Boolean ContainsKey (chave do objeto); Set <pap.entry <k, v >> entradas (); int hashcode (); V get (chave do objeto); SET <K> KeySet (); ...}Para interfaces de mapa, a API Java fornece as seguintes implementações:
- java.util.hashmap
- java.util.hashtable
- java.util.enummap
- java.util.IdentityHashmap
- java.util.linkedhashmap
- java.util.properties
- java.util.treemap
- java.util.weakhashmap
Entre eles, os mais usados são Hashmap e Treemap.
A chave e o valor no hashmap são desordenadas. Vale a pena estudar a implementação interna do Hashmap. Para detalhes, consulte a implementação interna do hashmap
A hashtable pode ser considerada uma implementação de peso pesado do hashmap. A maioria dos métodos é adicionada com a palavra-chave sincronizada, que é segura por threads. Outra diferença entre HashTable e hashmap é que key-value do Hashmap podem ser nulos, enquanto HashTable不.
O LinkedHashmap também é um hashmap, mas uma lista vinculada de mão dupla é mantida internamente para manter a ordem. A implementação interna LinkedHashSet é usada para usar o LinkedHashmap.
A chave e o valor no TREEMAP podem não apenas manter a ordem, mas são semelhantes ao TreeSet e PriorityQueue . A ordem iterativa de chave e valor no Treemap depende de suas respectivas regras de classificação.
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.