Apresentação O Curso Java Starter foi projetado com o objetivo de ajudar àquelas pessoas que têm uma base de lógica de programação e desejam entrar no mercado de trabalho sabendo Java, A estrutura do curso é formada por módulos em PDF e por mini-cursos em vídeo. O aluno deve baixar esse material e estudá-lo. Deve realizar os exercícios propostos. Todas as dúvidas devem ser enviadas para a lista de discussão que está disponível para inscrição na página do Curso Java Starter no site www.t2ti.com. As dúvidas serão respondidas pelos instrutores Albert Eije, Cláudio de Barros e Miguel Kojiio, além dos demais participantes da lista. Nosso objetivo é que após o estudo do Curso Java Starter o aluno não tenha dificuldades para acompanhar um curso avançado onde poderá aprender a desenvolver aplicativos para Web, utilizando tecnologias como Servlets e JSP e frameworks como Struts e JSF, além do desenvolvimento para dispositivos móveis. Albert Eije trabalha com informática desde 1993. Durante esse período já trabalhou com várias linguagens de programação: Clipper, PHP, Delphi, C, Java, etc. Atualmente mantém o site www.alberteije.com. Cláudio de Barros é Tecnólogo em Processamento de Dados. Miguel Kojiio é bacharel em Sistemas de Informação, profissional certificado Java (SCJP 1.5).
na verdade todas as funcionalidades implementadas no framework "Collections" podem ser obtidas através de uma implementação própria. esperadas quando Coleções Dada sua importância. Mas o que é o framework "Collections"? É o conjunto de implementações (classes e interfaces) oferecidas no pacote java. obtemos os seguintes benefícios: Redução na codificação: Muitas funcionalidades esperadas durante a manipulação de um conjunto de elementos já estão prontas. na prática implementações próprias são difíceis de encontrar – afinal de contas tempo é um recurso valioso e o reuso é um dos pilares da orientação a objetos. Em síntese. ou seja.Curso Java Starter Módulo 09 O Framework Collections funcionalidades (coleções). você pode até fazer a sua própria Lista. ✔ Maior qualidade do programa: Respeitando as interfaces podemos www.com 3 . neste sentido o framework "Collections" surgiu com a intenção de formar uma arquitetura unificada para representação e manipulação de coleções. Fila ou Árvore mas sabe que isto já está pronto e acessível neste framework. mas o que este framework me permite fazer que eu não conseguiria com os vetores (arrays) convencionais? Nada. coleções (estruturas de dados) são encontradas em qualquer linguagem de programação e em Java as coleções recebem um tratamento especial. lembra-se?. ✔ ✔ Melhor desempenho do programa: As implementações das funcionalidades e estruturas de armazenamento foram feitas com o objetivo de fornecerem um desempenho ótimo.util que fornecem as principais trabalha-se com conjuntos de elementos Legal.util.t2ti. ao utilizarmos as coleções já implementadas no pacote java.
.. List: ArrayList. List ou Queue é um tipo de Collection.    www. É interessante notar que apesar da "arquitetura única" as coleções derivadas da interface Map não implementam a interface Collection no entanto elas também fazem parte do pacote de implementações Java para coleções. Existem outros benefícios porém. Vector e LinkedList. Tudo bem. cada um com suas particularidades. Já um Map não é do mesmo tipo dos demais mas também manipula coleções de elementos" As implementações de cada ramo estão dividas da seguinte forma: Set: HashSet. tempo é um recurso escasso.Curso Java Starter substituir as implementações utilizadas sem prejuízo ao resto do programa. Esta arquitetura de interfaces forma o núcleo do Java Framework Collections e todas as classes concretas irão derivar de uma ou mais interfaces. é importante reutilizar código. para o iniciante – nosso caso – o entendimento destes é mais do que suficiente. A figura apresentada pode ser interpretada da seguinte forma: "Um Set. LinkedHashSet e TreeSet. as implementações fornecidas são ótimas. Queue: LinkedList e PriorityQueue.com 4 . Nas folhas (retângulos com bordas mais espessas) encontramos as classes concretas ou implementações destas interfaces.t2ti. entendi. Mas o que você quis dizer quando falou da "arquitetura unificada"? A resposta encontra-se na próxima figura: Nesta figura temos as interfaces (raízes e nós das árvores) que formam o conjunto de interfaces disponíveis.
Muito interessante tudo isto mas. normalmente elementos em ordem de processamento. na prática. Queue: Parecida com a interface List porém adiciona algumas  funcionalidades. é muito utilizada para representar listas de elementos cuja ordem é importante. Então vamos lá: Set: Representa uma coleção que não pode conter duplicatas.  implementa uma abstração dos conjuntos matemáticos.out. Quando estes operadores são utilizados. A compreensão das funcionalidades de cada uma das interfaces e implementações representa a parte mais importante deste módulo. podem ter efeitos desastrosos se não forem corretamente aplicados. os principais benefícios obtidos com o uso de cada grupo de interfaces e respectivas implementações.Curso Java Starter  Map: Hashtable. quando devo utilizar uma ou outra implementação? Qual a diferença entra cada uma destas interfaces? A seguir serão explicados. o que está sendo comparado é a referência do objeto. obteremos como saída www. == e != . Nós iniciaremos esta jornada investigando a interface Set porém antes de começarmos precisamos conhecer um pouco dos métodos equals() e hashcode() da classe Object e suas funções. caso o código seja executado.//Imprime false No exemplo anterior. LinkedHashMap. esta operação irá retornar verdadeiro (true) apenas se as duas referências são do mesmo objeto. na verdade. equals() Quando nós estamos trabalhando com objetos os operadores de igualdade. HashMap e TreeMap.  Map: É um objeto que armazena um elemento e o remove através da sua chave.println(new String("Pedro") == new String("Pedro")).t2ti. isto é. Um exemplo desta situação é o seguinte: System.com 5 . os Maps não aceitam chaves duplicadas. simplificadamente.  List: Representa uma coleção ordenada (ordem de inserção) e que permite duplicatas.
Criar classe NotaFiscal com atributos código. valor e data. www. e sobreescreva o método equals de forma que duas notas fiscais sejam consideradas iguais apenas se seus códigos forem idênticos.println(new String("Pedro"). Pessoa – CPF. Ao utilizar o método equals() nós estamos verificando se os dois objetos são significativamente iguais (equivalentes). A fim de clarificar o que foi dito acompanhe o exercício a seguir. ou seja o valor "Pedro". Ou seja cada uma das partes da operação refere-se a um objeto diferente porém. Exercício resolvido Crie uma classe que represente notas fiscais com código. Sobreescrever método equals de forma que compare os códigos. Isto acontece.Calendar. Sendo assim ao sobreescrevermos o método equals() devemos observar estes identificadores e implementar o método a fim de realizar os testes de igualdade sobre este(s) atributo(s).Date. no contexto da computação.equals(new String("Pedro"))). Resolução: 1.t2ti. A maioria das coisas (objetos) que importam. pois conforme explicado anteriormente. sobre objetos.util. valor e data. Fatura – código.util. Nota fiscal – número/série. import java. possuem algum identificador único ou alguma forma de identificação única. Ex: Carro – placa/renavam. Município – Código do IBGE. Para resolver este problema basta substituir o código acima por: System. O importante é que você compreenda que ao utilizar os operadores de igualdade.out. do mesmo tipo String e com o mesmo valor "Pedro". 2. isto acontece pois agora o que está sendo comparado é o conteúdo de cada objeto String.//Imprime true Neste exemplo o resultado obtido será true.Curso Java Starter "false". Produto – código de barras e etc. import java. (== ou !=) o que você está verificando é se as duas referências fazem alusão ao mesmo objeto. estamos comparando as referências e não o conteúdo das Strings (que são idênticos).com 6 . Empresa – CNPJ.
wikipedia.println("nf1 igual a nf3: "+nf1. private Date dataEmissao.dataEmissao = dataEmissao.getTime() . //atribui a data da emissao this.out.getCodigo().Curso Java Starter public class NotaFiscal { private Integer codigo.getTime() .123456.getCodigo())) { return true. //Criacao da nota fiscal 3 NotaFiscal nf3= new NotaFiscal(1. Calendar.0 ).equals(nf2)).//resulta false System. System. Double valor) { super().valor = valor. //Construtor parametrizado public NotaFiscal(Integer codigo.com 7 .out.0 ). //Criacao da nota fiscal 2 NotaFiscal nf2= new NotaFiscal(2.println("nf1 igual a nf2: "+nf1.//atribui o valor } //metodo equals public boolean equals(Object obj) { //Verifica se o objeto é da classe NotaFiscal e verifica se os codigos são iguais //Se a resposta for afirmativa para os dois testes retorna verdadeiro (true) if((obj instanceof NotaFiscal) && ((NotaFiscal)obj).788955. }else { return false. } } //retorna o codigo da nota fiscal public Integer getCodigo() { return codigo.getInstance().equals(this. Date dataEmissao. private Double valor.555566. Calendar.org/wiki/Tabela_de_hashing www.codigo = codigo. this. Hashcodes* são utilizados para identificar objetos de forma que o acesso a estes se torne mais eficiente.0 ). Códigos de Hash ou Hashcodes são utilizados para aumentar a performance quando manipulamos grandes quantidades de objetos.equals(nf3)).getInstance(). Estes códigos são gerados por uma função de * Para saber mais visite http://pt.getTime() . } public static void main(String[] args) { //Criacao da nota fiscal 1 NotaFiscal nf1= new NotaFiscal(1.t2ti. Calendar. //atribui o valor do codigo this.getInstance().//resulta verdadeiro } } Resultado da execução desta classe: nf1 igual a nf2: false nf1 igual a nf3: true hashcode() Uma vez compreendida a importância do método equals() iniciamos os estudos para descobrir a função do método hashcode().
nestes casos devemos nos preocupar em criar funções que façam uma boa dispersão de códigos. qualquer obrigatoriamente. ou seja. prioridade e etc. já entradas iguais produzirão sempre o mesmo hashcode. Organização: Garante que a coleção sempre é percorrida em uma determinada seqüência não aleatória. desta forma o método hashCode() deve respeitar o método equals(). o resultado desta função é obtido de acordo com o valor (dado) de entrada. de acordo com o método equals(). decrescente. ou seja.Curso Java Starter espalhamento. índice e etc. Estas identificadas através implementação desta interface (Set) é altamente dependente de uma correta www. O ideal é que a função de espalhamento nunca produza o mesmo código hash para entradas diferentes porém isto nem sempre é possível. não aceita duplicatas em seu conjunto de elementos. interface. sempre que dois objetos forem iguais. obrigatoriamente o resultado obtido pelo método hashCode() deve ser igual para estes objetos. Ex: Ordem de inserção. ● ● SET Um duplicatas são Set.com 8 . Mais a frente iremos utilizar estas funções (hashcode() e equals()) na prática. Algumas definições Ordenação: Define que a coleção possui algum tipo de ordem determinada por regra(s). Ex: Crescente. É importante compreender que entradas diferentes podem produzir tanto hashcodes iguais quanto diferentes.t2ti. Caso o método hashCode() não respeite a implementação do método equals() poderemos ter problemas de desempenho e consistência nas nossas coleções. qualquer do implementação método equals(). Durante a explicação das coleções estas definições ficarão mais claras. desta logo.
O HashSet utiliza o hashcode como chave de identificação de cada um dos seus elementos então. quanto mais eficiente for a função de espalhamento mais eficiente será a sua pesquisa e no entanto. O HashSet caracteriza-se por não aceitar duplicatas. uma utilizando o código e outra retornando sempre o mesmo valor (pior função de espalhamento possível – afinal de contas não espalha www. A implementação do método equals() em desacordo com o universo a ser modelado pode fazer com que elementos diferentes sejam considerados iguais ou elementos iguais sejam tratados como diferentes. desenvolvida no E. isto é.t2ti. característica derivada do Set. estes métodos são comuns a qualquer implementação desta interface: Método add( Objeto ) remove( Objeto ) iterator() size() Descrição Adiciona um elemento ao nosso Set.com 9 .1. sobreescreva o método hashcode() duas vezes. não há nenhuma garantia quanto a ordem que os elementos serão percorridos. A seguir será apresentada a utilização do HashSet com uma implementação eficiente comparada a uma ineficiente.R. Alguns dos métodos mais utilizados quando manipulamos Sets. retorna true se o elemento foi removido Retorna um objeto do tipo Iterator Retorna um int (inteiro) com a quantidade de elementos da coleção Elimina todos os elementos do Set contains( Objeto ) Retorna true se o elemento já existe dentro do Set clear() HashSet Uma das implementações concretas da interface Set. Exercício resolvido Utilizando a classe NotaFiscal. se o método hashCode() não respeitar a implementação do método equals() poderemos ter elementos duplicatas no nosso Set.Curso Java Starter implementação do método equals(). . retorna true se o elemento foi inserido Remove o elemento da nossa coleção. ser uma coleção desordenada e desorganizada.
codigo = codigo. Criar um HashSet com 100.000 elementos e atribuir os códigos de acordo com a ordem de criação.util.equals(this. 5.Curso Java Starter nada). this.Set.000. retire o elemento com código 5.000 notas fiscais com códigos variando de 1 a 10. java.valor = valor. //atribui a data da emissao this.util.util. 3. www. utilizar o código como função de public class NotaFiscalHashSet { private Integer codigo. o método hashcode. 2.getTimeInMillis(). private Date dataEmissao.000 verificar o tempo total. Resolução: 1. utilizar uma função de espalhamento que retorne sempre o mesmo valor. } //metodo hashcode public int hashCode() { return codigo. } } //retorna o codigo da nota fiscal public Integer getCodigo() { return codigo. Double valor) { super().t2ti. Compare os tempos de cada remoção. //Construtor parametrizado public NotaFiscalHashSet(Integer codigo.Date. Sobreescrever o método hashcode. Date dataEmissao.//atribui o valor } //metodo equals public boolean equals(Object obj) { //Verifica se o objeto é da classe NotaFiscal e verifica se os codigos são iguais //Se a resposta for afirmativa para os dois testes retorna verdadeiro (true) if((obj instanceof NotaFiscalHashSet) && ((NotaFiscalHashSet)obj). //atribui o valor do codigo this. import import import import java. java. 4.com 10 .getCodigo().Calendar. private Double valor. java.//funcao de espalhamento retorna sempre o mesmo valor } //Retorna um long que identifica o tempo atual public static long getTempoAtual() { return Calendar. Remover o elemento de código 5.000. Repetir passos 2 e 3.getInstance().util.getCodigo())) { return true. Crie um HashSet e armazene 10.HashSet. Sobreescrever espalhamento.dataEmissao = dataEmissao.// }else { return false.//funcao de espalhamento retorna o valor do codigo //return 2.
e utilizando o for-each ou enhancedfor. organizada significa que existe algum tipo de seqüência não-aleatória durante a iteração dos elementos.0)). i < 10000. da mesma forma que o HashSet. 0.Curso Java Starter } public static void main(String[] args) { Set hashset = new HashSet(). neste caso a ordem de inserção é respeitada. hasNext() e remove()) porém de muita utilidade quando precisamos percorrer coleções. Devemos utilizar o LinkedHashSet ao invés do HashSet quando a ordem de iteração dos elementos é importante.0)). Já que falamos de iteração vamos apresentar duas formas de iteração de elementos de coleções: utilizando um Iterator.t2ti. Por ser um Set. Os www.getInstance().out. o LinkedHashSet não aceita duplicatas e. } //remocao dos elementos hashset.getInstance().println("Tempo total: "+(fim-inicio)+" ms"). é dependente da correta implementação do método equals(). Long fim = getTempoAtual(). Todas as implementações do Framework Collections fornecem um Iterator.remove(new NotaFiscalHashSet(5000.//impressao do tempo total } } Resultado obtido utilizando o hashcode baseado no código: Tempo total : 191 ms Resultado obtido utilizando o hashcode fixo (2): Tempo total: 11279 ms A partir dos resultados temos que. 0.com 11 . //Inicio da contagem do tempo for(int i = 0. utilizando uma função de espalhamento mais adeqüada o tempo total de pesquisa foi aproximadamente 60 vezes menor do que utilizando a pior função de hashcode possível. Calendar. espalhando para apenas um código. lembrando.add(new NotaFiscalHashSet(i. Calendar.//fim da contagem do tempo System. nesta situação. LinkedHashSet É uma versão organizada do HashSet. ● Iterator: É uma interface que fornece poucos métodos (next().//Criacao do HashSet Long inicio = getTempoAtual().getTime().getTime(). i++)//Iteracao sobre os elementos { //adicao dos elementos hashset.
Set.). java. ● For-Each: É um for adaptado a coleções e que percorre todos os elementos qualquer de coleção do Framework Collection.util.Curso Java Starter dois principais métodos serão apresentados a seguir. import import import import java.. //obtendo Iterator para HashSet //obtendo Iterator para LinkedHashSet Iterator itLinkedHashSet = linkedHashSet..//Criacao do HashSet Set linkedHashSet = new LinkedHashSet().Iterator. observe se a ordem de iteração é a mesma. } A estrutura deste for-each poderia ser lida da seguinte forma : "Para cada elemento do tipo Carro existente na minha coleção de Carro (carrosHashSet) faça isto".t2ti. public class IntegerLinkedHashSet { public static void main(String[] args) { Set hashSet = new HashSet().LinkedHashSet. java. //Adicionando elemento i ao hashSet linkedHashSet. Método hasNext() next() Descrição Retorna true se existe próximo elemento.. www. em ordem crescente.setPlaca(.add(i).iterator().. e percorra todos os elementos.HashSet. Retorna o próximo elemento na iteração. . //Criacao do LinkedHashSet for(int i = 0.util.com 12 .iterator().util. A seguir temos um exemplo: Set carrosHashSet = new HashSet(). Exercício resolvido Implemente um método que manipule uma coleção HashSet e outra coleção LinkedHashSet. i < 20. //Adicionando elemento i ao linkedHashSet } Iterator itHashSet = hashSet.add(i). Nós próximos exercícios as duas modalidades de iteração serão utilizadas e a observação do uso prático facilitará o entendimento. java.util. for(Carros carro : carrosHashSet) { carro. i++) //For para preencher as duas colecoes { hashSet. adicione a elas 20 números inteiros (Integer).
println) o proximo elemento de cada Iterator System.com 13 .println("HashSet: "+itHashSet.out. a partir do elemento seguinte. } } } Resultado encontrado: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: 0 LinkedHashSet: 0 1 LinkedHashSet: 1 2 LinkedHashSet: 2 3 LinkedHashSet: 3 4 LinkedHashSet: 4 5 LinkedHashSet: 5 6 LinkedHashSet: 6 7 LinkedHashSet: 7 8 LinkedHashSet: 8 9 LinkedHashSet: 9 10 LinkedHashSet: 10 11 LinkedHashSet: 11 12 LinkedHashSet: 12 13 LinkedHashSet: 13 14 LinkedHashSet: 14 15 LinkedHashSet: 15 17 LinkedHashSet: 16 16 LinkedHashSet: 17 19 LinkedHashSet: 18 18 LinkedHashSet: 19 Perceba que até o elemento 15 o HashSet vinha mantendo a ordem de inserção durante o processo de iteração dos seus elementos. TreeSet É um Set ordenado e como tal não aceita duplicatas. Percorra todos os elementos de cada uma delas e compare a ordem www. a ordem foi desrepeitada (linhas em negrito) enquanto isto. no Treeset os elementos inseridos serão percorridos de acordo com sua ordem natural e de forma ascendente. no LinkedHashSet. mas como dito anteriormente. ou seja existe alguma regra que garante a ordenação.hasNext() && itLinkedHashSet.hasNext()) { //Imprime (system. e insira o mesmo conjunto de inteiros em cada uma delas. LinkedHashSet e TreeSet).Curso Java Starter //Enquanto existir proximo elemento nos Iterators while(itHashSet.out.next()+ " LinkedHashSet: " +itLinkedHashSet.t2ti. Exercício resolvido Implemente um método que manipule as três modalidades de Set (HashSet. esta situação não é garantida e.next()). a ordem de inserção foi respeitada como era esperado.
//Criacao do TreeSet a partir do hashSet Iterator itHashSet = hashSet. hashSet.println("HashSet: "+itHashSet.add(12). public class IntegerLinkedHashSet { public static void main(String[] args) { Set hashSet = new HashSet(). hashSet. hashSet.add(54). //obtendo Iterator para TreeSet //Enquanto existir proximo elemento nos Iterators while(itHashSet.//Criacao do HashSet hashSet.iterator().add(12). hashSet.next()+ " TreeSet: "+itTreeSet.out.out.util.hasNext()) { //Imprime (system.add(147).add(45).add(465). } } } Resultado encontrado: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: 0 LinkedHashSet: 0 TreeSet: 0 100 LinkedHashSet: 100 TreeSet: 3 3 LinkedHashSet: 3 TreeSet: 5 5 LinkedHashSet: 5 TreeSet: 7 7 LinkedHashSet: 7 TreeSet: 10 10 LinkedHashSet: 10 TreeSet: 12 12 LinkedHashSet: 12 TreeSet: 21 465 LinkedHashSet: 465 TreeSet: 23 45 LinkedHashSet: 45 TreeSet: 29 21 LinkedHashSet: 21 TreeSet: 45 54 LinkedHashSet: 54 TreeSet: 54 23 LinkedHashSet: 23 TreeSet: 100 147 LinkedHashSet: 147 TreeSet: 147 29 LinkedHashSet: 29 TreeSet: 465 Antes de nos avaliarmos a ordem dos resultados.add(3).add(23). observe que durante a www.add(0).hasNext() && itTreeSet.Iterator. import import import import import java.HashSet.println) o proximo elemento de cada Iterator System.com 14 .add(7). java. //Criacao do LinkedHashSet a partir do hashSet Set linkedHashSet = new LinkedHashSet(hashSet). java.iterator(). hashSet. hashSet.add(100).t2ti.add(29).hasNext() && itLinkedHashSet. hashSet. java. hashSet. hashSet.add(10).Set.util.util.add(3). hashSet.add(21). hashSet. hashSet.iterator(). Iterator itTreeSet = treeSet.add(5).next()). java.util.//Adicionando valores aleatoriamente hashSet.util. //obtendo Iterator para HashSet //obtendo Iterator para LinkedHashSet Iterator itLinkedHashSet = linkedHashSet.TreeSet. hashSet. hashSet.LinkedHashSet.Curso Java Starter encontrada. Set treeSet = new TreeSet(hashSet).next()+ " LinkedHashSet: "+itLinkedHashSet.
ou seja. LIST A interface List garante que todas as suas implementações serão organizadas. Devemos utilizar um List quando a ordem de inserção ou a posição na coleção nos interessa.t2ti. Em implementações da interface List podemos são permitidas duplicatas. Nestes casos devemos informar que a nossa Classe (tipo) pode ser comparada. a ordem de inserção será mantida. especificamente o 3 e o 12 (linhas em negrito).. isto acontece pois. na última posição Retorna o elemento da posição do índice Retorna um objeto do tipo Iterator Retorna um int (inteiro) com a quantidade de elementos da coleção www.. eles não foram incluídos. Alguns métodos importantes quando manipulamos Lists: Método add( Objeto ) get( índice ) iterator() size() Descrição Adiciona um elemento ao List. existe uma preocupação com o posicionamento de cada elemento e esta posição é determinada pelo índice. ordenou de acordo com a ordem natural de cada um dos valores. objetos iguais de acordo com o método equals(). desta vez. – no entanto.Curso Java Starter fase de inclusao dos numeros no HashSet alguns deles se repetem. no entanto não temos garantia nenhuma de que este comportamento irá se repetir. porém no resultado estes números aparecem apenas uma vez cada um. na segunda tentativa de inclusão dos números 3 e 12. Em relação a ordem o HashSet. Isto é feito utilizando-se a interface Comparable.com 15 . na verdade. Já o TreeSet não respeitou a ordem de inserção mas. manteve a ordem de inserção e obtivemos um resultado igual ao visto no LinkedHashSet. nem sempre trabalhamos com números. isto é. qualquer implementação da interface List mantém seus elementos indexados. isto é. Ao contrário do Set. este assunto será abordado no mini-curso relativo a Coleções e disponível junto com este material. muitas vezes criamos nossos próprios tipos (Classes). Interessante! Para números a ordem natural é fácil de compreender – afinal de contas 1 é menor do que 2 que é menor do que 3 que é menor. qualquer coleção do tipo Set não permite duplicatas. conforme dito anteriormente.
da classe Object.5 do Java. parecido com o anterior.com 16 .add(new Integer(3)).Curso Java Starter contains( Objeto ) Retorna true se o elemento já existe dentro do List clear() Elimina todos os elementos do Set ArrayList e Vector: Um ArrayList pode ser visto como um array (vetor) porém dinâmico. Vector é basicamente um ArrayList.t2ti.add(new Integer(3)). iremos introduzir uma nova característica da linguagem Java e mostrar trechos de códigos que a utilizam junto com ArrayList e Vector: Generics: É uma funcionalidade introduzida a partir da versão 1. //Adicionando Integer arrayList. desde que fosse um Object. no entanto seus métodos são sincronizados o que significa que o acesso por vários processos simultaneamente é coordenado. ele aumenta o espaço disponível a medida que é demandado. ✔ Isto era possível pois nossas coleções aceitam qualquer elemento que seja do tipo Object. isto é. Ele é organizado pelo índice.add(new String("Texto")). Até agora as nossas coleções aceitavam qualquer tipo de elemento. ou seja. //Adicionando um Integer arrayList. Antes de continuarmos falando das implementações da interface List. Em relação as coleções sua principal característica é definir o tipo aceito pela coleção. temos alguma garantia quanto a ordem que encontraremos os elementos. e portanto são. com o uso de Generics podemos definir de que tipo específico será a nossa coleção. e todas as classes criadas em Java automaticamente herdam. No entanto. //Adicionando um String arrayList. abaixo temos um ArrayList onde adicionamos um String e um Integer: //Criando ArrayList List arrayList = new ArrayList(). www. utilizando Generics: //Criando ArrayList de Integer List<Integer> arrayList = new ArrayList<Integer>(). por exemplo. Abaixo temos um exemplo de ArrayList.
//inicio da contagem do tempo www.List.add(new Integer(5)).Vector. Vector e LinkedList.com 17 . evito que sejam inseridos indevidamente outros tipos que não sejam Integer na minha coleção. import import import import java.ArrayList. java. a diferença é que todos os elementos são ligados entre si. de 25. Exercício resolvido Implemente um código que compare o tempo de obtenção e inserção.add(i). i++)//Inserir elementos dentro do ArrayList { arrayList. i < quantidadeElementos. java. System.//Quantidade total de elementos List<Integer> arrayList = new ArrayList<Integer>().util. public class ArrayListVector { public static void main(String[] args) { Integer quantidadeElementos = 25000. //percorrendo todos os elementos do ArrayList for(int i = 0.util.LinkedList. com os mesmos elementos do ArrayList List<Integer> vector = new Vector<Integer>(arrayList).size(). no entanto se precisarmos obter algum elemento pelo o índice o desempenho é muito inferior. //Criacao do Vector de Integer.util. LinkedList: Muito similar as duas coleções vistas anteriormente (Vector e ArrayList). Perceba que a partir de agora este List aceita apenas objetos do tipo Integer utilizando esta notação. na primeira posição dos Lists. i++) { arrayList. i < arrayList. Tempo arrayList: "+(fim-inicio)+" ms"). declaração <Integer> junto a declaração da Classe/Interface. } //Criacao do LinkedList de Integer.t2ti.get(i). com os mesmos elementos do ArrayList LinkedList<Integer> linkedList = new LinkedList<Integer>(arrayList). java.out.currentTimeMillis().//Criacao do ArrayList de Integer for(int i = 0.println("Obter elemento.util. //inicio da contagem do tempo long inicio = System.//Obtendo elementos do ArrayList } //fim da contagem do tempo long fim = System.Curso Java Starter arrayList. O desempenho do LinkedList é muito superior aos do ArrayList e Vector quando necessitamos inserir elementos no início da coleção.currentTimeMillis().000 números inteiros para o ArrayList.
Tempo Vector: "+(fim-inicio)+" ms"). //percorrendo todos os elementos do Vector for(int i = 0.//Obtendo elementos do Vector } //fim da contagem do tempo fim = System.out. i < quantidadeElementos.currentTimeMillis().//Adicionando um elemento no inicio do ArrayList } //fim da contagem do tempo fim = System. i++) { linkedList. i++) { vector. i++) { arrayList.currentTimeMillis().get(i).println("Inserir elemento no inicio.out. System. i < quantidadeElementos. //percorrendo todos os elementos do ArrayList for(int i = 0.addFirst(i).Curso Java Starter inicio = System. i).currentTimeMillis(). System.t2ti.//Adicionando elemento no inicio do LinkedList } //fim da contagem do tempo fim = System. i).currentTimeMillis(). //percorrendo todos os elementos do Vector for(int i = 0.size().println("Obter elemento.currentTimeMillis(). i < linkedList. //inicio da contagem do tempo inicio = System. //inicio da contagem do tempo inicio = System.out.size(). System.currentTimeMillis(). Tempo arrayList: 12 ms Obter elemento.//Adicionando um elemento no inicio do Vector } //fim da contagem do tempo fim = System. //inicio da contagem do tempo inicio = System. } } Resultado obtido: Obter elemento. Tempo linkedList: "+(fim-inicio) +" ms").currentTimeMillis(). //inicio da contagem do tempo inicio = System.println("Inserir elemento no inicio.println("Inserir elemento no inicio.currentTimeMillis(). Tempo arrayList: 1804 ms Inserir elemento no inicio. Tempo linkedList: 1561 ms Inserir elemento no inicio.//Obtendo elementos do LinkedList } //fim do cronomentro fim = System. Tempo arrayList: "+(fim-inicio) +" ms").get(i). i < quantidadeElementos.com 18 .currentTimeMillis(). Tempo linkedList: 17 ms Considerando que esta é uma experiência apenas ilustrativa (não controlada). Tempo Vector: 12 ms Obter elemento. os resultados mostram que o ArrayList e o Vector são equivalente nos www.println("Obter elemento. System.currentTimeMillis().out. //percorrendo todos os elementos do LinkedList for(int i = 0. i++) { linkedList. //percorrendo todos os elementos do LinkedList for(int i = 0.out.add(0. Tempo Vector: "+(fim-inicio)+" ms"). i++) { vector. System. Tempo Vector: 1809 ms Inserir elemento no inicio. Tempo linkedList: "+(fim-inicio)+" ms"). i < vector.add(0.
Assim como os elementos armazenados as chaves utilizadas nos Maps também devem ser objetos. //Criacao das Notas Fiscais NotaFiscal nf1 = new NotaFiscal(1. ou seja. os elementos não sofrem nenhum tipo de ordenação derivada de alguma regra. A maior diferença é que o HashMap aceita nulos tanto para chaves quanto para valores enquanto o Hashtable não aceita nenhum nulo. similarmente ao ArrayList e Vector.com 19 .getInstance(). Hashtable. Os principais métodos utilizados quanto manipulamos Maps são: Método put( chave. a ordem de iteração dos elementos é desconhecida.Curso Java Starter quesitos avaliados. MAP Um Map. A principal característica dos Maps são suas chaves que nunca podem se repetir. e desordenado. esta coleção aceita duplicatas de valores (elementos) desde que eles possuam chaves diferentes. em um Map nunca irão haver dois elementos com a mesma chave.56). www. identifica seus elementos através de uma chave. isto é. 123. qualquer implementação desta interface. ou seja. objeto ) get( chave ) iterator() size() containsKey( chave ) clear() containsValue( objeto ) Descrição Adiciona a chave e o elemento Retorna o elemento de acordo com a chave Retorna um objeto do tipo Iterator Retorna um int (inteiro) com a quantidade de elementos da coleção Retorna true se a chave já existe Elimina todos os elementos do Set Retorna true se o objeto já existir no Map HashMap e Hashtable HashMap é um Map desorganizado. é a versão sincronizada do HashMap. Calendar. Já o LinkedList foi muito inferior quando da obtenção dos elementos e muito superior na inserção dos elementos na primeira posição.t2ti. A seguir segue trecho de código que exemplifica o uso do HashMap: //Criacao do HashMap Map notasFiscaisMap = new HashMap().getTime(). logo.
E. nf2). Calendar. ao contrário do HashMap. 100.put(nf2. NotaFiscal nf3 = new NotaFiscal(3. String>().put(nf2. nf2).getCodigo().getTime(). o que significa dizer que durante a iteração dos elementos ele respeita a ordem que estes foram inseridos na coleção.put(nf3. Calendar.put(nf1. Calendar. Calendar. LinkedHashMap Muito similar ao LinkedHashSet.put(nf3.00). notasFiscaisMap. Quando esta ordem não é definida pela interface Comparable ou por um objeto Comparator1 o TreeMap busca a ordem natural dos elementos. TreeMap Assim como o TreeSet é um Set que ordena os elementos de acordo com alguma regra.56). notasFiscaisMap.getCodigo(). 123.getTime(). HashMap nf1).getInstance().getTime().25).00).get(2). //Obtem nf2 NotaFiscal nf = (NotaFiscal)notasFiscaisMap. NotaFiscal nf3 = new NotaFiscal(3. //Obtem nf2 NotaFiscal nf = (NotaFiscal)notasFiscaisMap. //Inserindo os valores treeMap.put(nf1. nf3). Calendar.getTime(). nf3).25). Abaixo temos o mesmo código exibido anteriormente porém a implementação utilizada agora é a LinkedHashMap: //Criacao do LinkedHashMap Map notasFiscaisMap = new LinkedHashMap(). o LinkedHashMap é organizado. "Numero 1"). A seguir é apresentado um trecho de código mostrando o uso do TreeMap: //Criacao do TreeMap utilizando Generics Map<Integer.get(2). notasFiscaisMap.put(1.com 20 .getInstance(). 127. notasFiscaisMap. porém esta é a versão que implementa a interface Map. NotaFiscal nf2 = new NotaFiscal(2.getCodigo().getCodigo(). String> treeMap = new TreeMap<Integer. www. //Criacao das Notas Fiscais NotaFiscal nf1 = new NotaFiscal(1. //Armazenamento das notas fiscais no notasFiscaisMap. "Numero 5").put(5.getInstance(). o TreeMap também ordena seus elementos através da chave por alguma regra. 100.getInstance().getInstance(). treeMap.getTime(). HashMap nf1).getCodigo().Curso Java Starter NotaFiscal nf2 = new NotaFiscal(2.t2ti. Se a ordem de inserção for importante e precisarmos identificar os elementos pelas suas chaves devemos utilizar esta implementação da interface Map. logo ao armazenar os objetos é necessária uma chave.getCodigo(). //Armazenamento das notas fiscais no notasFiscaisMap. 127.
percorrendo todos os elementos do Map for(String str : treeMap. "Numero 100").Curso Java Starter treeMap. } Resultado da execução deste código: Numero 1 Numero 5 Numero 22 Numero 100 Observe que a declaração Map<Integer. //For-Each. joga uma exceção se não houver elementos Idêntico ao remove(). "Numero 22").out.println(str). possuirá comportamento similar a uma Fila. treeMap. Os métodos comumente utilizados com esta coleção são os seguintes: Método add( objeto ) offer( objeto ) remove() poll() element() peek() Descrição Adiciona o elemento. porém não joga exceção em caso de falha Remove o elemento. a interface Queue é projetada para armazenar listas de elementos a serem executados/processados. porém retorna nulo caso não hajam elementos Retorna elemento elemento inicial.t2ti. joga exceçao caso não haja idêntico ao element(). Os elementos inseridos em uma coleção que implemente esta interface. isto é.values()) { //Imprimindo os valores encontrados System.put(100. o primeiro elemento a ser inserido será o primeiro elemento a ser processado. String> utiliza generics.com 21 . QUEUE A última das interfaces a ser analisada.put(22. normalmente. Ao declarar um Map desta forma estou garantindo que todas as chaves serão do tipo Integer e todos os valores serão do tipo String. joga uma exceção se não for possível incluir Idêntico ao add. porém retorna nulo caso não haja elemento PriorityQueue www.
A ordem natural é.println("poll: "+filaPrioridade. a ordem de prioridade foi definida naturalmente uma vez que tratavam-se de números inteiros. filaPrioridade.println("poll: "+filaPrioridade.println("poll: "+filaPrioridade.add(-2). Esta ordem é definida pelo próprio objeto quando este implementa a interface Comparable.poll()).poll()). por um objeto Comparator ou pela ordem natural dos elementos. filaPrioridade. neste caso. filaPrioridade.add(5).poll()).out.poll()).Curso Java Starter Diferentemente de uma fila convencional. System. A classe Collections www.add(3).poll()).out.println("poll: "+filaPrioridade. //Removendo elementos e imprimindo System.out.out. System. System.t2ti. onde o primeiro elemento a ser inserido é o primeiro a ser removido.add(2). A seguir mostraremos trecho de código que exemplifica o uso da PriorityQueue: //Criando a minha Queue utilizando Generics Queue<Integer> filaPrioridade = new PriorityQueue<Integer>().poll()).println("poll: "+filaPrioridade. filaPrioridade. System. System.out.poll()).println("poll: "+filaPrioridade. na PriorityQueue nem sempre a ordem de inserção representa a ordem de saída dos elementos. Ao fim da execução o resultado "null" significa que não existem mais elementos na fila pois todos já foram removidos. Esta ordem é administrada pela coleção que priorizará a ordem de saída dos elementos. //Adicionando elementos filaPrioridade. do menor para o maior.out.add(0).com 22 . System.add(5). filaPrioridade. Resultado obtido: poll: poll: poll: poll: poll: poll: poll: -2 0 2 3 5 5 null No exemplo apresentado.println("poll: "+filaPrioridade.out.
com 23 .t2ti. A primeira vista pode parecer pouco útil.out. arrayList. Miguel] Mistura/Desordenação Este algoritmo é o oposto ao anterior. Mario. irá apenas adaptar às suas necessidades. arrayList. são escritos em pequenos pedaços de papéis e o primeiro a ser escolhido é o vencedor. www. quando você precisar destes tipos de funcionalidades.Curso Java Starter Da mesma forma que para arrays (vetores). se for necessário.) na manipulação das estruturas de dados do Framework Collections também existe uma classe similar (Collections) A classe Collections (mesmo nome do framework) é para as coleções do framework a mesma coisa que a classe Arrays é para os vetores (arrays) convencionais. Por exemplo. ao invés de ordenar ele desordena (mistura) os elementos dentro de um List.println(arrayList). //Ordenando Collections. abaixo temos uma possível implementação para a modalidade de sorteio cujos nomes dos elementos a serem sorteados. pesquisa. normalmente pessoas. Resultado obtido: [Albert.sort(arrayList).add("Miguel"). Fernando. Java fornece uma classe com um conjunto de funcionalidades muito utilizadas (ordenação.add("Fernando"). Temos um exemplo de código a seguir: //Criação do ArrayList List arrayList = new ArrayList(). //Adicionando elementos arrayList.add("Albert"). //Imprimindo o resultado System. Ordenação O algoritmo de ordenação implementado na classe Collections ordena os elementos em ordem ascendente. arrayList. portanto.add("Mario"). A seguir iremos explorar brevemente as principais funcionalidades. preenchimento e etc. mas existem situações onde você irá querer desordenar sua estrutura de dados para obter um elemento aleatoriamente.
Quando o elemento existe na coleção o número representa o seu índice (posição).shuffle(arrayList).binarySearch(arrayList.get(0)). representa a posição que ele deveria estar (ponto de inserção). A pesquisa efetuada pela Classe Collections retorna um número inteiro positivo ou zero se o elemento for encontrado e negativo se o elemento não existe na coleção.Curso Java Starter //Criação do ArrayList List arrayList = new ArrayList(). Por isto a importância deste algoritmo. esta posição somente é válida se a coleção estiver ordenada antes da pesquisa. arrayList.out.add("Albert"). Resultado obtido em uma execução Fernando Perceba que o elemento na posição 0 (zero). a mudança de posição destes elementos dentro do List. A seguir temos um exemplo: //Criação do ArrayList List arrayList = new ArrayList().add("Albert"). o que confirma. arrayList. //Sorteando o primeiro nome e imprimindo o resultado System. arrayList. pois.com 24 . //Imprimindo resultado www.add("Miguel"). //Adicionando elementos arrayList. de que adianta uma estrutura de dados cujos elementos não conseguimos localizar? Ao manipularmos estruturas de dados sempre devemos ter em mente que iremos ordená-las ou pesquisá-las. "Albert"). pela ordem de inserção seria "Miguel" e. //Adicionando elementos arrayList. arrayList. no entanto.add("Fernando").add("Mario").t2ti.println(arrayList. em módulo. arrayList.add("Miguel"). por outro lado. obtivemos o elemento "Fernando".add("Fernando"). //Misturando elementos Collections. quando o elemento não existe. arrayList. //Pesquisando int resultado = Collections. neste caso. o número.add("Mario"). Pesquisa: Quando falamos em estruturas de dados obrigatoriamente devemos pensar em algoritmos de ordenação e pesquisa.
frequency – Conta a quantidade de ocorrências do elemento especificado. addAll – Adiciona os elementos a coleção. www.println()). percorra todos os elementos e imprima (System.Curso Java Starter System.out. Resultado da execução: Resultado da pesquisa: 1 O resultado obtido. "String 2" e "String 3" cada uma duas vezes. Fill – Preenche a coleção com o elemento especificado. indica que o nome "Albert" encontra-se na segunda posição da coleção.t2ti. Observe o resultado. veja e compartilhe as suas respostas no nosso Fórum: Exercícios – Módulo 09 – Coleções – Framework Collections 1. percorra todos os elementos e imprima (System.println("Resultado da pesquisa: "+resultado). Faça um ArrayList e insira as Strings "String 1". o valor 1 indica a segunda posição. logo. Implemente código que possua um ArrayList e insira 200 Strings nesta lista.out. Swap – troca os elementos de posição. Outras funcionalidades úteis Reverse – Inverte a ordem dos elementos. Quantos elementos têm a coleção? 3.com 25 .out. "String 2" e "String 3" cada uma duas vezes. lembrando que todas as coleções iniciamse pelo índice 0 (zero). disjoint – Verifica quando duas coleções não possuem nenhum elemento em comum.       EXERCíCIOS Aprenda com quem também está aprendendo.println()). 2. Faça um HashSet e insira as Strings "String 1". conforme esperado.
sem repetir os códigos das chaves. Utilizando a classe Collections pesquise por "String 2" na coleção criada no exercício 2. Imprima (System. 100. 30.com 26 . 13. Adicione os números 100. 40.Compare o desempenho das coleções HashMap e HashSet.out. 200. 11. 30. Porque as médias encontradas nos exercícios 6 e 7 ficaram diferentes? 9.Implemente uma classe ContaCorrente com os atributos Agencia. 100. 80. 30.out. percorra todos os elementos utilizando for-enhanced (for-each) e calcule a média. 100. 200. 8. 40. Insira nas duas coleções um total de 20. Observe o resultado.000 alunos e pesquise por um deles.Utilizando a classe Collections desordene a coleção criada no exercício 2. 200 a um Set. 40. 12. Observe o resultado.Curso Java Starter Observe o resultado. 20. Repita o exercício anterior porém. percorra todos os elementos utilizando for-enhanced (for-each) e calcule a média. 7. Adicione os números 100.out. 200 a um List. Imprima (System. 20. Utilizando a classe Collections ordente a coleção criada no exercício 2. percorra todos os elementos e imprima (System.t2ti.println()) o resultado. Adicione os números 100. Imprima (System. 200 a um List.println()). 20.out. 80. "String 2" e "String 3" cada uma duas vezes. 6. Quantos elementos têm a coleção? 4. 80. Quantos elementos têm a coleção? 10. Numero. www. 14. percorra todos os elementos utilizando um Iterator e calcule a média. Faça um HashMap e insira as Strings "String 1". compare o tempo de pesquisa em cada uma das coleções.println()) o resultado. utilize o numeral como chave. 200.println()) o resultado. Quantos elementos têm a coleção? 5.
RG e Idade. 15. CPF e Saldo.Crie um HashSet e adicione 5 (cinco) ContaCorrente diferentes. Imprima o resultado (System. utilize a classe Aluno do exercício 16. 20. observando a implementação do método equals(). Sobreescreva os métodos equals() de forma que duas contas correntes sejam consideradas iguais apenas se possuírem a mesma Agencia e Numero. Crie uma classe Aluno com os atributos Nome . e sobreescreva o método hashCode().Curso Java Starter Nome. Sobreescreva o método hashCode da classe Aluno. considerando que cada aluno está matriculado apenas uma vez? 18. adicione alguns alunos com o mesmo RG.out. observe o resultado.t2ti. Existem alunos nesta turma com o mesmo código? 19. 16.com 27 . Faça novamente o exercício 8 porém. desenvolvida no exercício 16. agora com o método hashCode() implementado. Implemente código com a estrutura de dados definida no exercício anterior. 17. Qual interface do Framework Collections você utilizaria para representar uma Turma de faculdade. www.println()). Percorra todos os elementos. utilizando a nova classe Aluno. Sobreescreva o método equals() de forma que dois alunos sejam considerados iguais apenas se possuírem o mesmo RG.