12.07.2015 Views

Conceitos avançados de programação - Instituto de Informática - UFG

Conceitos avançados de programação - Instituto de Informática - UFG

Conceitos avançados de programação - Instituto de Informática - UFG

SHOW MORE
SHOW LESS
  • No tags were found...

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Especialização em web com interfacesricas<strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong>Prof. Fabrízzio Alphonsus A. M. N. Soaresfabrizzio@inf.ufg.br professor.fabrizzio@gmail.com<strong>Instituto</strong> <strong>de</strong> <strong>Informática</strong>Universida<strong>de</strong> Fe<strong>de</strong>ral <strong>de</strong> GoiásAula 225 <strong>de</strong> maio <strong>de</strong> 2012Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 1/103


<strong>Conceitos</strong> <strong>avançados</strong>Nesta aula conheceremos elementos interessantes para auxíliona <strong>programação</strong> Java.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 2/103


<strong>Conceitos</strong>Elementos que serão aprendidos nesta aula:TypeCast e InstanceOfTipos genéricos (Generics)Encaixotamento (Boxing) e Envelopadores (Wrappers)Coleções, etcProf. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 3/103


TypeCast IQuando lidamos com linguagens <strong>de</strong> <strong>programação</strong> fortementetipadas como Java, nos confrontamos muitas vezes com a necessida<strong>de</strong><strong>de</strong> variar <strong>de</strong> um tipo <strong>de</strong> dado para outro.Há casos, também, em que até mesmo o compilador não compreen<strong>de</strong>que tipo <strong>de</strong> dado estamos atribuindo a uma variável.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 4/103


TypeCast IIEm Java, nós po<strong>de</strong>mos fazer uso do que chamamos <strong>de</strong> indução<strong>de</strong> tipo ou typecast.O typecast dita ao compilador como tal dado <strong>de</strong>ve ser interpretadoe manipulado.Essa indução <strong>de</strong> tipo ou typecast po<strong>de</strong> ser implícita ou explícita.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 5/103


TypeCast IIIO typecast implícito é feito automaticamente pelo compiladorquando um tipo <strong>de</strong> dado po<strong>de</strong> ser facilmente manipulado nolugar <strong>de</strong> outro tipo <strong>de</strong> dado.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 6/103


TypeCast IVO typecast explícito é feito diretamente no algorítmo para indicarao compilador qual a forma <strong>de</strong> interpretação <strong>de</strong> um dadoquando ele enten<strong>de</strong> que há ambiguida<strong>de</strong> ou formatos incompatíveis.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 7/103


TypeCast VO typecast explícito é dado sempre <strong>de</strong>ntro <strong>de</strong> parênteses quesempre vem antes do dado a ser induzido. Ex.: (int) var1,(float) var2, (Object) var3, ...Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 8/103


TypeCast <strong>de</strong> Tipos Primitivos IO typecast <strong>de</strong> dados primitivos é dado basicamente em questão<strong>de</strong> seu consumo <strong>de</strong> memória. Se tentamos <strong>de</strong>signar um tipo <strong>de</strong>dado que consome menos memória para um que consome maismemória, o typecast é realizado implicitamente.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 9/103


TypeCast <strong>de</strong> Tipos Primitivos IINo exemplo abaixo, atribuimos um dado inteiro (varInt) a umavariável do tipo float (varFloat).1 public class ExemploTypecast1 {2 public static void main(String[] args) {3 float varFloat;4 int varInt;5 varInt = 200;6 varFloat = varInt;7 System.out.println(varFloat);8 }9 }Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 10/103


TypeCast <strong>de</strong> Tipos Primitivos IIIO contrário não se aplica. Tentar atribuir um tipo <strong>de</strong> dadomaior para um tipo <strong>de</strong> dado menor irá resultar em um erro <strong>de</strong>tipos incompatíveis (type mismatch).Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 11/103


TypeCast <strong>de</strong> Tipos Primitivos IVPara <strong>de</strong>monstrar isso, usaremos dois tipos <strong>de</strong> dados inteiros.Porém, iremos atribuir um inteiro longo (que consome maismemória) a um dado inteiro que consome menos. Nesse caso,somos obrigados a usar typecast explícito.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 12/103


TypeCast <strong>de</strong> Tipos Primitivos V1 public class ExemploTypecast2 {2 public static void main(String[] args) {3 long varLong;4 int varInt;5 varLong = 200;6 varInt = (int) varLong;7 System.out.println(varInt);8 }9 }Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 13/103


TypeCast <strong>de</strong> Classes e Objetos ITypecast também po<strong>de</strong> ser usado em Classes e Objetos.Sempre e uma classe for genérica, ela po<strong>de</strong>rá receber qualquertipo <strong>de</strong> objeto que será feito o typecast implicitamente.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 14/103


TypeCast <strong>de</strong> Classes e Objetos IIExemploPor exemplo, vamos utilizar a classe TV abaixo.1 public class TV {2 int tamanho;3 int canal;4 int volume;5 boolean ligada;67 public TV(int tamanho, int canal, int volume, boolean ligada) {8 this.tamanho = tamanho;9 this.canal = canal;10 this.volume = volume;11 this.ligada = ligada;12 }13 }Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 15/103


TypeCast <strong>de</strong> Classes e Objetos IIIAgora, vamos instanciar uma variável da classe genérica Objectcom a classe TV.12 public class ExemploTypecast3 {3 public static void main(String[] args) {4 Object obj = new TV(29, 1, 0, false);5 System.out.println("A variável obj é "6 + obj.getClass());7 }8 }Como po<strong>de</strong>mos perceber, o resultado <strong>de</strong> getClass da variávelobj não é sua classe original (Object), mas sua instância: classTV.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 16/103


TypeCast <strong>de</strong> Classes e Objetos IVAgora, não será possível criar uma cópia <strong>de</strong>sse objeto para umavariável do mesmo tipo <strong>de</strong> sua instância. Neste caso, <strong>de</strong>vemosfazer o typecast explícito da classe.1 public class ExemploTypecast4 {2 public static void main(String[] args) {3 Object obj = new TV(29, 1, 0, false);4 TV tv = (TV) obj;5 TV tv2 = new TV(29, 1, 0, false);6 System.out.println("A variável tv é cópia <strong>de</strong> obj" +7 "\nobj: " + obj.toString() +8 "\ntv: " + tv.toString());9 System.out.println("TV2 é outro objeto: " + tv2.toString());10 }11 }Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 17/103


TypeCast <strong>de</strong> Classes e Objetos VO resultado do código acima seria algo como:1 A variável tv é cópia <strong>de</strong> obj2 obj: TV@12345f3 tv: TV@12345f4 TV2 é outro objeto: TV@abc<strong>de</strong>1Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 18/103


InstanceOf INo exemplo anterior, se tentássemos atribuir obj diretamente atv ocorreria um erro <strong>de</strong> tipos incompatíveis (type mismatch).Quando lidamos com classes, po<strong>de</strong>mos testar qual seu tipo <strong>de</strong>instancia usando o operador instanceof.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 19/103


InstanceOf IIInstanceof indica se um objeto (já instanciado) pertence a umaclasse.O uso <strong>de</strong> instanceof é: objeto instanceof nomeDaClasse.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 20/103


InstanceOf IIIPara melhorar o exemplo anterior, usaremos instanceof antes <strong>de</strong>atribuirmos obj a tv.1 public class ExemploTypecast {2 public static void main(String[] args) {3 Object obj = new TV(29, 1, 0, false);4 TV tv = null;5 if (obj instanceof TV) {6 tv = (TV) obj;7 }8 TV tv2 = new TV(29, 1, 0, false);9 System.out.println("A variável tv é cópia <strong>de</strong> obj" +10 "\nobj: " + obj.toString() +11 "\ntv: " + tv.toString());12 System.out.println("TV2 é outro objeto: " + tv2.toString());13 }14 }Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 21/103


Tipos Genéricos IO que são tipos genéricos?Generics, ou <strong>programação</strong> genérica, serve para <strong>de</strong>terminar parao compilador, qual tipo <strong>de</strong> classe <strong>de</strong>ve ser interpretada.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 22/103


Tipos Genéricos IIPor exemplo, vamos imaginar que será criada uma classe chamadaAparelho que irá conter um objeto <strong>de</strong> alguma outra classe.Para que essa classe possa aceitar qualquer tipo <strong>de</strong> classe, <strong>de</strong>vemosfazer uso <strong>de</strong> generics.Generics é indicado como um i<strong>de</strong>ntificador entre os sinais <strong>de</strong>maior e menor < > .Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 23/103


Criar classes usando generics IPara criar uma classe usando generics, basta que logo após onome da classe coloquemos o indicador genérico. Esse indicadorgenérico é simplesmente uma letra na qual será substituída<strong>de</strong>ntro da classe no momento da execução.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 24/103


Criar classes usando generics II1 public class Aparelho {2 T objeto;34 public Aparelho(T objeto) {5 this.objeto = objeto;6 }78 public T getObjeto() {9 return objeto;10 }1112 public void setObjeto(T objeto) {13 this.objeto = objeto;14 }15 }Como a letra T i<strong>de</strong>ntifica um tipo genérico, ela será substituídapor qualquer classe.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 25/103


Criar classes usando generics IIIVamos imaginar agora que temos duas classes distintas. A classeTV:1 public class TV {2 int tamanho;3 int canal;4 int volume;5 boolean ligada;67 public TV(int tamanho, int canal, int volume, boolean ligada) {8 this.tamanho = tamanho;9 this.canal = canal;10 this.volume = volume;11 this.ligada = ligada;12 }13 // métodos get e set14 }Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 26/103


Criar classes usando generics IVE a classe radio:1 public class Radio {2 public static int AM = 1;3 public static int FM = 2;4 private float frequencia;5 private int volume;6 private int banda;78 public Radio(float frequencia, int volume, int banda) {9 this.frequencia = frequencia;10 this.volume = volume;11 this.banda = banda;12 }13 // métodos get e set14 }Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 27/103


Instanciar uma classe genérica ISe fossemos criar um programa que usa as duas classes <strong>de</strong> aparelhosacima, faríamos:1 public class MinhaClasse {2 public static void main(String[] args) {3 Aparelho aparelho1 = new Aparelho(new TV(29, 0,0, false));4 Aparelho aparelho2 = new Aparelho(newRadio(88.1f, 0, Radio.FM));5 System.out.println(aparelho1.getObjeto().getClass());6 System.out.println(aparelho2.getObjeto().getClass());7 }8 }Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 28/103


Instanciar uma classe genérica IIPerceba o seguinte: sem o uso <strong>de</strong> generics, o compilador nãoconseguiria saber qual a diferença entre aparelho1 e aparelho2,pois ele os trataria da mesma forma. Nesse caso, seria obrigatórioo uso <strong>de</strong> typecast para <strong>de</strong>terminar ao compilador que dadoestá sendo processado.Se pensarmos em uma aplicação muito gran<strong>de</strong>, além <strong>de</strong> ficarcansativo ter que usar typecast toda vez que fossemos usarum aparelho, seria muito provável que erraríamos em algummomento.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 29/103


Instanciar uma classe genérica IIIJava usa uma pequena convenção <strong>de</strong> nomenclatura para as letras<strong>de</strong> i<strong>de</strong>ntificação <strong>de</strong> generics (que são vastamente utilizadasno Framework <strong>de</strong> coleções Java), sendo:E ElementoK ChaveN NúmeroT TipoV ValorProf. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 30/103


Generics é um assunto bastante extenso com vários tópicosque po<strong>de</strong>m ser abordados, <strong>de</strong>ntre os quais po<strong>de</strong>mos citar:Multiplos tipos genéricos. Ex.: ;Tipos genéricos limitados. Ex.: ;Wildcards;e Subtipos;Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 31/103


Exemplo mais robusto IIremos criar duas classes, a primeira “Obj” contém dois métodos(add e get) que recebem e retornam um tipo “Integer”.1 public class Obj {23 private Integer i;45 public void add(Integer i){6 this.i = i;7 }8 public Integer get(){9 return this.i;10 }11 }Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 31/103


Exemplo mais robusto IIA segunda classe utiliza a classe Obj para “guardar” um objeto:1 public class UsaObj {23 public static void main(String[] args) {45 Obj integerObj = new Obj();6 integerObj.add(new Integer(10));78 Integer someInteger = (Integer)integerObj.get();9 System.out.println(someInteger);10 }11 }Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 32/103


Exemplo mais robusto IIIO exemplo abaixo irá causar erro:1 public class UsaObj {23 public static void main(String[] args) {45 Obj stringObj = new Obj();6 stringObj.add("Teste");78 String someString = (String)stringObj.get();9 System.out.println(someString);10 }11 }Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 33/103


Exemplo mais robusto IVNo caso acima, somente é possível colocar em Obj um objetodo tipo Integer, agora veremos como tipos genéricos po<strong>de</strong> nosajudar quando queremos colocar um Integer ou uma String naclasse Obj por exemplo. Vamos recriar o cenário anterior coma utilização <strong>de</strong> tipos genéricos.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 34/103


Usando Generics IVeja que agora o tipo <strong>de</strong> objeto que será armazenado é representadopela letra T, que também <strong>de</strong>verá ser informado quandouma instância <strong>de</strong> Obj for criada.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 35/103


Usando Generics II1 public class ObjGen{23 private T t; // T é o tipo do objeto45 public void add(T t){6 this.t = t;7 }8 public T get(){9 return this.t;10 }11 }Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 36/103


Usando Generics IIIAgora vamos criar uma classe que utiliza a classe ObjGen.1 public class UsaObjGen {23 public static void main(String[] args) {45 ObjGen integerObj = new ObjGen();6 integerObj.add(new Integer(10));78 Integer someInteger = (Integer)integerObj.get();9 System.out.println(someInteger);1011 ObjGen stringObj = new ObjGen();12 stringObj.add("Teste");1314 String someString = (String)stringObj.get();15 System.out.println(someString);16 }17 }Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 37/103


Generics como tipo mínimo IPo<strong>de</strong>mos utilizar um “tipo mínimo” para garantir um tipo obrigatórioquando criamos classes genéricas.1 public class ObjMin {23 void inicia(T t){4 new Thread(t).start();5 }6 }Aqui estamos <strong>de</strong>finindo que o tipo do objeto (T) <strong>de</strong>ve ser nomínino um “Runnable”.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 38/103


Generics como tipo mínimo IICriaremos agora uma classe chamada Programa que implementaRunnable e utiliza o ObjMin.1 public class Programa implements Runnable {23 public static void main(String[] args){45 ObjMin o = new ObjMin();6 o.inicia(new Programa());7 }89 public void run(){10 System.out.println("ola");11 }12 }Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 39/103


Boxing, Unboxing e Autoboxing IO que é boxing?Em certas situações, é mais conveniente utilizar objetos no lugar<strong>de</strong> tipos primitivos (byte, short, int, long, float, double, booleane char).Assim, para cada tipo primitivo, foi criado uma classe Wrapper(Byte, Short, Integer, Long, Float, Double, Boolean e Character)que serve para “encaixotar” (boxing) o tipo primitivo.Boxing consiste em inserir um tipo primitivo <strong>de</strong>ntro <strong>de</strong> um objeto,<strong>de</strong> forma que o valor primitivo possa ser usado como umobjeto.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 40/103


Boxing, Unboxing e Autoboxing IIVejamos este Exemplo:1 Integer i = new Integer(100);Vemos neste exemplo que o tipo primitivo int <strong>de</strong> valor ’100’ éinserido no construtor <strong>de</strong> Integer, que é a classe wrapper (empacotadora)associada.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 41/103


Wrappers ITabela <strong>de</strong> Tipos primitivos e Classes WrappersTipo primitivo Classe Wrapper Super ClasseLógico boolean Boolean ObjectCaractere char Character ObjectInteiro byte Byte NumberInteiro short Short NumberInteiro int Integer NumberInteiro long Long NumberPonto Flutuante float Float NumberPonto Flutuante double Double NumberProf. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 42/103


Wrappers IIClasses Wrappers possuem métodos públicos disponíveis na subclasseObject, <strong>de</strong>vemos dar um maior <strong>de</strong>staque para os métodosequals(Object) e toString, o primeiro é utilizado para comparaçõesenquanto que o segundo permite que o conteúdo <strong>de</strong> umobjeto seja representado em formato <strong>de</strong> texto.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 43/103


Wrappers IIIClasses <strong>de</strong>rivadas da subclasse Number possuem vários métodospara <strong>de</strong>volverem um tipo primitivo, tais como: byteValue(),shortValue(), intValue(), longValue(), doubleValue(), floatValue().Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 44/103


Wrappers IVAlem disso a as classes <strong>de</strong>rivadas <strong>de</strong> Number possuem tambémo método comparareTo(Object) que faz comparações entre objetoswrapper.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 45/103


Quais as vantagens <strong>de</strong> usar tiposprimitivos? ITipos primitivos são bem rápidosConsomem pouca memóriaAlém <strong>de</strong> permitirem operações mais complexasSão bastantes eficientes em laços e expressõesProf. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 46/103


Usando Wrappers IPara criar objetos Integer ,Double , etc.Basta apenas chamar :1 Integer i = new Integer();2 Double d = new Double();Para fazer obter uma valor encapsulado basta apenas:1 float f = real.FloatValue();2 double d = inteiro.doubleValue();Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 47/103


Autoboxing IA criação das classes wrapper resolveram vários problemas, poréma conversão entre tipo primitivo para objeto (boxing) eobjeto para primitivo (unboxing) se tornou uma tarefa trivial etediosa. A solução surgiu a partir do JDK 1.5.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 48/103


Autoboxing IIA Sun resolveu este problema através do autoboxing, que consisteno boxing automático, ou seja, na conversão automáticapelo compilador <strong>de</strong> tipo primitivo para objeto.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 49/103


Autoboxing IIIAlém do autoboxing, existe o autounboxing, que é a conversãoautomática <strong>de</strong> objeto para tipo primitivo. Assim, fecha-seo ciclo: a conversão <strong>de</strong> tipo primitivo para tipo wrapper é automática(autoboxing) e o retorno também é automático (autounboxing),facilitando o uso <strong>de</strong> um e outro, como se fossemequivalentes.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 50/103


Autoboxing IVVejamos o exemplo:1 public class TesteAutoboxing {2 public static void main(String[] args) {3 Integer a = 2; // autoboxing4 Integer b = 2; // equivale a Integer b = new Integer(2);5 a++; // autounboxing e autoboxing6 b++; // autounboxing e autoboxing7 // int x = a.intValue(); // para jdk < 1.5, isto eranecessário8 // int y = b.intValue();9 // System.out.println(x+y); // a linha abaixo é equivalentea esta10 System.out.println(a+b); // graças a autounboxing11 }12 }Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 51/103


Autoboxing VNote neste exemplo:O compilador ’sabe’ que a atribuição ’Integer a = 2’ são<strong>de</strong> tipos diferentes, por isso é necessário autoboxing - aconversão implícita pelo compilador <strong>de</strong> int para Integer.A soma <strong>de</strong> objetos não é <strong>de</strong>finida, por isso ’a’ e ’b’ sãoconvertidos implicitamente pelo compilador para int;Em geral, o código-fonte fica mais curto e operações <strong>de</strong>conversões triviais são criadas implicitamente pelocompilador.Você po<strong>de</strong> utilizar os operadores <strong>de</strong> incremento emobjetos, como se fossem tipos primitivos;Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 52/103


Exemplos <strong>de</strong> Autoboxing IAutoboxing ou autounboxing ocorre sempre que houver a necessida<strong>de</strong><strong>de</strong> conversão <strong>de</strong> tipos primitivos em objetos e vice-versa.Isto se aplica em várias situações [3]: comparação, atribuição,em estruturas <strong>de</strong> repetição, etc. Veremos a seguir um exemplo<strong>de</strong> cada situação.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 53/103


Autoboxing em atribuição IVeja no exemplo abaixo a utilização <strong>de</strong> autoboxing e autounboxingna atribuição <strong>de</strong> variáveis e passagem <strong>de</strong> parâmetros paramétodos:1 public class AutoboxingEmAtribuicao {2 private static double soma(double x, double y) { //autounboxing3 return x+y;4 }5 public static void main(String[] args) {6 Double a = 1.0; //autoboxing7 Double b = 1.0; // autoboxing8 Double resultado = soma(a,b); // autounboxing9 Boolean imprimir = true; ///autoboxing10 if (imprimir) // autounboxing11 System.out.println("resultado: "+resultado); //autounboxing12 }13 }Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 54/103


Autoboxing em atribuição IINote a atuação do autoboxing/autounboxing neste exemplo:Na atribuição <strong>de</strong> valores double para tipos objeto Double;Na passagens <strong>de</strong> parâmetros do método soma. Note queo método soma recebe como parâmetros dois tiposprimitivos double e foram passados dois objetos Double’a’ e ’b’.Na atribuição do valor booleano ’true’ à variável do tipoobjeto Boolean;No uso <strong>de</strong> um tipo objeto Boolean na condição do ’if’;Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 55/103


Autoboxing em comparação IComparações po<strong>de</strong>m ser realizadas através do operador ’==’ou pelo método ’equals’; o primeiro, quando é aplicado entreobjetos, compara se as variáveis referenciam o mesmo objeto,enquanto que o segundo avalia se os objetos possuem o valorsignificativamente iguais.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 56/103


Autoboxing em comparação IIVeremos no código-fonte <strong>de</strong> exemplo a seguir, que as comparaçõesentre tipos diferentes po<strong>de</strong>m ser realizadas:1 public class AutoboxingEmComparacao {2 public static void main(String[] args) {3 Integer a = new Integer(2);4 Integer b = new Integer(2);;5 int c = 2;6 // compara se a e b referenciam o mesmo objeto:7 if (a == b)8 System.out.println("Comparação 1: a e b são os mesmosobjetos");910 // compara se a e b possuem o mesmo valor:11 if (a.equals(b))12 System.out.println("Comparação 2: a e b tem valores iguais");1314 // a é convertido para tipo primitivo15 // os dois valores são comparados como tipos primitivos16 if (a == c)Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 57/103


Autoboxing em comparação III17 System.out.println("Comparação 3: a e c tem valores iguais");1819 // c é convertido para objeto20 // os dois valores são comparados como objetos21 if (a.equals(c))22 System.out.println("Comparação 4: a e c tem valores iguais");23 }24 }Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 58/103


Autoboxing em comparação IVNote a atuação do autoboxing/autounboxing neste exemplo:Na comparação entre tipos diferentes (objeto e tipoprimitivo);No comportamento diferente na comparação com ’==’ou ’equals’;Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 59/103


Autoboxing em laço <strong>de</strong> repetição for IA partir do jdk 1.5, surgiu uma melhoria na estrutura <strong>de</strong> repetiçãofor, chamado <strong>de</strong> ’for melhorado’ ou ’enhanced for’. Atravésdo novo for, é possível percorrer toda uma array ou conjunto(veremos mais <strong>de</strong>talhadamente sobre isso <strong>de</strong>pois) <strong>de</strong> forma bemfácil, sem necessitar criar contadores ou índices.1 for (Tipo item: array_ou_conjunto)...On<strong>de</strong>:Tipo - é uma classe ou algum tipo primitivo;item - é a variável que receberá um elemento do array ouconjunto em cada iteração (loop);array_ou_conjunto - é uma array ou conjunto contendovários elementos;Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 60/103


Autoboxing em laço <strong>de</strong> repetição for IIVeremos o uso do ’for melhorado’ neste exemplo a seguir. Noteque iremos percorrer uma array <strong>de</strong> tipos primitivos char e umaarray (objeto) <strong>de</strong> inteiros (Integer):1 import java.util.ArrayList;2 public class AutoboxingEmRepeticaoFor {3 public static void main(String[] args) {4 char[] ola = {’o’, ’l’, ’a’};5 // percorre a array ola6 for (Character letra: ola) // autoboxing7 System.out.println(letra);89 // esta é um array com vários elementos inteiros;10 // veremos esta sintaxe quando for estudado "Genericos"11 ArrayList numerospares = new ArrayList();1213 // inclui objetos inteiros no array14 numerospares.add(new Integer(2));15 numerospares.add(new Integer(4));16 numerospares.add(new Integer(6));Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 61/103


Autoboxing em laço <strong>de</strong> repetição for III17 numerospares.add(new Integer(8));1819 // realiza o autounboxing <strong>de</strong> cada elemento Integer20 for (int i: numerospares)21 System.out.println(i);22 }23 }Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 62/103


Autoboxing em laço <strong>de</strong> repetição for IVNote neste exemplo:O for melhorado percorre a array <strong>de</strong> tipos primitivos char,realizando o autoboxing <strong>de</strong> cada um <strong>de</strong> seus elementos,atribuindo a variável ’letra’, que é do tipo objetoCharacter;A sintaxe ArrayList numerospares = newArrayList(), tem o seguinte significado: crieuma array <strong>de</strong> objetos Integer, associando à varíavelnumerospares, que por sua vez é uma ’array <strong>de</strong> Integer’;O for melhorado percorre a array <strong>de</strong> Integer, realizando oautounboxing <strong>de</strong> cada um <strong>de</strong> seus elementos, atribuindo avariável ’i’, que é do tipo primitivo int;Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 63/103


Coleções IUm dos conceitos mais difundidos entre todas as linguagens <strong>de</strong><strong>programação</strong> é o conceito <strong>de</strong> array.Embora seja a base <strong>de</strong> muita coisa nem sempre trabalhar comarrays diretamente é uma boa i<strong>de</strong>ia.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 64/103


Coleções IIO Java Collections Framework é um conjunto <strong>de</strong> classes <strong>de</strong>senhadospara superar as limitações dos arrays e aumentar acapacida<strong>de</strong> do programador para trabalhar com coleções <strong>de</strong> objetos.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 65/103


Coleções IIICom classes <strong>de</strong> alto nível como estas é possível implementarpadrões como Produtor-Consumidor sem esforço. Ou escolhera implementação mais eficiente sem a implementar.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 66/103


Sobre Arrays IUm array, em java, é um objeto que agrega outros objetos quecompartilham um supertipo comum e aos quais nos po<strong>de</strong>mosreferir por um índice (ou seja, um numero inteiro).Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 67/103


Sobre Arrays IIArrays em java são imutáveis o que significa que para criarum array menor ou maior baseando-nos num que já existe énecessário criar um novo array e fazer uma cópia, elemento aelemento do antigo para o novo.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 68/103


Sobre Arrays IIIArrays são muito uteis para substituir condições <strong>de</strong> seleção,como vemos no exemplo a seguir:1 // sem array2 public String getDayOfWeek(int weekDayOrdinal){3 switch(weekDayOrdinal){4 case 1: return "Domingo";5 case 2: return "Segunda-Feira";6 case 3: return "Terça-Feira";7 case 4: return "Quarta-Feira";8 case 5: return "Quinta-Feira";9 case 6: return "Sexta-Feira";10 case 7: return "Sábado";11 }12 }13 // com array14 public String getDayOfWeek(int weekDayOrdinal){15 return WEEK_DAY_NAMES[weekDayOrdinal-1];16 }Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 69/103


Sobre Arrays IVEsta é uma situação simples que po<strong>de</strong> não parecer muito vantajosaainda para mais quando seria necessário inicializar o array( embora, essa inicialização seria feita apenas uma vez em todaa vida do programa).Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 70/103


Sobre Arrays VA razão para que o Array seja um objeto pouco maleável é <strong>de</strong>eficiência. Mas java oferece um recurso muito mais po<strong>de</strong>rosoque permite ao programador não usar arrays se não quiser : oJava Collections Framework (JCF).Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 71/103


Java Collections Framework IO Java Collections Framework é um conjunto <strong>de</strong> interfaces eclasses que permitem uma vasta gama <strong>de</strong> opções na hora <strong>de</strong>trabalhar com agregações <strong>de</strong> objetos. A recente (Java 5) introdução<strong>de</strong> tipos genéricos e <strong>de</strong> coleções <strong>de</strong>senhadas para ambientesconcorrentes não <strong>de</strong>vem <strong>de</strong>ixar dúvidas a ninguem, queem Java, usar arrays não é o padrão a seguir.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 72/103


Java Collections Framework IIOs algoritmos existentes relativos a coleções são amplamentedivulgados e estudados. A eficiência é a priorida<strong>de</strong> ao trabalharcom gran<strong>de</strong>s coleções <strong>de</strong> objetos. Por esse motivo, o JCF ébastante flexível e vasto. Esses algoritmos são tão importantesque obrigam todos os objetos a seguir contratos bem <strong>de</strong>finidos.O primeiro e mais importante <strong>de</strong>les é o contrato <strong>de</strong> <strong>de</strong>finição <strong>de</strong>igualda<strong>de</strong>.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 73/103


Definindo igualda<strong>de</strong> com equals IEm Java o operador <strong>de</strong> igualda<strong>de</strong> == não <strong>de</strong>termina se os objetossão iguais, apenas se as variáveis <strong>de</strong> referencia a eles sãoiguais. Duas variáveis <strong>de</strong> referencia a objetos po<strong>de</strong>m referenciarobjetos iguais ou não.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 74/103


Definindo igualda<strong>de</strong> com equals IIPara resolver o problema todos os objetos em Java <strong>de</strong>finem ométodo equals(). Este método é <strong>de</strong>finido em Object - a classemãe <strong>de</strong> todas as classes - e como tal o método é onipresente nalinguagem.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 75/103


Definindo igualda<strong>de</strong> com equals IIIPor padrão, este método apenas verifica se as referências dosobjetos são iguais. Ou seja, por padrão, um objeto só é iguala outro se a variável <strong>de</strong> referencia é a mesma. Isso garanteque objeto quando igual tem as mesma características, masmuitas vezes necessitamos que a igualda<strong>de</strong> seja <strong>de</strong>terminadapelas características em si e não pela referência do objeto.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 76/103


Definindo igualda<strong>de</strong> com equals IVPara conseguirmos isso basta sobre-escrever o método equals()no nosso objeto. Para fazermos isso temos que seguir algumasregras:1 O resultado <strong>de</strong> invocar equals() para os mesmos doisobjetos, sempre retorna o mesmo resultadoin<strong>de</strong>pen<strong>de</strong>ntemente <strong>de</strong> quando essa invocação é feita.2 null nunca é igual a nenhum objecto3 Um objeto é igual a si próprio. Ou seja, a.equals(a) temque ser verda<strong>de</strong>.4 A or<strong>de</strong>m da invocação para dois objetos não importa. Sea.equals(b) é verda<strong>de</strong> então também tem que ser verda<strong>de</strong>que b.equals(a)Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 77/103


Definindo igualda<strong>de</strong> com equals V5 Se a.equals(b) e b.equals(c) são verda<strong>de</strong> então tambémtem que ser verda<strong>de</strong> que a.equals(c)Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 78/103


Definindo igualda<strong>de</strong> com equals VIEsta regras traduzem as proprieda<strong>de</strong>s do método equals(). Seo método não tem estas proprieda<strong>de</strong>s ele não está bem implementado.A saber:1 equals() é Consistente2 e é consistente com null3 equals() é Reflexivo4 equals() é Simétrico5 equals() é TransitivoProf. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 79/103


HashCo<strong>de</strong> IHash é um código <strong>de</strong>senvolvido em criptografia. Função <strong>de</strong>Hash é um mecanismo que baseado numa entrada produz umcódigo <strong>de</strong> hash (hashCo<strong>de</strong>). Funções <strong>de</strong> Hash não são reversiveise sempre produzem o mesmo resultado para a mesmaentrada. Contudo não são obrigadas a produzirem códigos diferentespara entradas diferentes ( ou seja, não são injetivas).Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 80/103


HashCo<strong>de</strong> IIPor outro lado, funções <strong>de</strong> hash produzem códigos do mesmotamanho para entradas <strong>de</strong> tamanhos aleatoriamente diferentes.Estas proprieda<strong>de</strong>s são extremamente uteis já que pela simplescomparação do código <strong>de</strong> hash po<strong>de</strong>remos saber se dois objetossão diferentes. Atenção para o fato que elas não revelam seos objetos são iguais, mas na maioria dos casos ser diferente émais importante que ser igual.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 81/103


HashCo<strong>de</strong> IIISabendo disto, à semelhança <strong>de</strong> equals() Object também <strong>de</strong>fineo método hashCo<strong>de</strong>() que não é mais que uma função <strong>de</strong>hash aplicada ao próprio objeto. É fácil <strong>de</strong> compreen<strong>de</strong>r quese alteramos o mecanismo padrão <strong>de</strong> verificação <strong>de</strong> igualda<strong>de</strong>,temos também que alterar o mecanismo padrão <strong>de</strong> produção docódigo <strong>de</strong> hash.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 82/103


HashCo<strong>de</strong> IVIsso nos leva à regra <strong>de</strong> consistência que diz que: Sempre quesobrescrever equals() sobrescreva também hashCo<strong>de</strong>() <strong>de</strong> formacompatível. De forma compatível significa que : Se a.equals(b)é verda<strong>de</strong> então também é verda<strong>de</strong> que a.hashCo<strong>de</strong>()==b.hashco<strong>de</strong>()Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 83/103


HashCo<strong>de</strong> VExistem muitas formas <strong>de</strong> re<strong>de</strong>finir o calculo do código <strong>de</strong> hash.Da mais simples e com pior performance que é fazer todos osobjetos terem o mesmo código até à mais complexa <strong>de</strong> <strong>de</strong>ixartodos os objetos terem um código diferente.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 84/103


HashCo<strong>de</strong> VIEmbora seja teoricamente possível ter uma função <strong>de</strong> hash tãoeficiente que produz um código diferente para cada objeto diferente,na prática nos encontramos limitados já que o códigotem que caber num int (32 bits).Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 85/103


HashCo<strong>de</strong> VIIEntão temos que vier com fato que nossas funções <strong>de</strong> hash vãoproduzir código iguais em algum ponto. A isso se chama Colisão<strong>de</strong> Hash. O objetivo é diminuir as colisões, ou seja diminuir afrequencia com que dois objetos diferentes produzem o mesmocódigo <strong>de</strong> hash. Quanto menos colisões, mais eficiente é a nossafunção <strong>de</strong> hash.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 86/103


HashCo<strong>de</strong> VIIIA função <strong>de</strong> hash mais simples é a operação <strong>de</strong> ou-exclusivo(XOR) que em Java se representa pelo operador ˆ.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 87/103


Coleções e Mapas ISão classes voltadas para estruturas <strong>de</strong> dados,pertencentes ao pacote java.util:ConjuntosConjuntosor<strong>de</strong>nadosMapasMapas Or<strong>de</strong>nados elistas.É largamente utilizado em programas: quem não precisa<strong>de</strong> um vetor, uma lista ou conjunto?Melhora a performance e a qualida<strong>de</strong>: evita ’reinventar’ aroda;Estimula o reuso;São conhecidos também como conjuntos;Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 88/103


Organização em Interfaces e Classes IO conjunto <strong>de</strong> classes java para coleções (Java Collection Framework)é composto <strong>de</strong> várias interfaces (I), e classes concretas(C). A seguir mostramos estas classes no formato hierárquicoem árvore:1 Collection (I)2 Set (I)3 HashSet (C)4 Sorted Set (I)5 TreeSet(C)6 List (I)7 ArrayList (C)8 Vector (C)9 LinkedList (C)10 Queue (I)11 ...12 Map (I)13 HashMap (C)14 Hashtable (C)Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 89/103


Organização em Interfaces e Classes II15 SortedMap (I)16 TreeMap (C)Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 90/103


IDefinindo cada uma das implementações1 ColeçõesCollection: interface que <strong>de</strong>fine operações comuns <strong>de</strong>coleções. Esta interface possui duas sub-interfaces - Set(Conjunto) e List (Lista);2 ConjuntosSet: implementação <strong>de</strong> Collection, que mo<strong>de</strong>la umconjunto <strong>de</strong> elementos únicos;HashSet: implementação <strong>de</strong> Set, mo<strong>de</strong>la conjuntos nãoor<strong>de</strong>nados;SortedSet: implementação <strong>de</strong> Set, mo<strong>de</strong>la conjuntosor<strong>de</strong>nados;3 ListasProf. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 91/103


IIDefinindo cada uma das implementaçõesList: mo<strong>de</strong>la listas <strong>de</strong> dados, on<strong>de</strong> os elementos(repetidos ou não) estão or<strong>de</strong>nados;ArrayList: usa métodos não-sincronizados e Vector utilizamétodos sincronizados (synchronized)Vector: é apropriado para uso em multithread, porém émais lento que ArrayList;LinkedList: é uma Lista, on<strong>de</strong> os elementos estãoligados. Tem uma inserção e <strong>de</strong>leção muito mais rápidosque ArrayList e Vector.4 MapasMap: mo<strong>de</strong>la mapeamentos entre chaves não-repetidas avalores;Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 92/103


Definindo cada uma das implementaçõesIII5 FilasHashMap: subclasse <strong>de</strong> Map, mo<strong>de</strong>la mapas nãoclassificados, com métodos não-sincronizados;Hashtable: subclasse <strong>de</strong> Map, mo<strong>de</strong>la mapas nãoclassificados, com métodos sincronizados;SortedMap: mo<strong>de</strong>la mapas classificados;Queue: é uma interface, que mo<strong>de</strong>la filas,Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 93/103


Definindo cada uma das implementaçõesIVNão confunda array (criados com []) com as classes ArrayListou Vector!Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 94/103


Exemplo comparativo entre array eArrayList IVeja a tabela comparativaarraynão tem dimensão dinâmicasuporta tipos primitivosnão é uma classenão suporta métodospossui atributo lengthArrayListtem dimensão dinâmicanão suporta tipos primitivos diretamenteé uma classesuporta métodosnão possui atributo lengthProf. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 95/103


Exemplo comparativo entre array eArrayList IIVeja o exemplo abaixo, comparando array e ArrayList:1 import java.util.ArrayList;2 public class ComparandoArrayEArrayList {3 public static void main(String[] args) {4 // inicialização:5 String[] ola1 = new String[3];6 ArrayList ola2 = new ArrayList();78 // atribuição9 ola1[0] = "o"; ola1[1] = "l"; ola1[2] = "a";10 ola2.add("o"); ola2.add("l"); ola2.add("a"); ola2.add("!");1112 // percorrendo com for13 for (String s: ola1)14 System.out.print(s);15 System.out.println();16 for (String s: ola2)17 System.out.print(s);Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 96/103


Exemplo comparativo entre array eArrayList III18 }19 }Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 97/103


Interface Collection IA interface Collection <strong>de</strong>fine várias operações básicas e operaçõesentre coleções. Vejamos sua implementação:1 public interface Collection extends Iterable {2 // Operações Básicas3 int size();4 boolean isEmpty();5 boolean contains(Object element);6 boolean add(E element);7 boolean remove(Object element);8 Iterator iterator();910 // Operações em massa11 boolean containsAll(Collection c);12 boolean addAll(Collection c);14 boolean retainAll(Collection c);15 void clear();1617 // Operações <strong>de</strong> arrayProf. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 98/103


Interface Collection II18 Object[] toArray();19 T[] toArray(T[] a);20 }Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 99/103


Interface Iterator IUma interface bastante importante é a interface Iterator, quepermite navegar (iterar) pelos vários elementos <strong>de</strong> uma coleção.1 public interface Iterator {2 boolean hasNext();3 E next();4 void remove();5 }Note que a interface Iterator é bastante simples, um Iterator éobtido da própria coleção através do método iterator() e <strong>de</strong>poispo<strong>de</strong>mos navegar pela coleção por meio dos métodos hasNext(),next() e remove();Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 100/103


Exemplo simples I1 import java.util.*;2 public class TesteArray {3 public static void main(String[] args) {4 ArrayList a1 = new ArrayList();5 ArrayList a2 = new ArrayList();6 a1.add("a");7 a1.add("b");8 a1.add("c");9 a2.add("d");10 a2.add("e");11 a2.add("f");12 Iterator i1 = a1.iterator();13 Iterator i2 = a2.iterator();14 // imprime a115 while (i1.hasNext()) {16 System.out.println(i1.next());17 }18 // imprime a219 while (i2.hasNext()) {20 System.out.println(i2.next());Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 101/103


Exemplo simples II21 }22 }23 }Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 102/103


Exercício1 Criando somente uma instância auxiliar <strong>de</strong> ArrayList,adicione os elementos <strong>de</strong> a2 em a1, <strong>de</strong> forma mesclada,ou seja, seu resultado final <strong>de</strong>verá ser: a, d, b, e, c, f.Imprima o novo a1 resultante.2 Sem criar novas instâncias <strong>de</strong> ArrayList, adicione oselementos <strong>de</strong> a1 no final <strong>de</strong> a2 e imprima o novo a2resultante.Prof. Fabrízzio Alphonsus A. M. N. Soares | <strong>Conceitos</strong> <strong>avançados</strong> <strong>de</strong> <strong>programação</strong> 103/103

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!