Baixe o app para aproveitar ainda mais
Prévia do material em texto
POOS3 – Programação Orientada a Objetos edilson.ifsp@gmail.com Aula 3 – String, Coletor de Lixo, ArrayList, Vários Formulários 1. String Em Java, Strings são objetos e cada um dos caracteres da String possui tamanho de 16 bits. Assim como com os demais objetos, é possível criar uma instância da classe String utilizando-se a palavra chave new. Veja abaixo: String s = new String("ifsp"); Outra maneira é associar o conteúdo de forma direta: s = "ifsp"; É importante ressaltar que uma vez que um valor tenha sido associado a uma String, esse valor não poderá ser alterado. Ele é imutável. Apesar disso, a variável de referência para a String não é imutável. Vejas os Exemplos: a) b) c) Veja o trecho abaixo. Qual é a saída? String x = "Java"; x.concat(" Rules"); System.out.println("x = " + x); Saída: x = Java 1.1. Métodos da classe String Para testar se duas Strings são iguais, utilize o método equals. Dessa maneira, dadas as Strings s e t, a expressão s.equals(t); retorna “verdadeiro” se s e t forem iguais. Caso contrário, o retorno será “falso”. Atenção: Não utilize o operador “==” para testar se duas Strings são iguais. O operador “==” apenas determina se as Strings possuem a mesma referência na memória. Exemplo 1: String senhaValida = "ifsp"; String senhaFornecida = "ifsp"; if (senhaFornecida.equals(senhaValida)){ System.out.println("Senha Correta!"); } else { System.out.println("Senha Incorreta!"); } Ao executar o código acima, a frase impressa será “Senha Correta”. Veja a seguir outros métodos bastante úteis para a manipulação de Strings: Método Descrição charAt() Retorna o caractere do índice especificado concat() Concatena uma String no final da outra (+ também funciona) equalsIgnoreCase() Compara duas Strings ignorando a distinção entre maiúsculas e minúsculas length() Retorna o comprimento de uma String replace() Substitui ocorrências de um caractere pelo novo caractere substring() Retorna uma parte de uma String toLowerCase() Cria uma nova String com as letras em minúsculo toString() Retorna o valor de uma String (que representa o objeto em questão) toUpperCase() Cria uma nova String com as letras em maiúsculo trim() Remove os espaços em branco que aparecem no início ou fim da String Exemplos: String s = "ifsp"; String t = "IFSP"; String u = " 1 IFSP"; System.out.println(s.charAt(1)); //Saída: f System.out.println(s.concat(" 2014")); //Saída: ifsp 2014 if (s.equalsIgnoreCase(t)){ System.out.println("s e t são Iguais!"); } else { System.out.println("s e t NÃO são Iguais!"); } //Saída: s e t são Iguais! System.out.println(s.length()); //Saída: 4 System.out.println(s.replace("sp", "rs")); //Saída: ifrs System.out.println(s.substring(1)); //Saída: fsp //Observe que a substring começa no índice 1 e vai até o final da String //original System.out.println(s.substring(1, 3)); //Saída: fs //Observe que a substring começa no índice 1 e termina no índice 3 (sem //incluir o 3) System.out.println(t.toLowerCase()); //Saída: ifsp System.out.println(s.toUpperCase()); //Saída: IFSP System.out.println(u.trim()); //Saída: 1 IFSP Cuidado com “==” versus “equals()” if (new String("ifsp").equals("ifsp")){ // Verdadeiro if (new String("ifsp") == "ifsp"){ // Falso if (new String("ifsp") == new String("ifsp")){ // Falso 2. StringBuffer e StringBuilder As classes StringBuffer e StringBuilder devem ser utilizadas quando existe a necessidade de grandes modificações na string de caracteres. Ao contrário de Strings, objetos do tipo StringBuffer e StringBuilder podem ser modificados inúmeras vezes sem culminar em uma grande quantidade de objetos descartados. A classe StringBuilder foi adicionada no Java 5 e possui a mesma API da classe StringBuffer. A diferença entre as duas classes é que os métodos de StringBuilder não são sincronizados (veremos isso em detalhes quando falarmos de multithreading). Isso possibilita uma melhor performance de StringBuilder. Os métodos append e delete são exclusivos dessas classes: Veja: StringBuilder sb = new StringBuilder("abc"); sb.append("def"); System.out.println("sb = " + sb); A saída é: sb = abcdef StringBuilder sb = new StringBuilder("abc"); sb.delete(0,1); System.out.println("sb = " + sb); A saída é: sb = bc 3. Coletor de Lixo Java fornece uma solução automática para o gerenciamento de memória por meio do coletor de lixo (garbage collector). Isso significa que o programador não tem a necessidade de adicionar qualquer tipo de lógica de programação a um determinado aplicativo para realizar o gerenciamento da memória. Entretanto, não é possível determinar quando o coletor de lixo irá executar ou quando ele não irá executar. O coletor de lixo fica sob controle da JVM (Java Virtual Machine) e é ela que decide quando o coletor de lixo irá rodar. O objetivo do coletor de lixo é garantir que a heap tenha espaço livre disponível para que os objetos Java possam ser alocados. Apesar de ser possível solicitar à JVM que o coletor de lixo seja executado, não há garantias de que a JVM irá considerar a solicitação do programador. Note que o coletor de lixo não pode garantir que haverá memória disponível (afinal, ele tenta remover objetos da memória quando eles não são mais utilizados) para a execução de um determinado programa. Ele apenas garante que a memória disponível será gerenciada da melhor maneira possível. Assim, é possível utilizar alguns mecanismos para indicar que os objetos são elegíveis à ação do coletor de lixo. 1) Referência nula Quando não há mais referências a um objeto, ele se torna elegível para ser removido pelo coletor de lixo. Exemplo: public class Coletor { public static void main(String [] args) { String sb = new String("olá"); System.out.println(sb); // O objeto do tipo String não está elegível para ser removido da memória sb = null; // Agora, o objeto do tipo String está elegível } } 2) Referência Não Associada Ao associar a variável de referência de um determinado objeto com outro objeto, o primeiro objeto torna-se elegível para ser removido da memória. public class Coletor { public static void main(String [] args) { String s1 = new String("Olá"); String s2 = new String("Adeus"); System.out.println(s1); // A String "Olá" não está elegível para ser removido da memória s1 = s2; // Agora, a String "Olá" está elegível } } As variáveis locais dos métodos também ficam elegíveis após a execução do método. A exceção é o objeto que é retornado pelo método. 3) Referência Isolada Imagine uma classe na qual uma variável de instância é referência para outra instância da mesma classe. Considere a existência de duas instâncias dessa e que elas referenciam uma à outra. Se as referências a esses dois objetos forem removidas, não será possível acessá-los, mesmo que cada objeto ainda tenha uma referência válida. Quando o coletor de lixo executa, ele é capaz de identificar tal situação. public class Ilha { Ilha i; public static void main(String [] args) { Ilha i2 = new Ilha(); Ilha i3 = new Ilha(); Ilha i4 = new Ilha(); i2.i = i3; // i2 referencia i3 i3.i = i4; // i3 referencia i4 i4.i = i2; // i4 referenciai2 i2 = null; i3 = null; i4 = null; // i2, i3 e i4 possuem referências entre si, mas perderam os links para acesso a eles // i2, i3 e i4 estão elegíveis para serem removidos } } Finalmente, para solicitar que o coletor de lixo execute, utilize: System.gc(); 4. ArrayList ArrayList é uma classe da biblioteca Java cujo tamanho é dimensionado automaticamente quando elementos são inseridos ou removidos (ao contrário de um array, que possui tamanho pré- definido). A declaração de um ArrayList deve ser efetuada como a seguir: ArrayList<String> nomes = new ArrayList<>(); O tipo de parâmetro <String> especifica que o ArrayList é capaz de armazenar elementos do tipo String. ArrayList<Pessoa> clientes = new ArrayList<>(); O tipo de parâmetro <Pessoa> especifica que o ArrayList é capaz de armazenar elementos do tipo Pessoa (presume-se que a classe Pessoa seja declarada previamente). 4.1. Métodos Métodos ArrayList add(Object elemento) adiciona o elemento à lista remove(int indice) remove o objeto que está no índice informado remove(Object elemento) remove o objeto contains(Object elemento) retorna "true" se o objeto informado existe no ArrayList isEmpty() retorna "true" se a lista não contém objetos indexOf(Object elemento) retorna o índice do objeto ou -1 size() retorna o número de elementos que está na lista get(int indice) retorna o objeto que está no índice informado Exemplo: ArrayList<String> nomes = new ArrayList<>(); nomes.add("Edilson"); nomes.add("Andréia"); nomes.add("Maria"); nomes.add("João"); System.out.println(nomes); 5. Utilizando ArrayList Veja o exemplo “Poos3_Aula03_TestandoArrayList”. 6. Utilizando vários formulários Veja o exemplo “Poos3_Aula03_VariosFormularios”. 7. Utilizando Combobox Veja o exemplo “Poos3_Aula03_ComboBox”. 8. Exercícios 8.1. Escreva um programa que realiza o cadastro de vários alunos. Cada aluno possui nome, idade e sexo. O programa deve conter também uma funcionalidade que exibe o total de alunos cadastrados. 8.2. Escreva um programa que realize a venda de produtos. Após selecionar um cliente cadastrado e os itens (produtos) que ele gostaria de comprar, mostre o valor total da compra e liste os itens comprados pelo cliente. O programa deve permitir o cadastro de clientes, de produtos e das vendas. Os produtos devem ser listados em um comboBox. Desafio: Mantenha os produtos ordenados 8.3. Crie um formulário que permita o agendamento do serviço de lavagem de veículos. Após o preenchimento do nome do cliente, a opção de serviço deve ser definida (a lavagem simples custa R$ 35,00 e a completa R$ 60,00). Por fim, existe a possibilidade da aplicação de cera, cujo custo é de R$ 200,00. Uma vez que as informações tenham sido preenchidas, é possível efetuar o agendamento. Ao clicar no botão agendamento, o valor total do serviço deve ser calculado e o veículo incluído na fila de veículos que devem ser lavados. O programa também deve exibir a quantidade de veículos agendada e o valor total obtido com o serviço. 8.4. Escreva um programa que, a partir de três nomes, crie uma senha. Esse processo deve se basear nas seguintes regras: a) Primeira e Última letra do primeiro nome. b) Primeira Metade do segundo nome. Para nomes cuja soma dos caracteres seja ímpar, efetue o arredondamento para o próximo número par. Exemplo: 1 seria 2; 3 seria 4, etc. c) Caracteres ímpares do terceiro nome, transformados em letras maiúsculas. A senha deve ser a concatenação dos resultados dos itens a), b) e c). 8.5. Escreva um programa que simule o cadastro e atendimento de pessoas em um consultório médico. Devem ser oferecidas duas opções para o atendente: a primeira realiza o cadastro de uma pessoa, considerando-se o nome e a idade. A segunda opção possibilita que uma pessoa seja chamada para a consulta. Pessoas com mais do que 50 anos possuem prioridade, ou seja, devem ser atendidas antes. Entretanto, é preciso manter a ordem de chegada. Assim, um paciente que possui 51 anos deve ser atendido antes que um paciente de 60 anos, caso ele tenha chegado primeiro. Uma vez que todos os pacientes com prioridade sejam chamados, os demais pacientes podem ser chamados, mantendo-se a ordem de chegada. Dica: Estude os métodos get() e remove() de um ArrayList.
Compartilhar