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
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.
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.