Posts com Tag ‘HashMap’

A interface Map possui um método que nos ajuda e muito na hora de fazer iterações que necessitam tanto da PK quanto do valor, chamado então de: entrySet()

Esse entrySet é uma implementação do Map.Entry que vem para otimizar a velocidade das consultas de tal forma que traga os valores e a chave sem se preocupar com necessariamente com hash’s.

A importância deste é para quando se realiza iterações de alta escala e se requer muitos registros dentro desse mapa e com isso se gera uma boaaa otimização.

Outro ponto é nunca instanciar o mapa para copiar valores e depois remover, como exemplo:

Map<Integer, String> mapCopy = new HashMap<Integer, String>(map);
mapCopy.keySet().retainAll(keySetFilter); //nunca!! muito lento!

Façam a cópia filtrando com if’s/contains adicionando ao novo mapa e com isso ganham mais da metade em performance e CPU Time.

Então pessoal, as pessoas não sabem exatamente como utilizar e quando utilizar cada uma dessas coleções (excluindo os maps) que são mapas e não coleções.

List é uma interface referente a listas de objetos, essas listas tem característica de poder ter dados duplicados independente de serem iguais e de mesma instância.

Set são coleções que agregam dados sem duplica-los, ou seja, não existem dados iguais no Set, já são removidos por padrão.

Map são mapas de chave/valor, muito utilizado para guardar dados genéricos e de fácil acesso.

Vamos colocar agora as implementações especificas de cada coleção/mapa para que possa ficar claro a motivação de usar cada um.

Lists

ArrayList – São Arrays que implementam a interface List e todos os seus métodos, dão a facilidade de manipular o seu tamanho a qualquer momento, ou seja, aumentão e diminuem seu tamanho dinamicamente (automaticamente). Não são sincronizados, para sincroniza-los é necessário fazer um wrapp como a seguir:

É permitida a inserção do null.

List<?> list = Collections.synchronizedList(new ArrayList<?>());

Exemplos:

List<JFrame> frames = new ArrayList<JFrame>();
List<Component> components = new ArrayList<Component>();
List<Integer> ints = new ArrayList<Integer>();

LinkedList – Essa coleção possui caracteristica de que seus elementos sempre vão manter a ordem de inserção, ou seja, se inserir 1,2,3,4,5,6 nela, quando iterá-la terá seus elementos da MESMA forma que foi inserido.

É permitida a inserção do null também.
Exemplos:

List<JFrame> frames = new LinkedList<JFrame>();
List<Component> components = new LinkedList<Component>();
List<Integer> ints = new LinkedList<Integer>();

Sets

HashSet – HashSet é uma coleção não ordenada (totalmente desordenada) que não se pode pegar valores com get(index), e só com os métodos: set.iterator(); iterator.hasNext(); iterator.next();

Os HashSets usam o retorno do método hashCode() das classes Object (suas filhas a implementam de acordo), visando uma velocidade por comparação de hashs, e não por igualdade de referencia, etc…

Exemplos:

Set<JFrame> frames = new HashSet<JFrame>();
Set<Component> components = new HashSet<Component>();
Set<Integer> ints = new HashSet<Integer>();

LinkedHashSet – Este é muito muito parecido com o LinkedList só que com a diferença de trabalhar como um Set e não como um List, sendo assim ele herda essas caracteristicas e adiciona a “ordenção” por inserção;

Exemplos:

Set<JFrame> frames = new LinkedHashSet<JFrame>();
Set<Component> components = new LinkedHashSet<Component>();
Set<Integer> ints = new LinkedHashSet<Integer>();

TreeSet – Este é um Set ordenado de forma natural ou utilizando um Comparator que pode estar implementado na classe ou ser passado como implementação anônima no construtor do mesmo.

Exemplos:

Set<JFrame> frames = new TreeSet<JFrame>(new Comparator<JFrame>() {
//implementa métodos;
} );
Set<Component> components = new TreeSet<Component>(); //usa comparator da classe;
Set<Integer> ints = new TreeSet<Integer>(); //usa ordenação natural

Maps

HashMap – Mapa de Chave/Valor (key/value) utilizando os hashCode das classes para criar suas “bandejas/baldes” da mesma forma que é feito no HashSet. Muito usado para criar propriedades em sistemas ou divisão de items por valor (agrupamentos);

Exemplos:

Map<String,JFrame> frames = new HashMap<String,JFrame>(); // "Tela 1" = JFrame1 / "Tela 2" = JFrame2
Map<Integer, Set<Integer>> ints = new HashMap<Integer, Set<Integer>>(); // 1 = 1,2,3,4,5,6 / 2 = 3,4,6,8,10

LinkedHashMap – Esse basicamente visa mater a ordem de inserção como as outras Listas e Sets linkados.

Map<String,JFrame> frames = new LinkedHashMap<String,JFrame>(); // "Tela 1" = JFrame1 / "Tela 2" = JFrame2
Map<Integer, Set<Integer>> ints = new LinkedHashMap<Integer, Set<Integer>>(); // 1 = 1,2,3,4,5,6 / 2 = 3,4,6,8,10

Ou seja, entre Hashs e LinkedHash, para quem não entendeu a parte de ordenação:
– Se você iterar entre os Hash’s e imprimir verá que eles vem em ordem aleatória.
– Se você iterar entre o LinkedHash’s e imprimir verá que eles mantém a ordem de inserção.

P.S.: Desculpem, se existir alguma alma que acompanhe o blog, a falta de postagem, as coisas estão corridas.
P.S.²: Cometem, assim posso saber se o que estou divulgando está tendo alguma importância ou se falta algum conteúdo que seja interessante para vocês.