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