Conjuntos (postagem 1 de 2)
Autor: Gustavo | Publicado: 2015-03-23T19:09:00-03:00


&nbsp; &nbsp; &nbsp;Quando
codificamos em OO,  vemos a necessidade durante o desenvolvimento de
nossas aplicações, trabalharmos com lista de objetos. Até ai não
é surpresa pra ninguém... Um campeonato de surf exige ter uma lista
de surfistas incritos assim como qualquer campeonato. Uma turma de
uma escola em uma sala de aula irá sempre ter uma lista de alunos,
professores, livros, cadernos...

&nbsp; &nbsp; &nbsp;Na
tecnologia Java, temos vários tipos de listas diferentes cada uma
com uma finalidade e entenderemos o motivo durante os próximos
capítulos desta novela que comeca agora...

 Antes
de tudo vemos que é necessário realizar ações comuns em uma lista
tais como:


Adicionar
 itens


Remover
 itens


Saber
 se a lista possui tal item


Iterar
 sobre a lista


Obter
 um item da lista





&nbsp; &nbsp; &nbsp;Uma
vez que temos váriadas listas com suas particularidades, é sempre
útil sabermos qual os benefícios que uma lista poderá trazer e
qual a nossa necessidade afim de trazer para a nossa aplcação um
melhor desempenho para encontrar um item em nossa lista e obtermos
uma informação que desejamos.

&nbsp; &nbsp; &nbsp;Por
conta disto iremos comecar explicando quais são estas listas e
explicarei cada uma delas.

Nossa
API de conjuntos comeca com um grupo de sete interfaces são elas:


Collection


List


Map


Queue


Set


SortedSet


SortedMap





As
interfaces acima possuem suas respectivas classes concretas que as
implementam são elas:


HahSet


Linked
 HashSet


TreeSEt


ArrayList


Vecto


LinkedList


Priority
 Queue


HashTable


LikedHashMap


HashMap


TreeMap





Para
melhor entender, veremos nos quadros abaixo estas classes concretas
com suasseguintes interfaces:



 
 
 
 
 
 
 
 

  
Collection&lt;interface&gt;

 

  
Set&lt;interface&gt;

  
List&lt;interface&gt;

  
Queue&lt;interface&gt;

 

  
HashSet

  
Linked
   HashSet

  
Sorted
   Set&lt;interface&gt;

  
ArrayList

  
Vector

  
LinkedList

  
Priority
   Queue

 

  
Tree
   Set

 






 
 
 
 
 

  
Map
   &lt;Interface&gt;

 

  
HashTable

  
LinkedHashMap

  
HashMap

  
SortedMap&lt;Interface&gt;

 

  
TreeMap

 




 
 
 

  
Object

 

  
Array

  
Collections

 




&nbsp; &nbsp; &nbsp;Vale
ressaltar para não confundirmos a diferenca entre Collection com
Collections, em quanto a
primeira é uma interface ao importar java.util.Collection e que
possui outras interaces que a exendem tais como Set, List e Queue. A
segunda citada que se encontra no plural e da biblioteca
java.util.Collections
que possui vários métodos acessíveis como utilitários afim de
facilitar nosso manuseio com qualque conjunto(lista)
que nada mais é que qualquer
estrutura que armazena vários itens.

 Em
geral, os conjuntos que possuimos poderão ser classificados em 3
formas diferentes são eles:


Não-Classificada
 e Não-Ordenada


Ordenada
 e Não-Classificada


Ordenada
 e Classificada





Obs.:
Não encontramos a classificação e não ordenação por motivos
óbvios, uma classificação já seria um tipo de ordenação :)



&nbsp; &nbsp; &nbsp;Mesmo
assim para melhor prosseguirmos a leitura, irei definir o aqui os que
seria uma ordenação e uma classificação para dar prosseguimento
as  características de cada tipos de lista de acordo com suas
interfaces.



Ordenação:
Dizemos que um conjnto possui uma ordenação quando possuem uma
ordem ao serem armazenados
no conjunto. Mesmo
assim ao iteramos pelo
conjunto (percorrermos cada item de um conjunto por meio de loops),
poderemos ter saídas diferentes mesmo que não tenha realizado
alguma alteração
no mesmo.
Sua ordem é definida pelo método hashCode
que descrevemos no post anterior. Alguns
conjuntos mantém sua ordem e sua classificação que é considerado
como natural dos
elementos,
definida
a
partir do momento em que os
elementos são
inseridos no conjunto já outros casos podemos ver conjuntos que
habilitam
ao programador a inserir
um elemento em
uma posição especifica do índice.



Classificação:
Quando
um conjunto possui a característia de ser classificado, é porque
ele aplica regras no momento que um elemento é inserido em seu
contexto. Isso faz obtermos uma listagem dos seus elementos igual
sempre que realizarmos iterações. Uma classificação  poderá ser
alfabética(A-Z) ou numérica(1-10...) quando utilizamos elementos
texto ou inteiros, mas em caso de armazenarmos na nossa lista um
elemento que é uma classe que criamos,  não há como saber ao menos
que utilize uma
da(s)
interface(s)
Comparable
ou Comparator que
define como as instâncias de uma classe poderão ser comparadas
entre si.

 Falarei
agora sobre algumas das interfaces mencionadas anteriormente para
depois entrar a fundo nas formas de classificalção de um conjunto.





LIST




&nbsp; &nbsp; &nbsp;A
interface List é implermentada por três classes ArrayList,
Vector e LinkerdList. Todas são classificadas como listas
ordenadas e não classificadas. Sua ordenação é feita pelos
índices que são definidos  no momento  da inserção de um elemento
em seu conjunto.



 ArrayList
– De preferência a este tipo de conjunto na necessidade de rapidez
durante a iteração e acesso aleatório de um elemento. É possível
pelo método get(int indice)
obter o índice diretamente e inserir outro elemento em um indice
específico, caso não especefique o índice do elemento que será
inserido, seu  índice será o último de seu conjunto de elementos.

 Vector
– Muito semelhante ao ArrayList, mas perde um pouco no desempenho
uma vez que ele é serializado. É um conjunto  antigo assimo como
HashTable que acaba não sendo muito utilizado por ser recomendável
e eficiente
utilizar de formas de serialização já passadas neste blog do
que confiar em sua serialização.

 LinkeList
– Seus elementos são encadeados entre si, além de ordenados como
os outros dois conjuntos que acabamos de falar. Esse ecadeamento
ocorre por implementar a interface implementar Queue
contendo os métodos
peek, poll e offer implementados, fazendo uma melhor opção em caso
de haver necessidade de grande número de inserções e exclusões
sem a iteração entre elementos. 





SET




&nbsp; &nbsp; &nbsp;Esta
interface também implementada por outras três classes HashSet,
LinkedHashSet e TreeSet.
Estes conjuntos não permitem
elementos duplicados em sua lista de elementos. Quanto melhor for
elaborado o codigo dos
métodos hashCode()
e equals()
mais rápidos os seus elementos
serão encotrados em uma
busca. Mas caso não
sobrescreva, problemas de múltiplos objetos que deveriam ser
considerados como
iguais não irão ocorrer.

&nbsp; &nbsp; &nbsp;Por
haver necessidade de percorrer os dois métodos antes de uma inserção
ou iteração, são opções que podem também ser custas na
aplicação.

 HashSet
– São
conjuntos não-classificados e não-ordenados que
trazem beneficios já descritos de acorco com classes que implementam
a interface Set e trazem eficiencia na busca de elementos de acordo
com a qualidade de seu algorítmo de hashCode.



  ArrayList&lt;Surfista&gt;surfistas
= (ArrayList&lt;Surfista&gt;)             Surfista.mockSurfistas();

  HashSet&lt;Surfista&gt;
sets1
= new
HashSet&lt;Surfista&gt;();

  System.out.println("Antes:
ArrayList - "+surfistas.size());

  System.out.println("Antes:
HashSet - "+sets1.size());

  sets1.addAll(surfistas);

  System.out.println("Durante:
ArrayList - "+surfistas.size());

  System.out.println("Durante:
HashSet - "+sets1.size());

  surfistas.add(new
Surfista("Gabriel
Medina",
"Medina",
19, 1));

  sets1.add(new
Surfista("Gabriel
Medina",
"Medina",
19, 1));

  System.out.println("Depois:
ArrayList - "+surfistas.size());

  System.out.println("Depois:
HashSet - "+sets1.size());

Saida:



Antes:
ArrayList - 6

Antes:
HashSet - 0

Durante:
ArrayList - 6

Durante:
HashSet - 6

Depois:
ArrayList - 7

Depois:
HashSet - 6





 LinkedHashSet
– Conforme o nome sugere, é um HashSet com link,
este
link seria informar uma ordenação, trazendo benefícios na iteração
da lista. Esta ordenação é definida de acordo com a ordem em que
seus elementos foram inseridos.

 TreeSet

- Assim
como o TreeMap que
veremos logo em seguida, é um conjunto classificado pela árvore
rubro-negra:





Árvore
vermelha e preta (rubro-negra):
Bem
semelhante a árvore binária que
possuem operações de (inserção, remoção e busca) com
alguns adentos que seriam suas
“flags” de balanceamento que são alguns bits extras em cada nodo
que determina se o nodo é vermelho ou preto e outro informando se é
filho esquerdo ou filho direito do nodo pai.



































Map




&nbsp; &nbsp; &nbsp;Apesar de também não possuirem ordenação e classificação em sua
maioria, possuem identificadores que facilitam na busca de algum
elemento em seu conjunto de elementos. Suas classes implementadoras
são as HashMaps, Hashtable, LinkedHashTable e TreeMap.


 HaspMap
– Assim
como HashSet, é essencial que implemente com eficiência o método
hashCode(),
seu diferencial é obter chaves que irão facilitar ainda mais na
busca de um elemento em seu conjunto.

 Hashtable
– Por mais que possa parecer estranho o “t” é minúsculo
mesmo, esta classe assim como o Vector é uma das mais antigas da
linguagem Java. Pois não é a toa que mencionei ele aqui.Vector está
para ArrayList assim como Hashtable está para HashMap. Então
podemos dizer que ela é simplesmente uma vesão sincronizada de
HashMap.
Uma observação importante também é que diferente de HashMap,
Hashtable não permite que atribua valores nulos as suas chaves.

 LinkedHashMap
– Podemos
dizer que muita coisa agora passa a ser fácil de imaginar se
pensarmos um pouco no comportamento das classes de acordo com suas
nomeclaturas. Esta classe é  basicamente o HashMap com uma ordenação
assim como LinkedHashSet é para HasSet podemos fazer um paralelo
entre LinkedHashMap para HashMap.

 TreeMap
–
Já mencionamos um pouco dela durante
a TreeSet, esta classe é um conjunto classificado de Map de acordo
com as ordem natural de chegada de elementos no conjunto. Uma vez que
trabalhamos aqui com elementos de objetos e não Strings e Inteiros,
veremos adiante como ordenar objetos usando as classes Comparator
e Comparable.

 


Queue




&nbsp; &nbsp; &nbsp;Seguindo a metodologia FIFO (First
in First Out) esta
interface que
foi disponibilizada a
partir do java 5 , e que já
possui a classe LinkedList a
implementando. Tem sua classe PriorityQueue
que possui
alguns aprimoramentos,
que
fornece não somente os métodos que manipulam com eficiência a
inserção e remoção de elementos em um conjuto, uma ordenação
com uma prioridade como uma
identificação para melhor busca de seus elementos parecido
com as classes
implementadoras de Map
onde se tem como
possibilidade a utilização das classes Comparator
e Comparable para
definirmos que objeto vem antes do outro.






&nbsp; &nbsp; &nbsp;Este
post foi útil para definirmos as teorias de conjuntos reservarei o
próximo para continuar o assunto aqui abordado mas mostando alguns
exemplos para melhor vemos o desempenho,