ArrayList e Genéricos
Profs. PROG2 - UNISINOS
1
ArrayList
Implementação de Lista Sequencial pela API do Java
Vantagem:
Podem crescer (serem redimensionadas)
2
Arrays não podem
import java.util.ArrayList;
Veja http://java.sun.com/j2se/1.5.0/docs/api/java/util/ArrayList.html
ArrayList
Desvantagens:
1.
2.
Menos eficiente que array
Só trabalha com objetos (e não com tipos básicos)
Pode-se ter um ArrayList de Integer, mas não se pode ter
um ArrayList de int.
A partir da versão 1.5, isso não é mais um problema por causa
da conversão automática de classes Wrappers (Integer,
Double, Character, etc) para seus tipos primitivos (int, double,
char):
3
Unboxing e Outboxing
Conversão de Tipo Primitivo para seu
Wrapper
Conversão realizada entre os objetos numéricos (Integer, Float) e o
correspondente tipo primitivo de dado (integer, float).
Tipo primitivo de dado = tipo básico
A partir da versão Java 5.0 é automática (implícita)
Autoboxing:
Converte tipo básico para objeto numérico
Ex: de int para Integer
int i = 10;
Integer i2 = i;
Unboxing:
Converte objeto numérico para tipo básico
Ex: de Integer para int
Integer i2 = new Integer(0);
int i = i2;
4
Classe ArrayList
Define um ArrayList de Strings:
ArrayList<String> list = new ArrayList<String>();
Capacidade inicial default é 10.
Define um ArrayList de Aluno:
ArrayList<Aluno> empList
= new ArrayList<Aluno>( 20 );
5
Capacidade inicial é 20.
Classe ArrayList
Substituindo (ou setando) um elemento em uma
determinada posição:
list.set( 12, “Hi, Mom.” );
Retornando um elemento de uma posição:
6
System.out.println( list.get( 12 ) );
String s = list.get( 5 );
Classe ArrayList
Inserindo um elemento no final do ArrayList
7
list.add( “One” );
list.add( “Two” );
list.add( “Three” );
“One” está na posição 0, “Two” está na posição 1, e “Three”
está na posição 2.
ArrayList class
Inserindo um elemento em uma determinada posição
8
i deve ser uma posição usada ou a primeira posição livre
list.add( “One” );
list.add( “Two” );
list.add( “Three” );
list.add( 1, “Fred” );
“One” está na posição 0, “Fred” está na posição 1, “Two”
está na posição 2, e “Three” está na posição 3.
Classe ArrayList
Retornando tamanho da lista (quantidade de nós na lista):
Método size()
for (int i=0; i<list.size(); i++) {
System.out.println( list.get(i) );
}
9
Métodos da classe ArrayList
10
Métodos da classe ArrayList
public ArrayList<Base_Type>( int initialCapacity )
public ArrayList<Base_Type>()
11
Capacidade inicial default é 10
Ex: ArrayList<String> list = new ArrayList<String>();
Métodos da classe ArrayList
Métodos “Array-like”
public Base_Type set ( int index, Base_Type newElement )
Onde 0<=index<size() (ou exceção)
Ex: String s = list.set (0, “caderno”);
public Base_Type get ( int index )
12
Onde 0<=index<size() (ou exceção)
Ex: String s = list.get(0);
Métodos da classe ArrayList
Métodos para adicionar elementos
public boolean add ( Base_Type newElement )
13
Adiciona o novo elemento no final
size() cresce em 1
Capacidade aumenta se necessário
Ex: boolean b = list.add(“caneta”);
Métodos da classe ArrayList
Métodos para adicionar elementos
public void add ( int index, Base_Type newElement )
14
0<=index<=size()
Onde se index==size(), insere no final
size() cresce em 1
Capacidade aumenta se necessário
Quando 0<=index<size(), elemento na posição index é movido
para index+1, na index+1 é movido para index+2, …, na size()-1 é
movido para size()
Ex: list.add(0,“caneta”);
Métodos da classe ArrayList
Métodos para remover elementos
public Base_Type remove ( int index )
15
0<=index<size() (ou exceção)
Remove o elemento na posição index; copia para as posições à
esquerda os elementos restantes em index+1 … size()-1.
Ex: String s = list.remove(2);
Métodos da classe ArrayList
Methods to remove elements
public boolean remove( Object theElement )
Se encontrada, remove a primeira ocorrência de theElement; copia
para a esquerda os elementos restantes;
Se não encontrada, retorna false.
Ex: boolean b = list.remove(“caneta”);
public void clear ( )
Remove todos os elementos;
16
size() se torna size()-1;
Retorna true.
size() se torna 0
Ex: list.clear ();
Métodos da classe ArrayList
Métodos de Procura
public boolean contains ( Object target )
Chama o método equals() de target
True se ArrayList contém target; false caso contrário.
Ex: boolean b = list.contains(“caneta”);
public int indexOf ( Object target )
public int lastIndexOf ( Object target )
17
Chama o método equals() de target
Retorna índice (posição) da primeira ocorrência de target em
ArrayList; -1 caso contrário.
Ex: int pos = list.indexOf(“caneta”);
Realiza o mesmo que o anterior, com a diferença que é retornada a
posição da última ocorrência.
Ex: int pos = list.lastIndexOf(“caneta”);
Métodos da classe ArrayList
Gerenciamento da memória (tamanho & capacidade)
public boolean isEmpty ( )
public int size ( )
Aumenta a capacidade (se necessário)
Ex: list. ensureCapacity(20);
public void trimToSize ( )
18
Retorna número de elementos (nós) em ArrayList
Ex: int tam = list.size();
public void ensureCapacity ( int newCapacity )
True se vazio; false caso contrário.
Ex: boolean b = list.isEmpty();
Reduz a capacidade para tamanho atual
Ex: list. trimToSize();
Métodos da classe ArrayList
Para cópia
public Object[] toArray ( )
public Object clone ( )
19
Retorna um array contendo os elementos da lista.
Ex: Object[] v = list.toArray();
Retorna uma cópia de ArrayList.
Ex: Object v = list.clone();
Métodos da classe ArrayList
Igualdade
public boolean equals ( Object other )
20
Verdadeiro somente se ambos possuem o mesmo número de
elementos e os mesmos elementos (na mesma ordem).
Compara cada par de elementos chamando seu método equals()
Ex: boolean b = list.equals(list2);
for-each loop
for (Array_Base_Type var : Collection_Object)
Statement;
Se myList for ArrayList de Strings.
for (String element : myList)
System.out.println( element );
21
for-each loop
for-each também funciona com arrays:
// Retorna o soma dos elementos de a
int sum ( int[] a ) {
int result = 0;
for (int item : a)
result += item;
return result;
}
22
Biblioteca Java
Classes da biblioteca Java que implementam listas em Java:
java.util.Vector
java.util.ArrayList (desde versão 1.2)
Qual a diferença?
Vector é sincronizado, assim todos os métodos da classe Vector são thread-safe
(garante integridade dos dados quando mais de uma thread acessa).
Sincronização tem um custo na performance, assim quando não é necessário
sincronizar, melhor usar ArrayList
Maiores explicações em:
http://www.javaworld.com/javaworld/javaqa/2001-06/03-qa-0622vector.html
http://www.onjava.com/pub/a/onjava/2001/05/30/optimization.html
23