84
Recapitulando... public class Onibus { private String nome; private String linha; public Onibus(String nome, String linha) { this.nome = nome; this.linha = linha; } // getters }

Usando melhor as Collections

Embed Size (px)

DESCRIPTION

Palestra dada no Conexão Java 2012 sobre Collections no Java. Os códigos finais podem ser encontrados em: http://github.com/caelum/conexaojava

Citation preview

Page 1: Usando melhor as Collections

Recapitulando... public class Onibus {

private String nome;private String linha;

public Onibus(String nome,

String linha) {this.nome = nome;this.linha = linha;

} // getters

}

Page 2: Usando melhor as Collections

Recapitulando... public class Onibus {

private String nome;private String linha;

public Onibus(String nome,

String linha) {this.nome = nome;this.linha = linha;

} // getters

}

Page 3: Usando melhor as Collections

Recapitulando...

Page 4: Usando melhor as Collections

Recapitulando...Peraí! Estávamos

Page 5: Usando melhor as Collections

public class PontoDeOnibus {

private String nome;private double latitude;private double longitude;private ArrayList<Onibus> onibuses;

public PontoDeOnibus(String nome,

double latitude, double longitude) {this.____ = ____;this.onibuses = new ArrayList<Onibus>();

}// getters// adiciona e passa

}

Recapitulando...

Page 6: Usando melhor as Collections

public class PontoDeOnibus {

private String nome;private double latitude;private double longitude;private ArrayList<Onibus> onibuses;

public PontoDeOnibus(String nome,

double latitude, double longitude) {this.____ = ____;this.onibuses = new ArrayList<Onibus>();

}// getters// adiciona e passa

}

Recapitulando...

Page 7: Usando melhor as Collections

public class PontoDeOnibus {

private String nome;private double latitude;private double longitude;private ArrayList<Onibus> onibuses;

public PontoDeOnibus(String nome,

double latitude, double longitude) {this.____ = ____;this.onibuses = new ArrayList<Onibus>();

}// getters// adiciona e passaOnibus

}

Recapitulando...Bizarro!

Page 8: Usando melhor as Collections

public class PontoDeOnibus {

private String nome;private double latitude;private double longitude;private ArrayList<Onibus> onibuses;

public PontoDeOnibus(String nome,

double latitude, double longitude) {this.____ = ____;this.onibuses = new ArrayList<Onibus>();

}// getters// adiciona e passa

}

Recapitulando...Bizarro!

Ninguém faz

assim!

Page 9: Usando melhor as Collections

Por que não?

Page 10: Usando melhor as Collections

Entendendo melhor as

Collections

Cecilia [email protected]/ceci

Page 11: Usando melhor as Collections

Antes de começarmos...

Page 12: Usando melhor as Collections

public class PontoDeOnibus {

private String nome;private double latitude;private double longitude;private ArrayList<Onibus> onibuses;

public PontoDeOnibus(String nome,

double latitude, double longitude) {// ...this.onibuses = new ArrayList<Onibus>();

}// getters// adiciona e passa

}

Page 13: Usando melhor as Collections

public class PontoDeOnibus {

private String nome;private double latitude;private double longitude;private ArrayList<Onibus> onibuses;

public PontoDeOnibus(String nome,

double latitude, double longitude) {// ...this.onibuses = new ArrayList<Onibus>();

}// getters// adiciona e passa

}

localizacao

Page 14: Usando melhor as Collections

public class PontoDeOnibus {

private String nome;private Coordenada localizacao;private ArrayList<Onibus> onibuses;

public PontoDeOnibus(String nome, Coordenada localizacao) {

// ...this.onibuses = new ArrayList<Onibus>();

}// getters// adiciona e passa

}

Page 15: Usando melhor as Collections

Agora sim!

Page 16: Usando melhor as Collections

public class PontoDeOnibus {

private String nome;private Coordenada localizacao;private ArrayList<Onibus> onibuses;

public PontoDeOnibus(String nome, Coordenada localizacao) {

// ...this.onibuses = new ArrayList<Onibus>();

}// getters// adiciona e passa

}

Page 17: Usando melhor as Collections

public class PontoDeOnibus {

private String nome;private Coordenada localizacao;private ArrayList<Onibus> onibuses;

public PontoDeOnibus(String nome, Coordenada localizacao) {

// ...this.onibuses = new ArrayList<Onibus>();

}// getters// adiciona e passa

}

Page 18: Usando melhor as Collections

private ArrayList<Onibus>

Page 19: Usando melhor as Collections

private ArrayList<Onibus>

private LinkedList<Onibus>

Page 20: Usando melhor as Collections

private ArrayList<Onibus>

private LinkedList<Onibus>

private Vector<Onibus>

Page 21: Usando melhor as Collections

private ArrayList<Onibus>

private LinkedList<Onibus>

private Vector<Onibus>

Qual?

Page 22: Usando melhor as Collections

private ArrayList<Onibus>

private LinkedList<Onibus>

private Vector<Onibus>

Qual?

Tanto faz!

Page 23: Usando melhor as Collections

Qualquer coisa que seja uma...

Page 24: Usando melhor as Collections

List

Qualquer coisa que seja uma...

Page 25: Usando melhor as Collections

java.util.List

Qualquer coisa que seja uma...

Page 26: Usando melhor as Collections

public class PontoDeOnibus {

private String nome;private Coordenada localizacao;private ArrayList<Onibus> onibuses;

public PontoDeOnibus(String nome, Coordenada localizacao) {

// ...this.onibuses = new ArrayList<Onibus>();

}// getters// adiciona e passaOnibus

}

Codingtime!

Page 27: Usando melhor as Collections

public class PontoDeOnibus {

private String nome;private Coordenada localizacao;private ArrayList<Onibus> onibuses;

public PontoDeOnibus(String nome, Coordenada localizacao) {

// ...this.onibuses = new ArrayList<Onibus>();

}// getters// adiciona e passaOnibus

}

O getOnibuses também está

falho...

Page 28: Usando melhor as Collections

public List<Onibus> getOnibuses() {return onibuses;

} public List<Onibus> getOnibuses() {

return Collections.unmodifiableList(onibuses);}

Antes:

Depois:

Page 29: Usando melhor as Collections

public List<Onibus> getOnibuses() {return onibuses;

} public List<Onibus> getOnibuses() {

return Collections.unmodifiableList(onibuses);}

Antes:

Depois:

Page 30: Usando melhor as Collections

Mas...

Page 31: Usando melhor as Collections

Mas...

List?

Page 32: Usando melhor as Collections
Page 33: Usando melhor as Collections
Page 34: Usando melhor as Collections
Page 35: Usando melhor as Collections

Podia ser...

Page 36: Usando melhor as Collections

Set

Page 37: Usando melhor as Collections

TreeSet

Page 38: Usando melhor as Collections

TreeSet

Page 39: Usando melhor as Collections

TreeSet<

< <

< <

Page 40: Usando melhor as Collections

TreeSet<

< <

< <

>

>>

> >

Page 41: Usando melhor as Collections

HashSet

Page 42: Usando melhor as Collections

HashSet

Page 43: Usando melhor as Collections

HashSet

Page 44: Usando melhor as Collections

HashSet

?

Page 45: Usando melhor as Collections

HashSet

Page 46: Usando melhor as Collections

HashSet

Page 47: Usando melhor as Collections

HashSet

@Overridepublic int hashCode() {

final int prime = 31; int result = 1; result = prime * result + ((linha == null) ? 0 : linha.hashCode()); return result;

}

Page 48: Usando melhor as Collections

HashSet

@Overridepublic int hashCode() {

final int prime = 31; int result = 1; result = prime * result + ((linha == null) ? 0 : linha.hashCode()); return result;

}

Page 49: Usando melhor as Collections

HashSet

Page 50: Usando melhor as Collections

E aí...

Page 51: Usando melhor as Collections

TreeSet

Page 52: Usando melhor as Collections

TreeSet

LinkedList

Page 53: Usando melhor as Collections

ArrayList

TreeSet

LinkedList

Page 54: Usando melhor as Collections

ArrayList

TreeSet HashSet

LinkedList

Page 55: Usando melhor as Collections

ArrayList

TreeSet HashSet

LinkedList

Todos

servem!

Page 56: Usando melhor as Collections

ArrayList

TreeSet HashSet

LinkedList

Qualquer coisa

que seja uma..

Page 57: Usando melhor as Collections

ArrayList

TreeSet HashSet

LinkedList

Qualquer coisa

que seja uma..

Collection

Page 58: Usando melhor as Collections

E aí...

Page 59: Usando melhor as Collections

public class TestaBusao { public static void main(String[] args) { List<Onibus> onibuses = Arrays.asList(

new Onibus("2002/10", "TERMINAL BANDEIRA"), new Onibus("2290/10", "TERMINAL SÃO MATEUS"), new Onibus("5108/10", "JARDIM CELESTE"), new Onibus("5111/10", "TERMINAL SANTO AMARO"), new Onibus("5300/10", "TERMINAL SANTO AMARO"), new Onibus("6403/10", "TERMINAL JOÃO DIAS"), new Onibus("9300/10", "TERMINAL CASA VERDE"), new Onibus("3539/10", "CIDADE TIRADENTES"), new Onibus("3539/10", "TERMINAL CIDADE TIRADENTES"),

Vamos ver...

Page 60: Usando melhor as Collections

public class TestaBusao { public static void main(String[] args) { List<Onibus> onibuses = Arrays.asList(

new Onibus("2002/10", "TERMINAL BANDEIRA"), new Onibus("2290/10", "TERMINAL SÃO MATEUS"), new Onibus("5108/10", "JARDIM CELESTE"), new Onibus("5111/10", "TERMINAL SANTO AMARO"), new Onibus("5300/10", "TERMINAL SANTO AMARO"), new Onibus("6403/10", "TERMINAL JOÃO DIAS"), new Onibus("9300/10", "TERMINAL CASA VERDE"), new Onibus("3539/10", "CIDADE TIRADENTES"), new Onibus("3539/10", "TERMINAL CIDADE TIRADENTES"),

Vamos ver... performance!

Page 61: Usando melhor as Collections

LinkedList

ArrayList

TreeSet

HashSet

tempo

Page 62: Usando melhor as Collections

Então... performance!

Page 63: Usando melhor as Collections

public class PontoDeOnibus {

// atributos// construtor

public boolean passa(Onibus onibus) {

for (Onibus o : this.onibuses)if (o.getLinha().equals(onibus.getLinha()))

return true;return false;

} public void adicionaOnibus(Onibus onibus) {

if (!onibuses.contains(onibus)) {

Vamos ver...

Page 64: Usando melhor as Collections

public class PontoDeOnibus {

// atributos// construtor

public boolean passa(Onibus onibus) {

for (Onibus o : this.onibuses)if (o.getLinha().equals(onibus.getLinha()))

return true;return false;

} public void adicionaOnibus(Onibus onibus) {

if (!onibuses.contains(onibus)) {

Vamos ver... o adiciona!

Page 65: Usando melhor as Collections

public void adiciona (Onibus onibus) {

if (! onibuses.contains(onibus)) {onibuses.add(onibus);

}}

public void adiciona (Onibus onibus) {onibuses.add(onibus);

}

List

Set

Page 66: Usando melhor as Collections

public void adiciona (Onibus onibus) {

if (! onibuses.contains(onibus)) {onibuses.add(onibus);

}}

public void adiciona (Onibus onibus) {onibuses.add(onibus);

}

List

Set ...e é mais rápido para buscas!

Page 67: Usando melhor as Collections

Cool!

Page 68: Usando melhor as Collections

Cool!

Só vou usar Set, daqui pra frente!

Page 69: Usando melhor as Collections
Page 70: Usando melhor as Collections

Onibus tem...

Page 71: Usando melhor as Collections

public class Onibus {

private String nome;private String linha;

public Onibus(String nome, String linha) {

this.nome = nome;this.linha = linha;

} // getters

}

Page 72: Usando melhor as Collections

public class Onibus {

private String nome;private String linha;

public Onibus(String nome, String linha) {

this.nome = nome;this.linha = linha;

} // getters

}

Page 73: Usando melhor as Collections

public class Onibus {

private String nome;private String linha;private List<PontoDeOnibus> itinerario;

public Onibus(String nome, String linha,

List<PontoDeOnibus> itinerario) {this.nome = nome;this.linha = linha;this.itinerario = itinerario;

} // getters

}

Page 74: Usando melhor as Collections

Cool!

Page 75: Usando melhor as Collections
Page 76: Usando melhor as Collections

WAIT!

Page 77: Usando melhor as Collections

Quero a lista de ônibus

ordenada?

Page 78: Usando melhor as Collections

public class PontoDeOnibus {

private String nome;private Coordenada localizacao;private ArrayList<Onibus> onibuses;

public PontoDeOnibus(String nome, Coordenada localizacao) {

// ...this.onibuses = new ArrayList<Onibus>();

}// getters// adiciona e passaOnibus

}

Codar mais um pouquinho!

Page 79: Usando melhor as Collections

public class OrdenadoPorLinha

implements Comparator<Onibus>{@Overridepublic int compare(Onibus o1, Onibus o2) {

return o1.getLinha().compareTo(o2.getLinha());}

}

Comparator<Onibus>

Page 80: Usando melhor as Collections

...lections.sort(onibuses, new Comparator<Onibus>{

@Overridepublic int compare(Onibus o1, Onibus o2) {

return o1.getLinha().compareTo(o2.getLinha());}

});

Comparator<Onibus>

Classe anônima

Page 81: Usando melhor as Collections

Cool!

Page 82: Usando melhor as Collections

Cool!

Agora sim!

Page 83: Usando melhor as Collections
Page 84: Usando melhor as Collections

Entendendo melhor as

Collections

Cecilia [email protected]/ceci