COLEÇÕES

 

Caso não tenha conhecimento a respeito de Collections, entre no link a seguir e, depois, retorne a esta página: Coleções.

Set

 

Na API Collection existem três principais tipos de interfaces, Set, List e Map. Nesse tópico a interface Set será abordada.

 
 

Imagine que você esteja colecionando figurinhas da Copa do Mundo de 2010. Com o passar do tempo você percebe que está com muitas figurinhas repetidas, então você começa a separar as figurinhas repetidas com a ajuda de um amigo, porque assim a separação será muito mais rápida. Terminado isso, agora vocês querem organizá-las de algum jeito, porque elas estavam de uma forma muito confusa de se ver.

 

Agora a sua coleção de figurinhas está organizada e sem repetição! E tudo isso foi feito de uma forma rápida e eficiente com a ajuda do seu amigo. A interface Set pode possibilitar a mesma coisa para suas coleções em Java.

 
 

A interface Set é uma coleção que não permite duplicatas, ou seja, é impossível a adição de objetos iguais na coleção. Os métodos hashCode() e equals() garantem que objetos iguais não serão aceitos. Esses dois métodos são de implementaãão obrigatória. Outra característica do Set é que não é garantida a ordenação dos objetos, logo não é possível fazer a indexação dos elementos por índice numérico, como é feito na List.

 

Duas classes que implementam o Set:


HashSet

Ela tem um acesso rápido para leitura e escrita, porém não garante a ordem de inserção. Também não é garantido que a ordem permanecerá constante com o tempo.

 
	public static void main(String args[]){
	
			Set<String> mesesHash = new HashSet();
	
			mesesHash.add("Janeiro");
			mesesHash.add("Fevereiro");
			mesesHash.add("Março");
			mesesHash.add("Abril");
			mesesHash.add("Maio");
			mesesHash.add("Fevereiro"); 
		
			System.out.println("HashSet:");
			System.out.println(mesesHash);
	}



 

Aqui foi criada uma coleção HashSet que irá adicionar meses do ano. Perceba que a ordenação não foi mantida.


LinkedHashSet

Ela é um pouco mais lenta do que o HashSet, porém a ordem de inserção é mantida. Ela usa características do HashSet (como utilizar a tabela Hash). É mantida uma lista duplamente encadeada que mantém a ordenação.

 
   	public static void main(String args[]){
	
			Set<String> mesesLinked = new LinkedHashSet();
		
			mesesLinked.add("Janeiro");
			mesesLinked.add("Fevereiro");
			mesesLinked.add("Março");
			mesesLinked.add("Abril");
			mesesLinked.add("Maio");
			mesesLinked.add("Fevereiro");
		
			System.out.println("LinkedHashSet:");
			System.out.println(mesesLinked);
			
	}

 

O mesmo exemplo de antes só que agora com o LinkedHashSet. A ordem de inserção foi mantida.

 

Map

 

Interface que define um array associativo, isto é, ao invés de números, objetos são usados como chaves para se recuperar os elementos. As chaves não podem se repetir (seguindo o mesmo princípio da interface Set), mas os valores podem ser repetidos para chaves diferentes. Um Map também não possui necessariamente uma ordem definida para a iteração.

 

 

 

 

Na imagem acima, encontra-se o mapa do Brasil. Repare que nele é possível encontrar as siglas de cada estado, onde, na legenda abaixo, encontra-se a sua descrição. Com a coleção MAP, aconteceu da mesma forma, onde o Key será como as siglas e o Value será como a descrição que se encontra na legenda.

 

LinkedHashMap: Implementação de Map que estende HashMap, mas adiciona previsibilidade a ordem de iteração sobre os elementos, isto é, uma iteração sobre seus elementos (utilizando o Iterator) mantém a ordem de inserção (a inserção de elementos duplicados não altera a ordem anterior). Internamente, é mantida uma lista duplamente encadeada que mantém esta ordem. Por ter que manter uma lista paralelamente a tabela hash, a modificação deste tipo de coleção acarreta em uma leve queda na performance em relação a HashMap, mas ainda a mais rápida que uma TreeMap, que utiliza comparações para determinar a ordem dos elementos.

 
   

	import java.util.LinkedHashMap;
	import java.util.Iterator;
	import java.util.Map;
	import java.util.Set;
				 
	public class MapExemplo {
				 
		public static void main(String[] args) {
				 
			Map mp = new LinkedHashMap();
				 
			mp.put(new Integer(2), "Dois");
			mp.put(new Integer(4), "Quatro");
			mp.put(new Integer(1), "Um");
			mp.put(new Integer(3), "Três");
				 
			Set s = mp.entrySet();
				 
			Iterator it=s.iterator();
				 
			while(it.hasNext())
			{
				Map.Entry m =(Map.Entry)it.next();
				int key=(Integer)m.getKey();
				String value=(String)m.getValue();
				System.out.println("Key :"+key+"  Value :"+value);
			}
		}
	}
 
		
 

Hashtable: Assim como o Vector, a Hashtable é um legado das primeiras versões do JDK, igualmente sincronizado em cada uma de suas operações. Pelos mesmos motivos da classe Vector, dá preferência a outras implementações, como a HashMap, LinkedHashMap e TreeMap, pelo ganho na performance.

 
			   
	import java.util.Hashtable;
	import java.util.Iterator;
	import java.util.Map;
	import java.util.Set;
				 
	public class MapExemplo {
				 
		public static void main(String[] args) {
				 
			Map mp = new Hashtable();
				 
			mp.put(new Integer(2), "Dois");
			mp.put(new Integer(4), "Quatro");
			mp.put(new Integer(1), "Um");
			mp.put(new Integer(3), "Três");
				 
			Set s = mp.entrySet();
				 
			Iterator it=s.iterator();
				 
			while(it.hasNext())
			{
				Map.Entry m =(Map.Entry)it.next();
				int key=(Integer)m.getKey();
				String value=(String)m.getValue();
				System.out.println("Key :"+key+"  Value :"+value);
			}
		}
	}
 
		
 

Enum (Enumerador)

 

Neste tópico será abordado o uso de Enum, como ele funciona e quais são suas características. Quando bem usado ele pode ser uma mão na roda de qualquer desenvolvedor.

 

Imagine que você esteja fazendo uma aplicação para uma famosa montadora de carros. Seu programa está funcionando corretamente e pronto para ser entregue, mas de repente o cliente decide que os carros podem vim na cor cinza ou preta. Você altera seu código inteiro, tem um trabalho braçal a mais, e por fim termina de fazer a alteração. O cliente não satisfeito pede que você faça outra alteração. Agora eles fabricam carros nas cores azul e branca. O que fazer? Alterar seu código inteiro de novo e ter todo aquele trabalho? Você pode fazer isso ou você pode usar um enumerador (Enum) e reduzir muito o seu trabalho.

 
 

Enum é uma palavra reservada do Java que permite a criação de uma estrutura de valores fixos predefinidos e imutáveis (static final). Todos os tipos de enum implicitamente estendem a classe java.lang.Enum. Ele foi criado na versão 5 do Java, e é conhecido por ser type-safe (tipo seguro).

 

A função principal do Enum é organizar valores que tenham o mesmo sentido dentro de uma estrutura. Exemplo: Cores, comidas, dias da semana.


Características:
  • Enum não é instanciável (não há como usar o new)
  • Por não ser instanciável o único jeito de acessar os valores do enum é estaticamente. Por exemplo: cor.VERMELHO (cor é o enum, e vermelho um dado do enum)
  • O método construtor dele é definido como private
  • Por convenção, por enum ter dados constantes e imutáveis (static final) os nomes declarados devem estar em letra maiúscula.

   public class Carro{

		private String modelo;
		private int cavalos;
		private double preco;
		private EnumCor cor;
   
		public Carro(String modelo, int cavalos, double preco, EnumCor cor) {
				this.modelo = modelo;
				this.cavalos = cavalos.
				this.preco = preco;
				this.cor = cor;
		}
   	  
		public String toString(){
				return"Carro [modelo=" + modelo + ",
					cavalos=" + cavalos + ", preco="
					+ preco + ", cor=" + cor + "]";
		}   
 
 

Aqui está apenas uma classe simples que irá ser o objeto Carro.

 
   public Enum EnumCor {
   		CINZA,PRETO,AZUL,BRANCO;
   	}

 

O nosso enum para as cores do carro.

 
   public static void main(String[] args) {
   		Carro carro = new Carro("Fusca",46,1000,EnumCor.CINZA);			
		System.out.println(carro.toString());
   	}
 

Nesta parte do código, foi criado um método Main para rodar a aplicação. Nele foi instanciado um novo objeto Carro, e já foram passados os atributos para o método construtor. Observe que o atributo do enum foi acessado diretamente (Enum.ATRIBUTO).

 

Agora tente adicionar mais uma cor no Enum e crie um novo Carro na Main com a sua nova cor. Você verá como é fácil manipular Enum.

 

Atividade de Fixação

 

No intuito de fixar a aprendizagem iniciada por meio deste módulo e verificar como está sua compreensão sobre o mesmo, são sugeridos alguns exercícios de fixação para serem resolvidos. Clique no link de exercícios ao lado, pois será por meio dele iniciada a lista de exercícios sobre os conteúdos estudados até este momento.