Haverá muitos objetos no desenvolvimento real do projeto. O Java fornece uma estrutura de coleta para resolver esses problemas As aulas estão no pacote java.util e a lista 1 descreve o relacionamento entre a classe de coleta.
Listagem 1. A relação entre a classe de coleção
Coleção
├list
│├LinkedList
│Laarraylist
│orvetor
│ Kstack
└set
Mapa
Bhashtable
Phashmap
Sweakhashmap
Interface de coleção
Interface de coleção
A coleção é a interface de coleta mais básica. Algumas coleções permitem os mesmos elementos e suportam os elementos de classificação, enquanto outros não estão funcionando. O JDK não fornece classes diretamente herdadas da coleção. Todas as classes que implementam a interface de coleta devem fornecer dois construtores padrão. O último construtor permite que os usuários copam uma coleção.
Como iterar através de cada elemento da coleção?
Independentemente do tipo de coleção real, ele suporta um método iterator (). O uso típico é o seguinte:
Iterator it = collection.iterator ();
As duas interfaces da interface de coleta são listadas e definidas.
O método principal fornecido pela interface de coleção:
1. Boolean Add (Object O) Adicionar objeto à coleção;
2. Remova booleano (objeto o) exclua o objeto especificado;
3. Int size () retorna o número de elementos na coleção atual;
4. O booleano contém (objeto o), encontre se existem objetos especificados no conjunto;
5. BOOLEAN ISEMPTY () Determine se o conjunto está vazio;
6. iterator iterator () retorna um iterador;
7. O booleano contém (Coleção C), encontre se existem elementos no conjunto C no conjunto;
8. Boolean Addall (Coleção C) adiciona todos os elementos da coleção C à coleção;
9. void clear () excluir todos os elementos no conjunto;
10. Void Removeall (Coleção C) Exclua os elementos no conjunto C -Collection da coleção;
11. Void reterlall (Coleção C) Exclua o elemento que não inclui na coleção C da coleção.
Interface da lista
A lista é uma coleção ordenada que pode controlar com precisão a posição de cada inserção de elemento com essa interface. Os usuários podem usar índices (a posição dos elementos na lista, semelhante ao lance de matriz) para acessar os elementos na lista, que é semelhante à matriz Java. Ao contrário do conjunto a ser mencionado abaixo, a lista permite os mesmos elementos.
Além do método iterator () necessário para a interface de coleta, a lista também fornece um método listiterator () para retornar uma interface ListoTrator. Comparado com a interface do iterador padrão, o ListOtrator possui alguns métodos como Add (), permitindo funções como adicionar, excluir, definir elementos, travessias para frente ou para trás. Classes comumente usadas para implementar interfaces de lista incluem LinkedList, ArrayList, Vector e Stack.
O método principal fornecido pela interface da lista:
1. Void add (int índice, elemento de objeto) adiciona um objeto no local especificado;
2. Boolean Addall (INT Estagiários, Coleção C) adiciona o elemento do conjunto C à posição especificada;
3. Objeto Get (Int Index) Retorna o elemento especificado na posição designada na lista;
4. IndexOf (Objeto O) retorna a posição do primeiro elemento O;
5. Objeto RemoverInt (INT índice) Excluir o elemento da posição especificada;
6. Conjunto de objetos (int indexEx, elemento do objeto) Substitua os elementos no índice de posição do elemento elemento para retornar o elemento substituível.
Interface do mapa
O mapa não herdou a interface colegial. O mapa fornece um mapeamento de chave para valor. A interface do mapa fornece 3 conjuntos de visualizações.
O principal método fornecido pelo mapa:
1. Objeto de comparação booleano (objeto o);
2. Remover booleano (objeto O) excluir um objeto;
3. CUST (chave do objeto, valor do objeto) Adicione a chave e o valor.
Interface aleatória
A interface aleatória é uma interface de logotipo, que não fornece nenhum método. O principal objetivo desta interface é identificar a implementação da lista que pode suportar acesso rápido e aleatório. Qualquer implementação de lista baseada em matriz implementa a interface Raodomaccess, enquanto as implementações baseadas em lista vinculadas não. Como apenas a matriz pode executar acesso aleatório rápido, o acesso aleatório à lista vinculado precisa ser percorrido pela lista vinculada. Portanto, a vantagem dessa interface é que, no aplicativo, você pode saber se o objeto da lista que está sendo processado pode executar acesso rápido e aleatório, de modo a executar diferentes operações para uma lista diferente para melhorar o desempenho do programa.
Introdução
Classe LinkedList
O LinkedList implementa a interface da lista e permite elementos nulos. Além disso, o LinkedList fornece métodos adicionais, remover, inserir e outros para operar dados na primeira ou na cauda do LinkedList. Essas operações fabricam o LinkedList pode ser usado como pilhas, fila (fila) ou duas filas de andamento. Observe que o LinkedList não possui um método de sincronização. Uma solução é construir uma lista síncrona ao criar uma lista.
Lista Lista = Coleções.synchronizedList (new LinkedList (…));
Classe Arraylist
Arraylist implementa uma matriz de tamanho variável. Permite todos os elementos, incluindo NULL. Tamanho, Isempty, Get, Set e outros métodos estão em execução, mas o método Add Overhept é a constante do compartilhamento.
Cada instância da Arraylist tem uma capacidade (capacidade) de armazenar o tamanho da matriz de elementos de armazenamento. Quando uma grande quantidade de elementos precisa ser inserida, você pode chamar o método de segurança de segurança antes de inserir para aumentar a capacidade da Lista Array para melhorar a eficiência da inserção. Como o LinkedList, o ArrayList também é um thread -not -Synchronized (não sincronizado).
O método principal fornecido pela ArrayList:
1. Boolean Add (Object O) adiciona o elemento especificado ao final da lista;
2. Boolean Add (int indexEx, elemento do objeto) para especificar a posição para adicionar o elemento especificado na lista;
3. Boolean Addall (Coleção C) adiciona o conjunto especificado ao final da lista;
4. Boolean Addall (int interleg, coleção c) Adicione uma coleção especificada no local especificado na lista;
5. Boolean Clear () Exclua todos os elementos da lista;
6. Clone booleano () retorna a uma cópia da lista da lista;
7. O booleano contém (objeto o) determinar se ele contém elementos na lista;
8. O BOOLEAN GELSURECAPACIDADE (INT M) aumenta a capacidade da lista.
9. Objeto Get (Int Index) Retorne o elemento especificado na lista na lista;
10. IndexOf (objeto elem) na lista encontra a licitação do elemento especificado;
11. Int size () retorna o número de elementos da lista atual.
Classe vetorial
O vetor é muito semelhante ao Arraylist, a diferença é que o vetor é sincronizado por threads. O iterador criado pelo vetor, embora o iterador criado pelo ArrayList seja a mesma porta, porque o vetor é sincronizado, quando um iterador foi criado e usado, o outro thread alterou o status do vetor (por exemplo, adicionando ou excluindo alguns dos alguns dos alguns dos de alguns dos alguns dos de alguns dos de alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos de alguns dos alguns dos de alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos alguns dos de alguns dos alguns dos alguns dos alguns dos de alguns dos alguns dos de alguns dos alguns de elementos do estado), quando o método do iterador for chamado, a concorrente de Modificação -Ucepção será expulsa, portanto a exceção deve ser capturada.
Classe de pilha
A pilha herdou do vetor e percebeu uma pilha que foi posteriormente avançada. A pilha fornece 5 métodos extras para o vetor a ser usado como pilhas. Além dos métodos básicos de push e pop, também existe o método de espiada para obter o elemento do topo da pilha. pilha. Observe que depois que a pilha foi criada, era uma pilha vazia.
Set Class
O conjunto é uma coleção sem elementos repetidos, ou seja, qualquer elemento E1 e E2 têm e1.Equals (e2) = false. Há um elemento nulo no máximo. Obviamente, o construtor do conjunto possui uma condição de restrição, e a entrada dos parâmetros de coleta não pode incluir elementos duplicados. Observe que você deve operar cuidadosamente os objetos variáveis.
Classe de hashtable
Hashtable herda a interface do mapa e implementa uma tabela de hash com base no mapeamento do valor-chave. Qualquer objeto não nulo pode ser usado como chave ou valor. Adicione dados para usar put (chave, valor) e retire os dados para usar (chave).
A hashtable ajusta o desempenho através dos dois parâmetros da capacidade inicial e do fator de carga. O fator de carga padrão 0.75 atinge melhor o equilíbrio de tempo e espaço. O aumento do fator de carga pode economizar espaço, mas o tempo de pesquisa correspondente aumentará, o que afetará operações como GET e PUT. Use o exemplo simples de hashtable para colocar os três números de 1, 2 e 3 na hashtable.
Lista 2. Exemplo de hashtable
Hashtable números = new hashtable (); números.put ("um", novo inteiro (1)); números.put ("dois", novo inteiro (2)); números.put ("três", novo número inteiro (3 );
Se precisarmos retirar um número, como 2, podemos usar a chave correspondente para retirá -la e o código é mostrado na Lista 3.
Lista 3. Leia os dados da Hastable
Número inteiro n = (número inteiro ).get ("dois");
Como o objeto da chave será determinado calculando sua função de distribuição para determinar a posição do valor correspondente, qualquer objeto como uma chave deve implementar os métodos HashCode e é igual a métodos. HashCode e Methods Equals herdam o objeto raiz. Se você usa uma classe personalizada como chave, você deve ter muito cuidado. = Verdadeiro, seu código de hash deve ser o mesmo, mas se os dois objetos são diferentes, seu código de hash não será necessariamente diferente. Método HashCode () que pode acelerar a operação das tabelas de hash.
Se o mesmo objeto tiver um código de hash diferente, haverá resultados inesperados para a operação da tabela de hash (ansiosos para retornar NULL). Em vez de apenas escrever um deles.
Classe Hashmap
O hashmap é semelhante ao hashtable. No entanto, quando o hashmap é considerado como a coleção (o método dos valores () pode ser retornado), é proporcional à sobrecarga de tempo da sub -operação iterativa e à capacidade do hashmap. Portanto, se o desempenho da operação de iteração for muito importante, não defina a capacidade de inicialização do hashmap muito alta ou definir muito baixo no parâmetro do fator de carga.
Classe de fracoshashmap
O FrawHashmap é um hash de hash aprimorado que "referência fraca" para a chave.
Prática de classe de coleção
Arraylist, Vector e LinkedList são todos implementados do AbstractList, e o abstractList implementa diretamente a interface da lista e é estendido do abstarctcollection. Arraylist e Vector Use Arrays para implementar. O LinkedList usa uma estrutura de dados ligada a dois caminhos circulares, que é conectada por uma série de itens de tabela.
Quando a demanda do ArrayList por capacidade excede o tamanho da matriz atual, ela precisa ser expandida. Durante o processo de expansão da capacidade, será executado um grande número de operações de replicação da matriz e, quando a matriz for replicada, o método System.arraycopy () será finalmente chamado. Como o LinkedList usa a estrutura da lista vinculada, ela não precisa manter o tamanho da capacidade. Devido à continuidade da matriz, quando o elemento sempre é aumentado no final, a expansão da matriz e a replicação da matriz só podem ser geradas quando o espaço é insuficiente.
O Arraylist é baseado na matriz e a matriz é um espaço de memória contínuo. O LinkedList não diminui o desempenho devido à inserção de dados.
Cada elemento efetivo da Arraylist deve ser reorganizado após a exclusão de operações e, quanto maior o posicionamento da posição excluída do elemento, maior a sobrecarga durante a reorganização da matriz. O LinkedList precisa remover os dados intermediários para metade de uma lista.
Lista 4. Código de uso ArrayList e LinkedList
Importar java.util.arraylist; = Novo objeto (); m. (); 0, obj2); 1000; i ++) {list1.add (obj1);} end = system.currentttimomillis (); System.CurrentTtimemillis (); ;}}
Lista 5. Execução de saída
639129669690015
O hashmap é fazer o algoritmo chave e mapear o valor do hash para o endereço de memória para obter diretamente os dados correspondentes à chave. No HashMap, a estrutura de dados subjacente usa uma matriz, o endereço de memória chamado é o índice de etiquetas da matriz. O alto desempenho do Hashmap requer os seguintes pontos:
1. O algoritmo de hash deve ser eficiente;
2. O algoritmo do valor de hash para o endereço de memória (índice de matriz) é rápido;
3. De acordo com o endereço de memória (índice de matriz), você pode obter diretamente o valor correspondente.
Hashmap é na verdade uma matriz de uma lista vinculada. Como mencionado anteriormente, o mecanismo de implementação com base no método da lista vinculado baseado no hashmap, desde que os métodos hashcode () e hash () sejam alcançados o suficiente para reduzir a ocorrência de conflitos o máximo possível, então a operação de hashmap é Quase equivalente ao acesso aleatório à matriz de matrizes. No entanto, se o método hashcode () ou hash () for mal alcançado, no caso de um grande número de conflitos, o hashmap é realmente degradado em várias listas vinculadas, o que é equivalente à lista vinculada para a operação do hashmap Desta vez, o desempenho é muito ruim.
Uma desvantagem funcional do hashmap é seu distúrbio, que é armazenado nos elementos no hashmap. Se você deseja manter a ordem de entrada, pode usar o LinkedHashmap.
O LinkedHashMap herda do Hashmap e tem alta eficiência.
O hashmap pode operar put () e get () tão rápido quanto o algoritmo de hash. O TREEMAP fornece uma implementação de mapa completamente diferente. Em termos de função, o TREEMAP possui um recurso mais poderoso que o hashmap. O desempenho de Treemap é um pouco menor que o hashmap. Se você precisar classificar os elementos no desenvolvimento, não poderá implementar essa função com o hashmap. O LinkedHashMap é baseado na ordem de elemento que entra na coleção ou ordem seqüencial de ser acessada.
O LinkedHashmap é classificado de acordo com a ordem de aumento ou acesso ao elemento, enquanto o Treemap é classificado de acordo com a chave do elemento.
A Listagem 6 mostra que o código demonstra a ordem da lógica de negócios usando o TREEMAP.
Listagem 6. TreeMap implementos de classificação
Importar Java.util.iterador; nome; (O.Score> this.score) {return -1;} retorna 0;} @OverridePublic String tostring () {StringBuffer sb = new StringBuffer (); ; (); Aluno s1 = novo aluno ("1", 100); aluno s2 = novo aluno ("2", 99); aluno s3 = novo aluno ("3", 97); aluno s4 = novo aluno ("4 ", 91); map.put (S1, novo StudentDetailInfo (S1)); Map.put (S2, New StudentDetailInfo (S2)); Map.put (S3, New StudentDetailinfo (S3)); S4, New StudentDetailinfo (S4 )); next (); (S1); (key));} System.out.println ("endaping final"); ;) {Key Student = (Student) Itrator (Student s) {this.s = s;}@ounridepublic string tostring () {return s.name + "s informação detalhada de"}}
Lista 7. Execução de saída
Nome: 4 Pontuação: 91-> 4 Detalhes de 4 Nome: 3 Pontuação: 97-> 3 Detalhes de 3 Nome final: 4 Pontuação: 91-> 4 Detalhes de 4 Nome: 3 Pontuação: 97-> Informações detalhadas de 3 de 3 Nome: 2 Pontuação: 99- > Detalhes de 2 Informações do Nome final: 1 Pontuação: 100-> 1 Detalhes de Informações de Rapa End
O fracashashmap é caracterizado por si só de que, se não houver outro cither nessa chave, exceto por suas citações, este mapa descartará automaticamente o valor. Conforme mostrado na Listagem 8, o código mostra dois objetos de mapa, um é o hashmap e o outro é o FrawHashmap. NULL, eles apontam para NULL. A razão para essa situação é que, para o objeto A, quando o hashmap é excluído e um a nulo, além de fracoshashmap, não há ponteiro para um exceto um, embora aponte para nulo, há um ponteiro apontado para B no hashmap, tão fraco manterá o objeto B.
Lista 8. Código de exemplo Weakhashmap
Importar java.util.hashmap; String ("A"); , B, b, b, b, b, b, b, b, b, b, b, b, b, b, "bbb"); , "BBB"); .Entry en = (map.entry) izext (); . +En.getValue ());
Listagem 9. Execução de saída
Mapa: B: BBBWeakmap: B: BBB
O FrawHashmap atinge principalmente o objetivo de remover as entradas internas não utilizadas por meio de exungas, alcançando assim o objetivo de liberar automaticamente a memória. Basicamente, desde que o conteúdo do fracashashmap seja acessado, essa função será chamada para alcançar a entrada interna que não é mais referenciada. Mas se você se tornou um hashmap fraco e, antes do GC, nunca visitou o FrawHashmap, não é ilimitado liberar memória?
Lista 10. FrawHashMapTest1
Importar java.util.arraylist; ] [] >> mapas = novo Arraylist <fracashhashmap <byte [] [], byte [] [] >> (); BYTE [] []> D = novo fracoHashmap <byte [] [], byte [] []> (); .Add (D);
Não altere nenhum parâmetro JVM em execução 10 mostrado na lista de operações.
Lista 11. Execução de saída
241242243excioning no thread "main" java.lang.outofMemoryError: Java Heap Spaceat fracashashmaptest1.main (fracashashmapst1.java:10)
Com certeza, o FraftHashmap não liberou automaticamente a memória desnecessária no momento. O código mostrado na Listagem 12 não terá um estouro de memória.
Lista 12. fracashashmaptest2
Importar java.util.arraylist; ] [] >> mapas = novo Arraylist <fracashhashmap <byte [] [], byte [] [] >> (); BYTE [] []> D = novo fracoHashmap <byte [] [], byte [] []> (); .Add (D); .Get (j) .size ());}}}}
Os resultados da operação descobriram que a saída do teste era normal e o problema do transbordamento da memória não ocorreu mais.
Em geral, o FraftHashmap não é um objeto que não é usado no interior, se você fizer alguma coisa, mas solte o objeto interno não utilizado quando você o acessar.
O fracohashmap implementa referências fracas porque sua entrada <k, v> é herdada da fraco reference <K>.
Na definição e construtor de classe da entrada de fracoshmap $ <k, v>, é mostrada na lista 13.
Lista 13. Definição de classe fracoshashmap
Entrada de classe estática privada <k, v> estende a fraca referência <k> implementa mapa.entry <k, v> entrada (Key K, V Valor, ReferenceQueue <k> fila, int hash, entrada <k, v> próximo) {super (Chave, fila);
Observe que ele constrói uma declaração da classe do pai: "Super (chave, fila);"; No System.gc (), a matriz de bytes na chave é reciclada e o valor permanece (o valor é fortemente associado à entrada, a entrada está associada ao mapa e o mapa está associado ao ArrayList).
Toda vez que eu tenho um novo fracoHashmap sempre, após a operação de put, embora o GC recicle a matriz de bytes na chave de referência fraca, e notifique o evento para referência aquáticos, não há ação correspondente para desencadear o fracoHashmap para lidar com referência A chave ainda existe no fracashhashmap e seu valor correspondente também existe.
Quando o valor é limpo? ? Verifique o código -fonte do FRACHHASHMAP. Portanto, o efeito é que a chave foi limpa quando o GC e o valor visitou o FraftHashmap depois que a chave foi limpa.
A classe FrawHashMap é não -shocronizada. Portanto, seja dentro do mapeamento ou fora do mapeamento, a chave é removida automaticamente somente depois que o lixo Recyler remove a referência fraca a uma certa chave. Deve -se notar que o objeto Value no FrawHashmap é mantido pela atração geral. Portanto, você deve ter cuidado para garantir que o objeto Value não faça referência direta ou indiretamente de suas próprias chaves, porque isso impedirá que a tensão descarte. Observe que o objeto Value pode citar indiretamente a chave correspondente através do próprio hashmap de fracos, o que significa que um determinado objeto de valor pode ser fortemente referenciado por outros objetos -chave, e o objeto Valor associado ao objeto chave se volta para o primeiro para referenciar o primeiro um.
Uma maneira de lidar com esse problema é embalar o valor em si em Referentes fracos antes de inserir, como: M.put (tecla, nova referência fraca (valor)) e, em seguida, use o Get to Dissection. "O dispositivo de apoio falhou rapidamente. Depois que o dispositivo iterativo for criado, se o mapeamento for modificado a partir da estrutura, a menos que o próprio método de remoção ou adição do iterador, os iteradores serão modificados a qualquer momento e de qualquer maneira, e o iterador será Jogue a ConcurrentModificationException. Portanto, diante da modificação da simultaneidade, o iterador rapidamente falhou completamente, em vez de arriscar o comportamento incerto arbitrário a qualquer momento no futuro.
Observe que não podemos garantir que o iterador falhe.
Para resumir o código de introdução e instância no abrangente anterior, podemos saber que, se envolver pilhas, filas etc., devemos considerar o uso da lista. Para operações como inserção rápida e elementos de exclusão, o LinkedList deve ser usado. Se você precisar acessar os elementos rapidamente, use o ArrayList. Se o programa for realizado em um ambiente único ou acessar apenas em um thread, considerando classes não shocronizadas, ele é eficiente. Se vários threads podem operar uma classe ao mesmo tempo, a classe síncrona deverá ser usada. Preste atenção especial à operação da tabela de hash e o objeto dos iguais e hashcode como chave é escrever corretamente os métodos iguais e hashcode. Tente retornar a interface em vez dos tipos reais, como a lista de retorno em vez de ArrayList, para que, se o ArrayList precisar ser substituído pelo LinkedList no futuro, o código do cliente não precisa alterar.
Este artigo é apenas para o compartilhamento do nível de aplicativo.