Programação Java Aula 04 Tópicos da aula • Declarar e instanciar arrays. • Popular e percorrer arrays. 2 Vetor (array) (1) • Declarando um vetor de inteiros: int[] idades = new int[10]; • O int[] é um tipo. Uma array é sempre um objeto, portanto, a variável idades é uma referência. • O que fizemos foi criar um array de inteiros de 10 posições e atribuir o endereço no qual ele foi criado. 3 Vetor (array) (2) • Podemos ainda acessar as posições do array. O código a seguir altera a sexta posição do array. No Java, os índices do array vão de 0 a n-1, onde n é o tamanho dado no momento em que você criou o array: idades[5] = 10; 4 Vetor (array) (3) • Se você tentar acessar uma posição fora desse alcance, um erro ocorrerá durante a execução. • No Java, muitas vezes utilizamos outros recursos em vez de arrays, em especial os pacotes de coleções do Java (API Collections), que veremos mais a frente no curso. 5 Vetor (array) (4) • Outro exemplo (a quantidade de posições do array definido por uma variável): int idades[] = new int[n]; • E assim podemos acessar e modificar os inteiros com índice de 0 a n-1. 6 Arrays de referências ("objetos") • É comum ouvirmos “array de objetos”. Porém quando criamos um array de alguma classe, ele possui referências. • O objeto, como sempre, está na memória principal e, no seu array, só ficam guardadas as referências (endereços). 7 Conta[] minhasContas = new Conta[10]; • Quantas contas foram criadas aqui? Nenhuma! • Foram criados 10 espaços que você pode utilizar para guardar uma referência a uma Conta. • Por enquanto, eles se referenciam para lugar nenhum (null). Se você tentar: System.out.println(minhasContas[0].saldo); – Um erro durante a execução ocorrerá! Pois, na primeira posição do array, não há uma referência para uma conta, nem para lugar nenhum. 8 • Você deve popular seu array antes: Conta contaNova = new Conta(); contaNova.saldo = 1000.0; minhasContas[0] = contaNova; • Ou, diretamente: minhasContas[1] = new Conta(); minhasContas[1].saldo = 3200.0; – Um array de tipos primitivos guarda valores. – Um array de objetos guarda referências. 9 10 11 Percorrendo um array (1) • Percorrer um array é muito simples quando fomos nós que o criamos: int[] idades = new int[10]; for (int i = 0; i < 10; i++) { idades[i] = i * 10; } for (int i = 0; i < 10; i++) { System.out.println(idades[i]); } 12 Percorrendo um array (2) • Porém, em muitos casos, recebemos um array como argumento em um método. • Até onde o for deve ir? Todo array em Java tem um atributo que se chama length, e você pode acessá-lo para saber o tamanho do array ao qual você está se referenciando naquele momento: 13 Percorrendo um array (3) void imprimeArray(int[] array) { for (int i = 0; i < array.length; i++) { System.out.println(array[i]); } } 14 15 Percorrendo um array no Java 5 (1) • O Java 5 traz uma nova sintaxe para percorremos arrays (e coleções, que veremos mais a frente no curso). – Versão 1.2 (Java 1.2) mais estável durante anos. – Nos últimos anos novas versões apenas revisaram algumas características e corrigiram bugs. – A partir da versão 1.5 (ou apenas Java 5, como ficou sendo chamada) ocorreram mudanças significativas. – Atualmente a versão disponível no mercado é a Java 8 (Update 5 de 15/04/2014). • História das versões de Java (JDK, Plataforma, JVM) disponível em: http://en.wikipedia.org/wiki/Java_version_history 16 Percorrendo um array no Java 5 (2) • Não precisamos mais do length para percorrer arrays cujo tamanho não conhecemos: void imprimeArray(int[] array) { for (int x : array) { System.out.println(x); } } • O mesmo é válido para arrays de referências. Esse for nada mais é que um truque de compilação para facilitar essa tarefa de percorrer arrays e torná-la mais legível. 17 Arrays não podem mudar de tamanho • A partir do momento que um array foi criado, ele não pode mudar de tamanho. • Se você precisar de mais espaço, será necessário criar um novo array e, antes de se referir ele, copiar os elementos do array velho. 18 Manipulação de array (exemplo) • E se eu quiser remover um elemento do array? private static int[] vetor; public static void main(String[] args) { vetor = new int[] {1, 2, 3, 4, 5}; imprimeArray(vetor); remove(4); remove(2); imprimeArray(vetor); } 19 public static void remove(int y) { int posicao = -1; for (int i = 0; i < vetor.length; i++) if (vetor[i] == y) posicao = i; if (posicao != -1) { int[] vetorAux = new int[vetor.length - 1]; for (int i = 0; i < vetorAux.length; i++) { if (i < posicao) vetorAux[i] = vetor[i]; else vetorAux[i] = vetor[i + 1]; } vetor = vetorAux; } } 20 Collections framework (1) • Não podemos redimensionar um array. • Não é possível buscar diretamente um determinado elemento cujo índice não se sabe. • Não se consegue saber quantas posições do array já foram populadas sem criar, para isso, métodos auxiliares. • Ou seja, arrays são trabalhosos. Uma alternativa é utilizar estrutura de dados. 21 Collections framework (2) • Vetor de inteiros: int idades[] = new int[n]; • ArrayList (coleção) de inteiros: ArrayList<Integer> idades = new ArrayList<Integer>(); • Para o uso do ArrayList é necessário: import java.util.ArrayList; 22 ArrayList (1) • add(Object elem) – Adicionará o parâmetro de objeto à lista. • remove(int index) – Removerá o objeto do parâmetro de índice. • remove(Object elem) – Removerá esse objeto (se ele estiver na ArrayList). • contains(Object elem) – Retornará true se houver uma coincidência com o parâmetro de objeto. 23 ArrayList (2) • isEmpty() – Retornará true se a lista não tiver elementos. • indexOf(Object elem) – Retornará o índice do parâmetro de objeto ou -1. • size() – Retornará a quantidade de elementos existentes na lista atualmente. • get(int index) – Retornará o objeto que se encontra atualmente no parâmetro de índice. 24 ArrayList (3) • Vetor de objetos: Conta[] contas = new Conta[n]; • ArrayList de (objetos) Conta: ArrayList<Conta> contas = new ArrayList<Conta>(); 25 ArrayList (4) ArrayList<Conta> contas = new ArrayList<Conta>(); Conta c1 = new Conta(); c1.saldo = 1000.0; contas.add(c1); Conta c2 = new Conta(); c2.saldo = 3200.0; contas.add(c2); 26