SlideShare ist ein Scribd-Unternehmen logo
1 von 49
Downloaden Sie, um offline zu lesen
Java - Introdução a
Coleções e Generics
Prof. Sérgio Souza Costa
Objetivo
• Prepararmos para entendermos como
funciona o “framework collection” do Java.
Capítulo de hoje: Um programador C/C++ precisa
lidar com coleções de dados em Java.
Para que estudar sobre o “framework
collection” do Java se eu posso
construir minhas próprias coleções ?
Aprendi nas aulas de estrutura de
dados ☺
Olhem milha pilha.
Muito fácil

public class Pilha {
int v[];
int pos;
public Pilha (int n) {
v = new int [n];
pos = 0;
}
public void empilha(int x) {
v[pos++] = x;
}
public int desempilha() {
return v[--pos] ;
}
}
Ok. Falta fazer uns
testes, mas ....

public class Pilha {
int v[];
int pos;
public Pilha (int n) {
v = new int [n];
pos = 0;
}
public void empilha(int x) {
v[pos++] = x;
}
public int desempilha() {
return v[--pos] ;
}
}
Ok. Falta fazer uns
testes, mas ....

Quais testes ele
está se referindo ?
public class Pilha {
int v[];
int pos;
public Pilha (int n) {
v = new int [n];
pos = 0;
}
public void empilha(int x) {
v[pos++] = x;
}
public int desempilha() {
return v[--pos] ;
}
}
Testando minha
pilha. O que
acharam?

public class Teste {
public static void main(String[] args) {
Pilha p = new Pilha (5);
p.empilha(10);
p.empilha(5);
p.empilha(2);
System.out.println(p.desempilha());
System.out.println(p.desempilha());
System.out.println(p.desempilha());
}
}
Para aulas de estrutura de
dados está ok, mas esta tua
pilha não é muito útil. Ela é
restrita a um tipo de dado (
inteiro)
Sim. Isso é por que Java é uma
linguagem que os métodos e
variáveis tem que ter tipos
definido estaticamente.
Em C, eu usava *void para
estruturas genéricas. Depois
bastava eu fazer um cast para
um tipo específico.
Será que Java não tem
algo similar ? O que
vocês acham ?
Yes. Como toda classe
em Java herda de
Object, este poderia ser
o tipo da minha pilha.
Pilha de Object
public class PilhaObjeto {
Object v[];
int pos;
public PilhaObjeto (int n) {
v = new Object [n];
pos = 0;
}
public void empilha(Object x) {
v[pos++] = x;
}
public Object desempilha() {
return v[--pos] ;
}
}
Resolvido. O que
acharam ?

public static void main(String[] args) {
PilhaObjeto p = new PilhaObjeto (5);
p.empilha("Joao");
p.empilha("Jose");
p.empilha("Maria");
String nome = (String) p.
desempilha();
System.out.println("nome:"+nome);
}
Mais um teste ...
public static void main(String[] args) {
PilhaObjeto p = new PilhaObjeto (5);
p.empilha("Joao");
p.empilha("Jose");
p.empilha(10);
String nome = (String) p.
desempilha();
System.out.println("nome:"+nome);
}
Mais um teste ...
public static void main(String[] args) {
PilhaObjeto p = new PilhaObjeto (5);
p.empilha("Joao");
p.empilha("Jose");
p.empilha(10);
String nome = (String) p.
desempilha();
System.out.println("nome:"+nome);
}

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer
cannot be cast to java.lang.String
at TesteObjeto.main(TesteObjeto.java:12)
Esperava este
erro
public static void main(String[] args) {
PilhaObjeto p = new PilhaObjeto (5);
p.empilha("Joao");
p.empilha("Jose");
p.empilha(10);
String nome = (String) p.
desempilha();
System.out.println("nome:"+nome);
}

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer
cannot be cast to java.lang.String
at TesteObjeto.main(TesteObjeto.java:12)
Mas achava que estava
armazenando um int.
O que é este Integer?
public static void main(String[] args) {
PilhaObjeto p = new PilhaObjeto (5);
p.empilha("Joao");
p.empilha("Jose");
p.empilha(10);
String nome = (String) p.
desempilha();
System.out.println("nome:"+nome);
}

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer
cannot be cast to java.lang.String
at TesteObjeto.main(TesteObjeto.java:12)
Esta solução funciona apenas
sobre objetos e não tipos
primitivos. O Integer é um objeto
equivalente ao Int.
Além disso, similar ao usar *void
em C, Object em Java pode gerar
problemas em tempo de
execução. Devido a inconsistência
em operações.
DILEMA: Tipos garante
consistência nas operações mas
enrijece a definição dos meus
métodos. Como resolver?
Até 2004, antes da versão 1.5,
teríamos que nos contentar com
o uso de Object.
Porem com a versão 1.5 o Java
passou a suportar classes
genéricas, também conhecido
como polimorfismo
paramétrico.
Ok. Vou pesquisar.....
Generics em Java é
similar a templates
em C++.
Basicamente
substituo tipos por
um T genérico.
Não funcionou como
esperado. Java não
reconheceu o
construtor genérico

public class PilhaGeneric <T> {
T v[];
int pos;
public PilhaGeneric (int n) {
v = new T [n];
pos = 0;
}
public void empilha(T x) {
v[pos++] = x;
}
public T desempilha() {
return v[--pos] ;
}
}
Por que será ?
public class PilhaGeneric <T> {
T v[];
int pos;
public PilhaGeneric (int n) {
v = new T [n];
pos = 0;
}
public void empilha(T x) {
v[pos++] = x;
}
public T desempilha() {
return v[--pos] ;
}
}
Java utiliza um
mecanismo chamado
Erasure para gerar os
códigos finais.

public class PilhaGeneric <T> {
T v[];
int pos;
public PilhaGeneric (int n) {
v = new T [n];
pos = 0;
}
public void empilha(T x) {
v[pos++] = x;
}
public T desempilha() {
return v[--pos] ;
}
}
Por enquanto saiba
que o Java não sabe
mapear um
construtor T genérico.

public class PilhaGeneric <T> {
T v[];
int pos;
public PilhaGeneric (int n) {
v = new T [n];
pos = 0;
}
public void empilha(T x) {
v[pos++] = x;
}
public T desempilha() {
return v[--pos] ;
}
}
Solução é construir
Object[] e depois
fazer um Cast.
public class PilhaGeneric <T> {
T v[];
int pos;
@SuppressWarnings("unchecked")
public PilhaGeneric (int n) {
v = (T[]) new Object [n];
pos = 0;
}
public void empilha(T x) {
v[pos++] = x;
}
public T desempilha() {
return v[--pos] ;
}
}
Agora podemos usar.

PilhaGeneric<Integer> p = new PilhaGeneric <Integer> (5);
p.empilha(10);
p.empilha("joao");

Causa um erro. A pilha é do tipo Integer.
Mantem consistência.
Além do array nativo
da linguagem Java,
existem coleções.
Esta tua classe pilha
poderia usar uma
coleção ao invés de
um array.
public class PilhaGeneric2 <T> {
private List<T> v;
public PilhaGeneric2 () {
v = new ArrayList<T>();
}
public void empilha(T x) {
v.add(x);
}
public T desempilha() {
return v.remove(v.size()-1) ;
}
}
Então poderíamos
usar da seguinte
maneira.

PilhaGeneric2<Integer> p =
new PilhaGeneric2 <Integer> ();
p.empilha(10);
p.empilha(20);
System.out.println(p.desempilha());
System.out.println(p.desempilha());
E se sua pilha tivesse
que retornar o maior
valor?
Fácil, não é só
escrever o seguinte
método? O que
acham?

public T maior () {
T maior = v.get(0);
for (int i=0; i< v.size(); i++) {
if (v.get(i) > maior)
maior = v.get(i);
}
return maior;
}
Fácil, não é só
escrever o seguinte
método? O que
acham?

Será que o operador (>)
pode ser aplicado em
qualquer objeto?
public T maior () {
T maior = v.get(0);
for (int i=0; i< v.size(); i++) {
if (v.get(i) > maior)
maior = v.get(i);
}
return maior;
}
Verdade, este método
não é tão genérico. O
objeto preciso saber
comparar.

public T maior () {
T maior = v.get(0);
for (int i=0; i< v.size(); i++) {
if (v.get(i) > maior)
maior = v.get(i);
}
return maior;
}
Em C++, basta eu
sobrecarregar o
operador (>). E em
Java?

public T maior () {
T maior = v.get(0);
for (int i=0; i< v.size(); i++) {
if (v.get(i) > maior)
maior = v.get(i);
}
return maior;
}
Java não possui
sobrecarga de
operadores, somente
de métodos.
Existe um método que
equivale a
comparação:
compareTo
Posso usar este
método da seguinte
maneira

public T maior () {
T maior = v.get(0);
for (int i=0; i< v.size(); i++) {
if (v.get(i).compareTo(maior) >
0)
maior = v.get(i);
}
return maior;
}
Porém preciso dizer que a
minha pilha funciona com
qualquer T, desde que ele
“extenda” a classe Comparable

public class PilhaGeneric3
<T extends Comparable<T>> {
…
}
A classe pilha ficaria
da seguinte maneira

public class PilhaGeneric3 <T extends
Comparable<T>> {
private List<T> v;
public PilhaGeneric3 () {
v = new ArrayList<T>();
}
public void empilha(T x) {
v.add(x);
}
public T desempilha() {
return v.remove(v.size()-1) ;
}
public T maior () {
T maior = v.get(0);
for (int i=0; i< v.size(); i++) {
if (v.get(i).compareTo(maior) >
0)
maior = v.get(i);
}
return maior;
}
}
Na verdade, o Java provê
um framework completo
para lidar com coleções de
dados.
Entendi. Melhor
aprender usar o
“framework
collection”
Excelente apresentação sobre
Collections e Generics

Weitere ähnliche Inhalte

Was ist angesagt?

Web2py: Desenvolvimento Ágil de Aplicações Web com Python
Web2py: Desenvolvimento Ágil de Aplicações Web com PythonWeb2py: Desenvolvimento Ágil de Aplicações Web com Python
Web2py: Desenvolvimento Ágil de Aplicações Web com Pythonchackero
 
J1Brasil: Persistência de Dados além do JPA, ou Como usar noSQL em Java
J1Brasil: Persistência de Dados além do JPA, ou Como usar noSQL em JavaJ1Brasil: Persistência de Dados além do JPA, ou Como usar noSQL em Java
J1Brasil: Persistência de Dados além do JPA, ou Como usar noSQL em JavaAlexandre Porcelli
 
Não tem teste ? Já nasceu legado.
Não tem teste ? Já nasceu legado.Não tem teste ? Já nasceu legado.
Não tem teste ? Já nasceu legado.GTS-CE
 
[Curso Java Basico - Exceptions] Aula 52: criando sua propria exception
[Curso Java Basico - Exceptions] Aula 52: criando sua propria exception[Curso Java Basico - Exceptions] Aula 52: criando sua propria exception
[Curso Java Basico - Exceptions] Aula 52: criando sua propria exceptionLoiane Groner
 
Grails - Destaques (para quem já sabe Java)
Grails - Destaques (para quem já sabe Java)Grails - Destaques (para quem já sabe Java)
Grails - Destaques (para quem já sabe Java)Douglas Mendes
 
Programação Desktop: Revisão Core Java
Programação Desktop: Revisão Core JavaProgramação Desktop: Revisão Core Java
Programação Desktop: Revisão Core JavaElaine Cecília Gatto
 
[Curso Java Basico] Aulas 75-84: Strings e StringBuilder
[Curso Java Basico] Aulas 75-84: Strings e StringBuilder[Curso Java Basico] Aulas 75-84: Strings e StringBuilder
[Curso Java Basico] Aulas 75-84: Strings e StringBuilderLoiane Groner
 
Combatendo code smells em aplicações Java
Combatendo code smells em aplicações JavaCombatendo code smells em aplicações Java
Combatendo code smells em aplicações JavaEmmanuel Neri
 

Was ist angesagt? (11)

Web2py: Desenvolvimento Ágil de Aplicações Web com Python
Web2py: Desenvolvimento Ágil de Aplicações Web com PythonWeb2py: Desenvolvimento Ágil de Aplicações Web com Python
Web2py: Desenvolvimento Ágil de Aplicações Web com Python
 
J1Brasil: Persistência de Dados além do JPA, ou Como usar noSQL em Java
J1Brasil: Persistência de Dados além do JPA, ou Como usar noSQL em JavaJ1Brasil: Persistência de Dados além do JPA, ou Como usar noSQL em Java
J1Brasil: Persistência de Dados além do JPA, ou Como usar noSQL em Java
 
Não tem teste ? Já nasceu legado.
Não tem teste ? Já nasceu legado.Não tem teste ? Já nasceu legado.
Não tem teste ? Já nasceu legado.
 
App scala
App scalaApp scala
App scala
 
[Curso Java Basico - Exceptions] Aula 52: criando sua propria exception
[Curso Java Basico - Exceptions] Aula 52: criando sua propria exception[Curso Java Basico - Exceptions] Aula 52: criando sua propria exception
[Curso Java Basico - Exceptions] Aula 52: criando sua propria exception
 
Grails - Destaques (para quem já sabe Java)
Grails - Destaques (para quem já sabe Java)Grails - Destaques (para quem já sabe Java)
Grails - Destaques (para quem já sabe Java)
 
Red Code
Red CodeRed Code
Red Code
 
Programação Desktop: Revisão Core Java
Programação Desktop: Revisão Core JavaProgramação Desktop: Revisão Core Java
Programação Desktop: Revisão Core Java
 
Javascript
JavascriptJavascript
Javascript
 
[Curso Java Basico] Aulas 75-84: Strings e StringBuilder
[Curso Java Basico] Aulas 75-84: Strings e StringBuilder[Curso Java Basico] Aulas 75-84: Strings e StringBuilder
[Curso Java Basico] Aulas 75-84: Strings e StringBuilder
 
Combatendo code smells em aplicações Java
Combatendo code smells em aplicações JavaCombatendo code smells em aplicações Java
Combatendo code smells em aplicações Java
 

Andere mochten auch

Introdução ao Java Swing (Interface)
Introdução ao Java Swing (Interface)Introdução ao Java Swing (Interface)
Introdução ao Java Swing (Interface)Sérgio Souza Costa
 
Java interface gráfica swing
Java   interface gráfica swingJava   interface gráfica swing
Java interface gráfica swingArmando Daniel
 
Java interface gráfica layouts
Java   interface gráfica layoutsJava   interface gráfica layouts
Java interface gráfica layoutsArmando Daniel
 
O fim dos SIGs: Como isso ira lhe_afetar ?
O fim dos SIGs: Como isso ira lhe_afetar ?O fim dos SIGs: Como isso ira lhe_afetar ?
O fim dos SIGs: Como isso ira lhe_afetar ?Sérgio Souza Costa
 
Mini Curso - Programação de Interfaces Gráficas - aula 4
Mini Curso - Programação de Interfaces Gráficas - aula 4Mini Curso - Programação de Interfaces Gráficas - aula 4
Mini Curso - Programação de Interfaces Gráficas - aula 4Carlos Eduardo
 
Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO
Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OOProgramação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO
Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OOCarlos Eduardo
 
Programação Orientada a Objetos - Pós Graduação - Aula 2
Programação Orientada a Objetos - Pós Graduação - Aula 2Programação Orientada a Objetos - Pós Graduação - Aula 2
Programação Orientada a Objetos - Pós Graduação - Aula 2Carlos Eduardo
 
Mini Curso - Programação de Interfaces Gráficas - aula extra persistência
Mini Curso - Programação de Interfaces Gráficas - aula extra persistênciaMini Curso - Programação de Interfaces Gráficas - aula extra persistência
Mini Curso - Programação de Interfaces Gráficas - aula extra persistênciaCarlos Eduardo
 
Mini Curso - Programação de Interfaces Gráficas - aula 1
Mini Curso - Programação de Interfaces Gráficas - aula 1Mini Curso - Programação de Interfaces Gráficas - aula 1
Mini Curso - Programação de Interfaces Gráficas - aula 1Carlos Eduardo
 
Mini Curso - Programação de Interfaces Gráficas - aula 3
Mini Curso - Programação de Interfaces Gráficas - aula 3Mini Curso - Programação de Interfaces Gráficas - aula 3
Mini Curso - Programação de Interfaces Gráficas - aula 3Carlos Eduardo
 
Programação Orientada a Objetos - Pós Graduação - Aula 8 - Bad Smells & Desig...
Programação Orientada a Objetos - Pós Graduação - Aula 8 - Bad Smells & Desig...Programação Orientada a Objetos - Pós Graduação - Aula 8 - Bad Smells & Desig...
Programação Orientada a Objetos - Pós Graduação - Aula 8 - Bad Smells & Desig...Carlos Eduardo
 
Programação Orientada a Objetos - Pós Graduação - Aula 7 - Inversão de Controle
Programação Orientada a Objetos - Pós Graduação - Aula 7 - Inversão de ControleProgramação Orientada a Objetos - Pós Graduação - Aula 7 - Inversão de Controle
Programação Orientada a Objetos - Pós Graduação - Aula 7 - Inversão de ControleCarlos Eduardo
 
Programação Orientada a Objetos - Pós Graduação - Aula 5 - refactoring com ho...
Programação Orientada a Objetos - Pós Graduação - Aula 5 - refactoring com ho...Programação Orientada a Objetos - Pós Graduação - Aula 5 - refactoring com ho...
Programação Orientada a Objetos - Pós Graduação - Aula 5 - refactoring com ho...Carlos Eduardo
 
Mini Curso - Programação de Interfaces Gráficas - aula 2
Mini Curso - Programação de Interfaces Gráficas - aula 2Mini Curso - Programação de Interfaces Gráficas - aula 2
Mini Curso - Programação de Interfaces Gráficas - aula 2Carlos Eduardo
 
Programação Orientada a Objetos - Pós Graduação - Aula 4 - refactoring com ho...
Programação Orientada a Objetos - Pós Graduação - Aula 4 - refactoring com ho...Programação Orientada a Objetos - Pós Graduação - Aula 4 - refactoring com ho...
Programação Orientada a Objetos - Pós Graduação - Aula 4 - refactoring com ho...Carlos Eduardo
 

Andere mochten auch (20)

Introdução ao Java Swing (Interface)
Introdução ao Java Swing (Interface)Introdução ao Java Swing (Interface)
Introdução ao Java Swing (Interface)
 
Java interface gráfica swing
Java   interface gráfica swingJava   interface gráfica swing
Java interface gráfica swing
 
Java Web Start
Java Web StartJava Web Start
Java Web Start
 
Java gui
Java guiJava gui
Java gui
 
Java10
Java10Java10
Java10
 
Java interface gráfica layouts
Java   interface gráfica layoutsJava   interface gráfica layouts
Java interface gráfica layouts
 
O fim dos SIGs: Como isso ira lhe_afetar ?
O fim dos SIGs: Como isso ira lhe_afetar ?O fim dos SIGs: Como isso ira lhe_afetar ?
O fim dos SIGs: Como isso ira lhe_afetar ?
 
Mini Curso - Programação de Interfaces Gráficas - aula 4
Mini Curso - Programação de Interfaces Gráficas - aula 4Mini Curso - Programação de Interfaces Gráficas - aula 4
Mini Curso - Programação de Interfaces Gráficas - aula 4
 
Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO
Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OOProgramação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO
Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO
 
Programação Orientada a Objetos - Pós Graduação - Aula 2
Programação Orientada a Objetos - Pós Graduação - Aula 2Programação Orientada a Objetos - Pós Graduação - Aula 2
Programação Orientada a Objetos - Pós Graduação - Aula 2
 
Mini Curso - Programação de Interfaces Gráficas - aula extra persistência
Mini Curso - Programação de Interfaces Gráficas - aula extra persistênciaMini Curso - Programação de Interfaces Gráficas - aula extra persistência
Mini Curso - Programação de Interfaces Gráficas - aula extra persistência
 
Mini Curso - Programação de Interfaces Gráficas - aula 1
Mini Curso - Programação de Interfaces Gráficas - aula 1Mini Curso - Programação de Interfaces Gráficas - aula 1
Mini Curso - Programação de Interfaces Gráficas - aula 1
 
Mini Curso - Programação de Interfaces Gráficas - aula 3
Mini Curso - Programação de Interfaces Gráficas - aula 3Mini Curso - Programação de Interfaces Gráficas - aula 3
Mini Curso - Programação de Interfaces Gráficas - aula 3
 
Programação Orientada a Objetos - Pós Graduação - Aula 8 - Bad Smells & Desig...
Programação Orientada a Objetos - Pós Graduação - Aula 8 - Bad Smells & Desig...Programação Orientada a Objetos - Pós Graduação - Aula 8 - Bad Smells & Desig...
Programação Orientada a Objetos - Pós Graduação - Aula 8 - Bad Smells & Desig...
 
php 01 introducao
php 01 introducaophp 01 introducao
php 01 introducao
 
Programação Orientada a Objetos - Pós Graduação - Aula 7 - Inversão de Controle
Programação Orientada a Objetos - Pós Graduação - Aula 7 - Inversão de ControleProgramação Orientada a Objetos - Pós Graduação - Aula 7 - Inversão de Controle
Programação Orientada a Objetos - Pós Graduação - Aula 7 - Inversão de Controle
 
Programação Orientada a Objetos - Pós Graduação - Aula 5 - refactoring com ho...
Programação Orientada a Objetos - Pós Graduação - Aula 5 - refactoring com ho...Programação Orientada a Objetos - Pós Graduação - Aula 5 - refactoring com ho...
Programação Orientada a Objetos - Pós Graduação - Aula 5 - refactoring com ho...
 
Java Lista Exercicios 04
Java Lista Exercicios 04Java Lista Exercicios 04
Java Lista Exercicios 04
 
Mini Curso - Programação de Interfaces Gráficas - aula 2
Mini Curso - Programação de Interfaces Gráficas - aula 2Mini Curso - Programação de Interfaces Gráficas - aula 2
Mini Curso - Programação de Interfaces Gráficas - aula 2
 
Programação Orientada a Objetos - Pós Graduação - Aula 4 - refactoring com ho...
Programação Orientada a Objetos - Pós Graduação - Aula 4 - refactoring com ho...Programação Orientada a Objetos - Pós Graduação - Aula 4 - refactoring com ho...
Programação Orientada a Objetos - Pós Graduação - Aula 4 - refactoring com ho...
 

Ähnlich wie Java - Introdução a Coleções e Generics

Aula actionscript basico
Aula actionscript basicoAula actionscript basico
Aula actionscript basicoWemerson Silva
 
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completaRefatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completaEduardo Bregaida
 
Java aprendendo linguagem.ppt
Java aprendendo linguagem.pptJava aprendendo linguagem.ppt
Java aprendendo linguagem.pptEmerson Cardoso
 
Palestra Novidades da linguagem C# 6
Palestra Novidades da linguagem C# 6Palestra Novidades da linguagem C# 6
Palestra Novidades da linguagem C# 6Renato Haddad
 
Plataforma de compiladores .NET, C# 6 e Visual Studio 2015
Plataforma de compiladores .NET, C# 6 e Visual Studio 2015Plataforma de compiladores .NET, C# 6 e Visual Studio 2015
Plataforma de compiladores .NET, C# 6 e Visual Studio 2015Rogério Moraes de Carvalho
 
Plataforma de compiladores .NET (“Roslyn”), C# 6 e Visual Studio “14”
Plataforma de compiladores .NET (“Roslyn”), C# 6 e Visual Studio “14”Plataforma de compiladores .NET (“Roslyn”), C# 6 e Visual Studio “14”
Plataforma de compiladores .NET (“Roslyn”), C# 6 e Visual Studio “14”Rogério Moraes de Carvalho
 
Sistemas Distribuídos - Aula 04 - Revisão de Java
Sistemas Distribuídos - Aula 04 - Revisão de JavaSistemas Distribuídos - Aula 04 - Revisão de Java
Sistemas Distribuídos - Aula 04 - Revisão de JavaArthur Emanuel
 
Estrutura de Dados e Algoritmos com Java #02-12: Vetores e Arrays
Estrutura de Dados e Algoritmos com Java #02-12: Vetores e ArraysEstrutura de Dados e Algoritmos com Java #02-12: Vetores e Arrays
Estrutura de Dados e Algoritmos com Java #02-12: Vetores e ArraysLoiane Groner
 
Testes de Unidade com JUnit
Testes de Unidade com JUnitTestes de Unidade com JUnit
Testes de Unidade com JUnitelliando dias
 
Turbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com KotlinTurbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com KotlinNelson Glauber Leal
 
Introdução à análise orientada a objetos parte 2
Introdução à análise orientada a objetos parte 2Introdução à análise orientada a objetos parte 2
Introdução à análise orientada a objetos parte 2irenescotolo
 
Aprendendo Kotlin na Prática
Aprendendo Kotlin na PráticaAprendendo Kotlin na Prática
Aprendendo Kotlin na PráticaFelipe Pedroso
 
11 tipos abstratos de dados
11   tipos abstratos de dados11   tipos abstratos de dados
11 tipos abstratos de dadosRicardo Bolanho
 

Ähnlich wie Java - Introdução a Coleções e Generics (20)

Aula actionscript basico
Aula actionscript basicoAula actionscript basico
Aula actionscript basico
 
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completaRefatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
 
Java aprendendo linguagem.ppt
Java aprendendo linguagem.pptJava aprendendo linguagem.ppt
Java aprendendo linguagem.ppt
 
Palestra Novidades da linguagem C# 6
Palestra Novidades da linguagem C# 6Palestra Novidades da linguagem C# 6
Palestra Novidades da linguagem C# 6
 
Busca Binária
Busca BináriaBusca Binária
Busca Binária
 
Pilha e Fila Estática
Pilha e Fila EstáticaPilha e Fila Estática
Pilha e Fila Estática
 
Aula 8
Aula 8Aula 8
Aula 8
 
Tdc2010 web
Tdc2010 webTdc2010 web
Tdc2010 web
 
Design OO
Design OODesign OO
Design OO
 
Plataforma de compiladores .NET, C# 6 e Visual Studio 2015
Plataforma de compiladores .NET, C# 6 e Visual Studio 2015Plataforma de compiladores .NET, C# 6 e Visual Studio 2015
Plataforma de compiladores .NET, C# 6 e Visual Studio 2015
 
Plataforma de compiladores .NET (“Roslyn”), C# 6 e Visual Studio “14”
Plataforma de compiladores .NET (“Roslyn”), C# 6 e Visual Studio “14”Plataforma de compiladores .NET (“Roslyn”), C# 6 e Visual Studio “14”
Plataforma de compiladores .NET (“Roslyn”), C# 6 e Visual Studio “14”
 
JQuery
JQuery JQuery
JQuery
 
Sistemas Distribuídos - Aula 04 - Revisão de Java
Sistemas Distribuídos - Aula 04 - Revisão de JavaSistemas Distribuídos - Aula 04 - Revisão de Java
Sistemas Distribuídos - Aula 04 - Revisão de Java
 
Javascript
Javascript Javascript
Javascript
 
Estrutura de Dados e Algoritmos com Java #02-12: Vetores e Arrays
Estrutura de Dados e Algoritmos com Java #02-12: Vetores e ArraysEstrutura de Dados e Algoritmos com Java #02-12: Vetores e Arrays
Estrutura de Dados e Algoritmos com Java #02-12: Vetores e Arrays
 
Testes de Unidade com JUnit
Testes de Unidade com JUnitTestes de Unidade com JUnit
Testes de Unidade com JUnit
 
Turbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com KotlinTurbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com Kotlin
 
Introdução à análise orientada a objetos parte 2
Introdução à análise orientada a objetos parte 2Introdução à análise orientada a objetos parte 2
Introdução à análise orientada a objetos parte 2
 
Aprendendo Kotlin na Prática
Aprendendo Kotlin na PráticaAprendendo Kotlin na Prática
Aprendendo Kotlin na Prática
 
11 tipos abstratos de dados
11   tipos abstratos de dados11   tipos abstratos de dados
11 tipos abstratos de dados
 

Mehr von Sérgio Souza Costa

Expressões aritméticas, relacionais e lógicas
Expressões aritméticas, relacionais e lógicasExpressões aritméticas, relacionais e lógicas
Expressões aritméticas, relacionais e lógicasSérgio Souza Costa
 
De algoritmos à programas de computador
De algoritmos à programas de computadorDe algoritmos à programas de computador
De algoritmos à programas de computadorSérgio Souza Costa
 
Introdução ao pensamento computacional e aos algoritmos
Introdução ao pensamento computacional e aos algoritmosIntrodução ao pensamento computacional e aos algoritmos
Introdução ao pensamento computacional e aos algoritmosSérgio Souza Costa
 
Minicurso de introdução a banco de dados geográficos
Minicurso de introdução a banco de dados geográficosMinicurso de introdução a banco de dados geográficos
Minicurso de introdução a banco de dados geográficosSérgio Souza Costa
 
Banco de dados geográfico - Aula de Encerramento
Banco de dados geográfico - Aula de EncerramentoBanco de dados geográfico - Aula de Encerramento
Banco de dados geográfico - Aula de EncerramentoSérgio Souza Costa
 
Banco de dados geográficos – Arquiteturas, banco de dados e modelagem
Banco de dados geográficos – Arquiteturas, banco de dados e modelagemBanco de dados geográficos – Arquiteturas, banco de dados e modelagem
Banco de dados geográficos – Arquiteturas, banco de dados e modelagemSérgio Souza Costa
 
Banco de dados geográficos - Aula de abertura
Banco de dados geográficos - Aula de aberturaBanco de dados geográficos - Aula de abertura
Banco de dados geográficos - Aula de aberturaSérgio Souza Costa
 
Linguagem SQL e Extensões Espacias - Introdução
Linguagem SQL e Extensões Espacias - IntroduçãoLinguagem SQL e Extensões Espacias - Introdução
Linguagem SQL e Extensões Espacias - IntroduçãoSérgio Souza Costa
 
Gödel’s incompleteness theorems
Gödel’s incompleteness theoremsGödel’s incompleteness theorems
Gödel’s incompleteness theoremsSérgio Souza Costa
 
DBCells - an open and global multi-scale linked cells
DBCells - an open and global multi-scale linked cellsDBCells - an open and global multi-scale linked cells
DBCells - an open and global multi-scale linked cellsSérgio Souza Costa
 
Conceitos básicos de orientação a objetos
Conceitos básicos de orientação a objetosConceitos básicos de orientação a objetos
Conceitos básicos de orientação a objetosSérgio Souza Costa
 
Polymorphism (Ad-hoc and Universal)
Polymorphism (Ad-hoc and Universal)Polymorphism (Ad-hoc and Universal)
Polymorphism (Ad-hoc and Universal)Sérgio Souza Costa
 
Relações (composição e agregação)
Relações (composição e agregação)Relações (composição e agregação)
Relações (composição e agregação)Sérgio Souza Costa
 

Mehr von Sérgio Souza Costa (20)

Expressões aritméticas, relacionais e lógicas
Expressões aritméticas, relacionais e lógicasExpressões aritméticas, relacionais e lógicas
Expressões aritméticas, relacionais e lógicas
 
De algoritmos à programas de computador
De algoritmos à programas de computadorDe algoritmos à programas de computador
De algoritmos à programas de computador
 
Introdução ao pensamento computacional e aos algoritmos
Introdução ao pensamento computacional e aos algoritmosIntrodução ao pensamento computacional e aos algoritmos
Introdução ao pensamento computacional e aos algoritmos
 
Minicurso de introdução a banco de dados geográficos
Minicurso de introdução a banco de dados geográficosMinicurso de introdução a banco de dados geográficos
Minicurso de introdução a banco de dados geográficos
 
Modelagem de dados geográficos
Modelagem de dados geográficosModelagem de dados geográficos
Modelagem de dados geográficos
 
Banco de dados geográfico - Aula de Encerramento
Banco de dados geográfico - Aula de EncerramentoBanco de dados geográfico - Aula de Encerramento
Banco de dados geográfico - Aula de Encerramento
 
Banco de dados geográficos – Arquiteturas, banco de dados e modelagem
Banco de dados geográficos – Arquiteturas, banco de dados e modelagemBanco de dados geográficos – Arquiteturas, banco de dados e modelagem
Banco de dados geográficos – Arquiteturas, banco de dados e modelagem
 
Banco de dados geográficos - Aula de abertura
Banco de dados geográficos - Aula de aberturaBanco de dados geográficos - Aula de abertura
Banco de dados geográficos - Aula de abertura
 
Linguagem SQL e Extensões Espacias - Introdução
Linguagem SQL e Extensões Espacias - IntroduçãoLinguagem SQL e Extensões Espacias - Introdução
Linguagem SQL e Extensões Espacias - Introdução
 
Gödel’s incompleteness theorems
Gödel’s incompleteness theoremsGödel’s incompleteness theorems
Gödel’s incompleteness theorems
 
Turing e o problema da decisão
Turing e o problema da decisãoTuring e o problema da decisão
Turing e o problema da decisão
 
DBCells - an open and global multi-scale linked cells
DBCells - an open and global multi-scale linked cellsDBCells - an open and global multi-scale linked cells
DBCells - an open and global multi-scale linked cells
 
Conceitos básicos de orientação a objetos
Conceitos básicos de orientação a objetosConceitos básicos de orientação a objetos
Conceitos básicos de orientação a objetos
 
Polymorphism (Ad-hoc and Universal)
Polymorphism (Ad-hoc and Universal)Polymorphism (Ad-hoc and Universal)
Polymorphism (Ad-hoc and Universal)
 
Herança e Encapsulamento
Herança e EncapsulamentoHerança e Encapsulamento
Herança e Encapsulamento
 
Relações (composição e agregação)
Relações (composição e agregação)Relações (composição e agregação)
Relações (composição e agregação)
 
Abstract classes and interfaces
Abstract classes and interfacesAbstract classes and interfaces
Abstract classes and interfaces
 
Introdução ao Prolog
Introdução ao PrologIntrodução ao Prolog
Introdução ao Prolog
 
Heap - Python
Heap - PythonHeap - Python
Heap - Python
 
Paradigma lógico
Paradigma lógicoParadigma lógico
Paradigma lógico
 

Java - Introdução a Coleções e Generics

  • 1. Java - Introdução a Coleções e Generics Prof. Sérgio Souza Costa
  • 2. Objetivo • Prepararmos para entendermos como funciona o “framework collection” do Java.
  • 3. Capítulo de hoje: Um programador C/C++ precisa lidar com coleções de dados em Java.
  • 4. Para que estudar sobre o “framework collection” do Java se eu posso construir minhas próprias coleções ? Aprendi nas aulas de estrutura de dados ☺
  • 5. Olhem milha pilha. Muito fácil public class Pilha { int v[]; int pos; public Pilha (int n) { v = new int [n]; pos = 0; } public void empilha(int x) { v[pos++] = x; } public int desempilha() { return v[--pos] ; } }
  • 6. Ok. Falta fazer uns testes, mas .... public class Pilha { int v[]; int pos; public Pilha (int n) { v = new int [n]; pos = 0; } public void empilha(int x) { v[pos++] = x; } public int desempilha() { return v[--pos] ; } }
  • 7. Ok. Falta fazer uns testes, mas .... Quais testes ele está se referindo ? public class Pilha { int v[]; int pos; public Pilha (int n) { v = new int [n]; pos = 0; } public void empilha(int x) { v[pos++] = x; } public int desempilha() { return v[--pos] ; } }
  • 8. Testando minha pilha. O que acharam? public class Teste { public static void main(String[] args) { Pilha p = new Pilha (5); p.empilha(10); p.empilha(5); p.empilha(2); System.out.println(p.desempilha()); System.out.println(p.desempilha()); System.out.println(p.desempilha()); } }
  • 9. Para aulas de estrutura de dados está ok, mas esta tua pilha não é muito útil. Ela é restrita a um tipo de dado ( inteiro)
  • 10. Sim. Isso é por que Java é uma linguagem que os métodos e variáveis tem que ter tipos definido estaticamente.
  • 11. Em C, eu usava *void para estruturas genéricas. Depois bastava eu fazer um cast para um tipo específico.
  • 12. Será que Java não tem algo similar ? O que vocês acham ?
  • 13. Yes. Como toda classe em Java herda de Object, este poderia ser o tipo da minha pilha.
  • 14. Pilha de Object public class PilhaObjeto { Object v[]; int pos; public PilhaObjeto (int n) { v = new Object [n]; pos = 0; } public void empilha(Object x) { v[pos++] = x; } public Object desempilha() { return v[--pos] ; } }
  • 15. Resolvido. O que acharam ? public static void main(String[] args) { PilhaObjeto p = new PilhaObjeto (5); p.empilha("Joao"); p.empilha("Jose"); p.empilha("Maria"); String nome = (String) p. desempilha(); System.out.println("nome:"+nome); }
  • 16. Mais um teste ... public static void main(String[] args) { PilhaObjeto p = new PilhaObjeto (5); p.empilha("Joao"); p.empilha("Jose"); p.empilha(10); String nome = (String) p. desempilha(); System.out.println("nome:"+nome); }
  • 17. Mais um teste ... public static void main(String[] args) { PilhaObjeto p = new PilhaObjeto (5); p.empilha("Joao"); p.empilha("Jose"); p.empilha(10); String nome = (String) p. desempilha(); System.out.println("nome:"+nome); } Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String at TesteObjeto.main(TesteObjeto.java:12)
  • 18. Esperava este erro public static void main(String[] args) { PilhaObjeto p = new PilhaObjeto (5); p.empilha("Joao"); p.empilha("Jose"); p.empilha(10); String nome = (String) p. desempilha(); System.out.println("nome:"+nome); } Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String at TesteObjeto.main(TesteObjeto.java:12)
  • 19. Mas achava que estava armazenando um int. O que é este Integer? public static void main(String[] args) { PilhaObjeto p = new PilhaObjeto (5); p.empilha("Joao"); p.empilha("Jose"); p.empilha(10); String nome = (String) p. desempilha(); System.out.println("nome:"+nome); } Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String at TesteObjeto.main(TesteObjeto.java:12)
  • 20. Esta solução funciona apenas sobre objetos e não tipos primitivos. O Integer é um objeto equivalente ao Int.
  • 21. Além disso, similar ao usar *void em C, Object em Java pode gerar problemas em tempo de execução. Devido a inconsistência em operações.
  • 22. DILEMA: Tipos garante consistência nas operações mas enrijece a definição dos meus métodos. Como resolver?
  • 23. Até 2004, antes da versão 1.5, teríamos que nos contentar com o uso de Object.
  • 24. Porem com a versão 1.5 o Java passou a suportar classes genéricas, também conhecido como polimorfismo paramétrico.
  • 26. Generics em Java é similar a templates em C++.
  • 28. Não funcionou como esperado. Java não reconheceu o construtor genérico public class PilhaGeneric <T> { T v[]; int pos; public PilhaGeneric (int n) { v = new T [n]; pos = 0; } public void empilha(T x) { v[pos++] = x; } public T desempilha() { return v[--pos] ; } }
  • 29. Por que será ? public class PilhaGeneric <T> { T v[]; int pos; public PilhaGeneric (int n) { v = new T [n]; pos = 0; } public void empilha(T x) { v[pos++] = x; } public T desempilha() { return v[--pos] ; } }
  • 30. Java utiliza um mecanismo chamado Erasure para gerar os códigos finais. public class PilhaGeneric <T> { T v[]; int pos; public PilhaGeneric (int n) { v = new T [n]; pos = 0; } public void empilha(T x) { v[pos++] = x; } public T desempilha() { return v[--pos] ; } }
  • 31. Por enquanto saiba que o Java não sabe mapear um construtor T genérico. public class PilhaGeneric <T> { T v[]; int pos; public PilhaGeneric (int n) { v = new T [n]; pos = 0; } public void empilha(T x) { v[pos++] = x; } public T desempilha() { return v[--pos] ; } }
  • 32. Solução é construir Object[] e depois fazer um Cast. public class PilhaGeneric <T> { T v[]; int pos; @SuppressWarnings("unchecked") public PilhaGeneric (int n) { v = (T[]) new Object [n]; pos = 0; } public void empilha(T x) { v[pos++] = x; } public T desempilha() { return v[--pos] ; } }
  • 33. Agora podemos usar. PilhaGeneric<Integer> p = new PilhaGeneric <Integer> (5); p.empilha(10); p.empilha("joao"); Causa um erro. A pilha é do tipo Integer. Mantem consistência.
  • 34. Além do array nativo da linguagem Java, existem coleções.
  • 35. Esta tua classe pilha poderia usar uma coleção ao invés de um array. public class PilhaGeneric2 <T> { private List<T> v; public PilhaGeneric2 () { v = new ArrayList<T>(); } public void empilha(T x) { v.add(x); } public T desempilha() { return v.remove(v.size()-1) ; } }
  • 36. Então poderíamos usar da seguinte maneira. PilhaGeneric2<Integer> p = new PilhaGeneric2 <Integer> (); p.empilha(10); p.empilha(20); System.out.println(p.desempilha()); System.out.println(p.desempilha());
  • 37. E se sua pilha tivesse que retornar o maior valor?
  • 38. Fácil, não é só escrever o seguinte método? O que acham? public T maior () { T maior = v.get(0); for (int i=0; i< v.size(); i++) { if (v.get(i) > maior) maior = v.get(i); } return maior; }
  • 39. Fácil, não é só escrever o seguinte método? O que acham? Será que o operador (>) pode ser aplicado em qualquer objeto? public T maior () { T maior = v.get(0); for (int i=0; i< v.size(); i++) { if (v.get(i) > maior) maior = v.get(i); } return maior; }
  • 40. Verdade, este método não é tão genérico. O objeto preciso saber comparar. public T maior () { T maior = v.get(0); for (int i=0; i< v.size(); i++) { if (v.get(i) > maior) maior = v.get(i); } return maior; }
  • 41. Em C++, basta eu sobrecarregar o operador (>). E em Java? public T maior () { T maior = v.get(0); for (int i=0; i< v.size(); i++) { if (v.get(i) > maior) maior = v.get(i); } return maior; }
  • 42. Java não possui sobrecarga de operadores, somente de métodos.
  • 43. Existe um método que equivale a comparação: compareTo
  • 44. Posso usar este método da seguinte maneira public T maior () { T maior = v.get(0); for (int i=0; i< v.size(); i++) { if (v.get(i).compareTo(maior) > 0) maior = v.get(i); } return maior; }
  • 45. Porém preciso dizer que a minha pilha funciona com qualquer T, desde que ele “extenda” a classe Comparable public class PilhaGeneric3 <T extends Comparable<T>> { … }
  • 46. A classe pilha ficaria da seguinte maneira public class PilhaGeneric3 <T extends Comparable<T>> { private List<T> v; public PilhaGeneric3 () { v = new ArrayList<T>(); } public void empilha(T x) { v.add(x); } public T desempilha() { return v.remove(v.size()-1) ; } public T maior () { T maior = v.get(0); for (int i=0; i< v.size(); i++) { if (v.get(i).compareTo(maior) > 0) maior = v.get(i); } return maior; } }
  • 47. Na verdade, o Java provê um framework completo para lidar com coleções de dados.
  • 48. Entendi. Melhor aprender usar o “framework collection”