Como as strings devem ser comparadas no java

Quando vamos comparar textos no Java (Strings), é inevitável pensarmos que isso é feito da mesma forma que comparar números. E nessa hora você certamente fica em tentado em fazer algo desse tipo:

String s1 = "a"; String s2 = "a"; if (s1 == s2) { // faça algo } else { // faça outra coisa }

Só que, por mais estranho que possa parecer, isso não funciona. Ou melhor, não funciona às vezes, o que é ainda pior…

Bom, mas deixa eu te explicar o que está por trás de tudo isso…

Dá só uma olhada neste código:

String s1 = "abc"; String s2 = "abc"; System.out.println(s1 == s2);

Ao executar o código acima, o resultado é true (verdadeiro), como é de se esperar. Afinal de contas, estamos pensando na comparação do texto “abc” com o texto “abc”, e eles são iguais…

Agora olha só o que acontece se a gente fizer uma pequena modificação:

String s1 = "abc"; String s2 = new String("abc"); System.out.println(s1 == s2);

Ao executar, você vai perceber que o resultado agora é false (falso).

Isso mesmo: aos olhos do Java, as strings “abc” e “abc” são diferentes.

Isso realmente parece não fazer sentido, mas agora eu vou te mostrar por que o Java tira essa conclusão.

Conheça o Pool de Strings do Java!

Em algumas linguagens de programação, o tipo String faz parte do conjunto de tipos primitivos da linguagem.

Mas no Java String é uma classe, o que significa que os objetos de String que são criados seguem a mesma regra de armazenamento em memória das outras classes do Java. Eles são armazenadas no heap e as variáveis do tipo String referenciam essas áreas de memória no heap onde ficam os objetos (não vou aprofundar essa questão aqui pra não perder o foco, então fica pra outro post).

Mas isso tem um efeito colateral

Como strings são MUITO usadas em qualquer tipo de aplicação, isso pode causar um DESPERDÍCIO ABSURDO de memória.

Imagine se o seu sistema usa a string “A” em 20 partes do código. Será que é preciso existir 20 objetos de String na memória pra guardar a mesma informação? Pois é, totalmente desnecessário…

Pensando nisso, os projetistas do Java tomaram uma decisão: criaram um mecanismo de compartilhamento de strings, que eles chamaram de pool de strings.

O pool é uma área de memória que armazena strings únicas. Quando você faz algo como isso aqui…

String s1 = "a"; String s2 = "a"; String s3 = "b"; String s4 = "b"; String s5 = "c";

… são criadas 3 strings no pool: “a”, “b” e “c”. E cada variável (s1, s2, s3, etc.) referencia um desses objetos que estão no pool.

Graficamente, seria algo como o desenho abaixo:

Como as strings devem ser comparadas no java

(Aliás, o fato de objetos String no pool serem compartilhados é o motivo pelo qual strings em Java são imutáveis. Mas isso é uma discussão pra outro momento…)

Quando o operador de igualdade funciona

O operador de igualdade do Java (==) compara o conteúdo de duas variáveis.

Quando usamos tipos primitivos (int, double, boolean, etc.) ele se comporta sempre como o esperado, pois nos tipos primitivos o que está dentro da variável é realmente o valor dela.

Mas no caso de classes (como a String), o conteúdo da variável é uma referência pra um objeto na memória (que está no heap).

Portanto, a conclusão que chegamos é que, no caso de strings, o operador de igualdade não compara o conteúdo das strings, mas sim as referências de memória (que é o que está efetivamente sendo armazenado pelas variáveis).

Ok, ok… Confesso que isso tudo pode ser meio confuso até você se acostumar, então vou dar um exemplo.

Vamos relembrar o primeiro código que eu te mostrei no post:

String s1 = "a"; String s2 = "a";

Quando você faz isso, o que está acontecendo na memória é  isso aqui:

Como as strings devem ser comparadas no java

Note que temos 1 único objeto String na memória (com o valor “a”) e 2 variáveis que referenciam o mesmo objeto.

Portanto, quando testamos s1 == s2, o resultado é true. Não porque os textos são iguais, por porque ambas as variáveis (s1 e s2) referenciam o mesmo objeto.

De novo: lembre que o == compara o conteúdo das variáveis, e o conteúdo aqui são referências pra objetos que estão no pool.

Quando o operador de igualdade NÃO funciona

Como eu já te mostrei antes, o == pode não se comportar como você espera. É o caso deste código aqui:

String s1 = "a"; String s2 = new String("a");

Quando esse código é executado, é assim que as coisas ficam na memória:

Como as strings devem ser comparadas no java

Note que s1 referencia a string “a” que está no pool; mas s2 referencia outro objeto String, com o conteúdo “a”, mas que está fora do pool.

Isto acontece porque a criação do objeto String, através do operador new(), faz com que seja criado um novo objeto em uma área de memória fora do pool.

Olhando o desenho, dá pra ver claramente que os conteúdos de s1 e s2 são diferentes (cada variável referencia um objeto diferente). Portanto a comparação s1 == s2 vai retornar, neste caso, false.

Afinal: Como Comparar Strings no Java?

Todo esse problema acontece pelo fato do == do Java comparar referências de memória ao invés de comparar o texto armazenado no objeto String.

Então a grande pergunta é: será que existe uma forma de comparar o texto da String, ao invés de comparar referências de memória?

E a resposta é SIM, EXISTE!

A partir de agora, TODAS as vezes que você precisar comparar strings no Java você vai usar o método equals().

O método equals() é definido na classe Object do Java. Como todas as classes do Java herdam diretamente ou indiretamente e de Object, significa que todas as classes do Java têm este método.

Na classe String, este método foi implementado de forma a comparar o texto, portanto ele resolve o nosso problema! Veja:

String s1 = "a"; String s2 = "a"; System.out.println(s1.equals(s2));

O resultado do código acima é true!

Agora olhe o código abaixo:

String s1 = "a"; String s2 = new String("a"); System.out.println(s1.equals(s2));

A resposta aqui também é true!

O fato do equals() comparar os textos (a comparação é feita de “a” com “a”), faz com que o resultado seja verdadeiro sempre, independentemente de como estão os objetos na memória.

“Mas Carlos, se eu não usar o new String() não vou ter problemas e posso usar == pra comparar strings. Estou certo?”

Não: você está ERRADO!

Mesmo que você não use o new String(), em muitos casos você não sabe como a String foi criada.

É muito comum chamarmos métodos de outras bibliotecas/frameworks/APIs ou até códigos que foram criados por outros desenvolvedores.

Então não pense duas vezes: use o equals() em todas as situações! 🙂

A aí, gostou desta sacada?

Eu dei uma Masterclass gratuita e super inspiradora, que foi recorde de audiência na Softblue com um convidado especial, revelando o passo a passo sobre como entrar no mercado de Java sem ter experiência e sem ter diploma.

Recomendo fortemente que você assista neste link. Depois me conte o que você achou! 😀

Fique por dentro

A classe String � utilizada por toda a API do Java e por diversas vezes precisaremos dela em nossos c�digos. Isso faz com que o dom�nio dessa classe seja fundamental para todo aquele que deseja se tornar um programador Java. Aqui neste artigo falaremos sobre as principais caracter�sticas dessa classe com exemplos de c�digo e coment�rios.

Uma String armazena uma sequ�ncia de caracteres. Apesar de ser f�cil de utilizar, essa classe possui diversas caracter�sticas que podem n�o ser �bvias para quem est� tendo o seu primeiro contato com ela.

Por exemplo, um objeto String � imut�vel, o que significa que o texto que ele carrega nunca � alterado. Sempre que um texto precisa ser modificado � utilizado mais espaço em mem�ria para que uma nova String seja criada contendo a nova vers�o dele. Essas caracter�sticas ser�o o assunto que abordaremos primeiro.

Como criar uma String

Para o compilador, qualquer texto entre aspas duplas � uma String. Por esse motivo a criaç�o de um objeto desse tipo n�o requer a utilizaç�o do operador new. Assim, uma String � criada de forma semelhante a um tipo primitivo, utilizando-se a sintaxe [tipo] [nome] = [valor], apesar de se tratar de um tipo por refer�ncia - um nome para um objeto em mem�ria.

O C�digo 1 apresenta a forma correta de se criar uma inst�ncia da classe String.

String texto = "Qualquer texto entre aspas � uma String";

C�digo 1. Criaç�o de uma inst�ncia da classe String

Tamb�m n�o utilizamos o operador new porque ao faz�-lo forçamos a criaç�o de uma nova String, anulando um recurso de otimizaç�o da linguagem que evita que o mesmo texto exista mais de uma vez na mem�ria.

Por exemplo, no C�digo 2 criamos uma String utilizando o operador new, o que faz com que mais recursos sejam utilizados do que o necess�rio.

String texto = new String("Qualquer texto entre aspas � uma String");

C�digo 2. Declaraç�o de uma string utilizando o operador new

Toda a vez que o c�digo acima for executado uma nova String ser� criada contendo o texto "Qualquer texto entre aspas � uma String". Caso o C�digo 2 esteja dentro de um loop for repetido por mil vezes, mil objetos ser�o criados. Contudo, se o C�digo 1 estiver dentro de um loop for repetido por mil vezes, apenas um objeto ser� criado na primeira repetiç�o e reutilizado em todas as demais. Lembre-se, para o Java qualquer texto entre aspas duplas � uma inst�ncia da classe String. A prova disso � que podemos escrever um texto entre aspas e invocar a partir dele um m�todo qualquer da classe String, como demonstra o C�digo 3.

"Qualquer texto entre aspas � uma String".length();

C�digo 3. Invocando um m�todo qualquer da classe String

Note acima que o texto n�o foi atribu�do a nenhuma vari�vel, mas ainda assim � um objeto plenamente funcional para o compilador, a partir do qual podemos invocar quaisquer m�todos da classe String.

O valor especial null

� poss�vel declarar uma vari�vel como sendo do tipo String sem inicializ�-la com um valor, como mostra o C�digo 4.

String texto;

C�digo 4. Declaraç�o de uma string sem inicializaç�o

Nesse caso, se a vari�vel texto for declarada dentro de uma classe, como membro, o valor padr�o null ser� atribu�do a ela, como vemos no C�digo 5.

class Pessoa { String nome; } class PessoaTeste { public static void main(String[] args) { Pessoa p = new Pessoa(); System.out.println(p.nome); } }

C�digo 5. String iniciada com o valor padr�o null

Quando a inst�ncia da classe Pessoa � criada na Linha 8, o valor padr�o null � atribu�do a vari�vel nome e por esse motivo o m�todo println exibir� o texto null no console, ao ser invocado na Linha 9.

Caso a vari�vel seja declarada dentro de um m�todo, como vari�vel local, um erro de compilaç�o acontecer� se desejarmos utiliz�-la, porque nenhuma vari�vel local pode ser utilizada sem ter sido iniciada. Isso tamb�m vale para par�metros de m�todos. O C�digo 6 demonstra esse comportamento.

class PessoaTeste { public static void main(String[] args) { String nome; System.out.println(nome); } }

C�digo 6. Erro ao utilizar uma vari�vel local sem inici�-la

Quando a vari�vel nome for utilizada na Linha 5 ocorrer� um erro de compilaç�o informando que a vari�vel nome foi apenas declarada, mas n�o foi iniciada com nenhum valor.

Testando igualdade entre Strings

A comparaç�o entre Strings utilizando o operador de igualdade (==) retornar� true se as duas refer�ncias apontarem para o mesmo objeto na mem�ria.

Por exemplo, no C�digo 7 o texto "Nome e apelido s�o iguais" ser� impresso apenas porque nome e apelido apontam para o mesmo objeto criado quando o compilador encontra o texto "Arthur".

String nome = "Arthur"; String apelido = nome; if(nome == apelido) { System.out.println("Nome e apelido s�o iguais"); }

C�digo 7. Exemplo de atribuiç�o de refer�ncias

O mesmo acontece no C�digo 8, no qual temos duas vezes a ocorr�ncia do literal "Arthur", os quais a JVM tratar� como sendo o mesmo objeto. Uma vez que nome e apelido apontam para o mesmo objeto, a express�o l�gica nome == apelido ser� avaliada como true.

String nome = "Arthur"; String apelido = "Arthur"; if (nome == apelido) { System.out.println("Nome e apelido s�o iguais"); }

C�digo 8. Exemplo de atribuiç�o de refer�ncias

Contudo, no caso abaixo o texto "Nome e apelido s�o iguais" n�o ser� impresso, visto que nome e apelido apontam para objetos diferentes, sendo o primeiro criado com o comando new String("Arthur") e o segundo com o literal "Arthur". Lembre-se, o operador new força a criaç�o de um novo objeto.

String nome = new String("Arthur"); String apelido = "Arthur"; if (nome == apelido) { System.out.println("Nome e apelido s�o iguais"); }

C�digo 9. Exemplo de atribuiç�o de refer�ncias

Nesse caso, se invert�ssemos as linhas 1 e 2 o efeito seria o mesmo, porque new sempre força a criaç�o de um novo objeto.

Na maior parte das vezes em que estivermos comparando dois textos estaremos interessados em saber se seus caracteres s�o iguais e n�o se est�o armazenados no mesmo espaço em mem�ria. Nesse caso devemos utilizar algum m�todo de comparaç�o da classe String e ela possui v�rios. O primeiro que veremos aqui se chama equals.

Equals

Equals � um m�todo da classe Object utilizado para testar a relaç�o de igualdade entre dois objetos. Esse m�todo est� presente em todas as classes, porque todas elas derivam de Object. A forma como essa comparaç�o ser� feita pode ser determinada por quem est� escrevendo a classe e no caso de String, seu autor preparou o m�todo equals (C�digo 10) para verificar se duas Strings cont�m exatamente os mesmos caracteres.

String nome1 = "Carlos"; String nome2 = "Carla"; if (nome1.equals(nome2)) { System.out.println("Os nomes s�o iguais!"); } else { System.out.println("Os nomes s�o diferentes!"); }

C�digo 10. Exemplo de comparaç�o com m�todo equals

Nesse caso a mensagem "Os nomes s�o diferentes!" ser� impressa, uma vez que nome1 cont�m uma sequencia de caracteres diferente de nome2.

equalsIgnoreCase

Esse m�todo ignora a distinç�o entre letras mai�sculas e min�sculas nas duas strings comparadas.

String nome1 = "Carlos"; String nome2 = "carlos"; if(nome1.equalsIgnoreCase(nome2)) { System.out.println("Os nomes s�o iguais!"); }

C�digo 12. Exemplo do m�todo equalsIgnoreCase

Nesse novo exemplo os nomes s�o iguais, ent�o o m�todo equalsIgnoreCase retornar� true.

compareTo

Esse m�todo pode retornar 0 se as strings forem iguais, um n�mero negativo se a string que invoca o compareTo for menor que a string que � passada como um argumento e um n�mero positivo se a string que invoca o compareTo for maior que a string que � passada como argumento.

String nome1 = "Carlos"; String nome2 = "Carla"; System.out.println("nome2.compareTo(nome1) = "+nome2.compareTo(nome1)); System.out.println("nome1.compareTo(nome2) = "+nome1.compareTo(nome2));

C�digo 11. Exemplo do m�todo compareTo

Neste caso, compareTo vai nos dar um n�mero negativo no primeiro caso, porque Carla � menor que Carlos, e um n�mero positivo no segundo caso porque Carlos � maior que Carla.

compareToIgnoreCase

� uma funç�o que compara textos lexigraficamente, ignorando se as letras s�o mai�sculas ou min�sculas. No exemplo abaixo fazemos duas comparaç�es, uma utilizando compareTo e a outra usando compareToIgnoreCase para analisarmos as diferenças.

String texto = "A API de Strings � uma das mais utilizadas na linguagem Java"; String linguagem = texto.substring(texto.indexOf("Java"), texto.length()); if (linguagem.compareToIgnoreCase("java") == 0) { System.out.println("compareToIgnoreCase: Encontrei a linguagem! Ela � " + linguagem); } if(linguagem.compareTo("java") == 0) { System.out.println("compareTo: Encontrei a linguagem! Ela � " + linguagem); }

C�digo 12. Exemplo do m�todo equalsIgnoreCase

Ap�s a execuç�o desse c�digo apenas a mensagem "compareToIgnoreCase: Encontrei a linguagem! Ela � Java" ser� impressa, uma vez que para compareTo os textos "JAVA" e "java" s�o diferentes.

Principais m�todos da classe String

A partir daqui listaremos os principais m�todos da classe String com exemplos comentados. Existem muitos m�todos nesta classe e aqui falaremos sobre os mais utilizados. Para uma lista completa deles recomendo a documentaç�o da classe String no site oficial da documentaç�o do Java.

Documentaç�o oficial da classe String: Class String

concat

Existem duas formas de unir duas ou mais sequ�ncias de caracteres. A mais comum dentre elas � utilizando o operador de adiç�o, como demonstra o C�digo 13.

String nomeCompleto = nome + sobrenome;

C�digo 13. Exemplo concatenaç�o de Strings

Uma outra forma de fazer isso � utilizando o m�todo concat. Isso � menos comum, mas ainda � poss�vel. O C�digo 14 ficaria dessa forma utilizando esse m�todo:

String nomeCompleto = nome.concat(sobrenome);

C�digo 14. Exemplo de concatenaç�o de Strings

Note que se o valor de nome for Carlos e sobrenome for Henrique, o resultado do c�digo acima ser� CarlosHenrique, porque n�o h� espaço entre os dois textos.

String.valueOf

valueOf � um m�todo est�tico da classe String, que n�o precisa de uma inst�ncia para ser invocado. Ele converte um tipo primitivo em um objeto do tipo String. O C�digo 15 demonstra como utilizar esse m�todo.

public class Testa_Metodo_valueOf { public static void main(String[] args) { double numero = 102939939.939; boolean booleano = true; System.out.println("Retorna Valor : " + String.valueOf(numero)); System.out.println("Retorna Valor: " + String.valueOf(booleano));

C�digo 15. Exemplo do m�todo valueOf

Length

Retorna o comprimento do texto em uma String. No C�digo 16 � impresso o comprimento do texto.

String nomeCurso = "Java"; System.out.printf("\nTamanho da vari�vel nomeCurso: %d", nomeCurso.length());

C�digo 16. Exemplo do m�todo length

charAt

Retorna o caractere em uma localizaç�o espec�fica em uma String. Esse m�todo possui um par�metro do tipo inteiro que � usado como �ndice, retornando a partir dessa posiç�o inserida nesse par�metro. � importante lembrar que o �ndice sempre começa a ser contado do n�mero 0 (zero) em diante. Sendo assim a posiç�o do caractere a em Carlos � 1 e n�o 2, como se poderia deduzir.

Nesse novo exemplo, no C�digo 17, a mensagem "O caractere A est� na posiç�o 1" ser� impressa, uma vez que o caractere A est� na posiç�o 1 da cadeia de caracteres.

String nomeCurso = "JAVA"; if(nomeCurso.charAt(1) == �A�) { System.out.println(�O caractere A est� na posiç�o 1�); }

C�digo 17. Exemplo do m�todo charAt

getChars

Recupera um conjunto de caracteres de uma String. Esse m�todo possui os seguintes par�metros de entrada:

  • srcBegin

    � �ndice do primeiro caractere da string a ser copiada.
  • srcEnd

    - �ndice depois da �ltima string a ser copiada.
  • dst

    � O destino do array.
  • dstBegin

    � o in�cio do deslocamento no array de destino.

String nomeCurso = "Curso Java Web"; //� A DIFERENÇA DO 1� E 2� PAR�METRO DO M�TODO getChars //SE DIMINUIR OS 2 O RESULTADO TEM QUE SER O MESMO INICIADO NO ARRAY char[] numIndice = new char[7]; nomeCurso.getChars(2, 9, numIndice, 0); System.out.print("Valores Copiados \n"); for(char caracter : numIndice) { System.out.print("["+caracter+"]"); } System.out.println("\n\n Abaixo �ndice demonstrativo dos valores copiados\n"); int[] b = {0,1,2,3,4,5,6}; for(int i = 0; i < b.length; i++) { System.out.print("["+b[i]+"]"); }

C�digo 18. Exemplo do m�todo getChars

startsWith e endsWith

Os m�todos startsWith e endsWith aceitam uma string e um n�mero inteiro como argumentos, retornando um valor booleano que indica se a string inicia ou termina, respectivamente, com o texto informado a partir da posiç�o dada.

String[] nomes = {"iniciado", "iniciando", "finalizado", "finalizando"}; for (String recebeNomes : nomes) { if (recebeNomes.startsWith("in")) System.out.printf("\"%s\" inicia com \"in\" \n", recebeNomes); } System.out.println(); for (String recebeNomes : nomes) { if (recebeNomes.startsWith("ici", 2)) System.out.printf("\"%s\" inicia com \"ici\" na posiç�o 2 \n", recebeNomes); } System.out.println(); for (String recebeNomes : nomes) { if (recebeNomes.endsWith("ado")) System.out.printf("\"%s\" termina com \"ado\" \n", recebeNomes); }

C�digo 19. Exemplo dos m�todos startsWith e endsWith

indexOf e lastIndexOf

Permitem a localizaç�o de caracteres e substrings especificados em strings.

indexOf

Localiza a primeira ocorr�ncia de um caractere em uma string. Se o m�todo localizar o caractere, � retornado o �ndice do caractere na String, caso contr�rio retorna -1. Existem duas vers�es do indexOf que procuram caracteres em uma String.

  • 1� vers�o � aceita um inteiro que � conhecido como o n�mero do �ndice na String.
  • 2� vers�o � aceita dois argumentos inteiros � o caractere e o �ndice inicial em que a pesquisa da String deve iniciar.

lastIndexOf

Localiza a �ltima ocorr�ncia de um caractere em uma string. O m�todo procura do fim da string em direç�o ao começo, se encontrar o caractere � retornado o seu �ndice na string, caso contr�rio retorna -1. Existem duas vers�es do lastIndexOf que pesquisam por caracteres em uma string.

  • 1� vers�o � utiliza um inteiro do caractere.
  • 2� vers�o � aceita 2 argumentos � um inteiro de caractere e o �ndice a partir do qual iniciar a pesquisa de tr�s para frente.

String letras = "abcadefghijklmcopqrsdeftuvz"; //TESTA indexOf PARA LOCALIZAR UM CARACTERE EM UM STRING System.out.printf("�ltimo 'c' est� localizado no index %d\n", letras.indexOf('c')); System.out.printf("�ltimo 'a' est� localizado no index %d \n", letras.indexOf('a', 1)); //-1 N�O EXISTE System.out.printf("'$' est� localizado no index %d\n\n", letras.indexOf('$')); //TESTA lastIndexOf PARA LOCALIZAR UM CARACTERE EM UMA STRING System.out.printf("�ltimo 'c' est� localizado no index %d\n", letras.lastIndexOf('c')); System.out.printf("�ltimo 'a' est� localizado no index %d\n", letras.lastIndexOf('a', 5)); System.out.printf("�ltimo '$' est� localizado no index %d\n", letras.lastIndexOf('$')); //TESTA indexOf PARA LOCALIZAR UMA SUBSTRING EM UMA STRING System.out.printf("\"def\" est� localizado no index %d\n", letras.indexOf("def")); //2 argumento string e outro o ponto inicial que começar� a pesquisa System.out.printf("\"def\" est� localizado no index %d\n", letras.indexOf("def", 7)); System.out.printf("\"hello\" est� localizado no index %d\n\n", letras.indexOf("hello"));

C�digo 20. Exemplo dos m�todos indexOf e lastIndexOf

substring

Permite extrair substrings de strings e fornece 2 m�todos substring para permitir que um novo objeto seja criado copiando parte de um objeto string existente. Cada m�todo retorna um novo objeto desse tipo. Existem duas vers�es desse m�todo que s�o:

  • 1� vers�o � recebe um argumento do tipo inteiro, que especifica a partir de que caractere a c�pia deve começar. A substring retornada cont�m uma c�pia dos caracteres desde esse �ndice at� o �ltimo caractere na string.
  • 2� vers�o - recebe dois argumentos do tipo inteiro. A String retornada ser� composta pelo o primeiro argumento e se estende at� o caractere anterior ao segundo argumento. Portanto, o comprimento da String � "argumento_2 - argumento_1". Em outras palavras, voc� pode dizer que o primeiro argumento � inclusivo e o segundo argumento � exclusivo

String nome = "Jos� Silveira"; System.out.println("String : " + nome); String substring = nome.substring(5); System.out.println("String depois da 3� index: " + "["+substring+"]"); substring = nome.substring(1, 6); System.out.println("Substring (1,6): " + "["+substring+"]");

C�digo 21. Exemplo do m�todo substring

replace

Retorna um novo objeto contendo a string original com um trecho especificado substitu�do por outra express�o indicada. Esse m�todo deixa a string original inalterada. A vers�o sobrecarregada do m�todo replace permite substituir substrings em vez de caracteres individuais.

String nome = "mesquita"; String nomeAlterado = nome.replace('e', 'o'); System.out.println(nomeAlterado);

C�digo 22. Exemplo do m�todo replace

toUpperCase

Retorna uma nova string com o conte�do da original convertido para letras mai�sculas, mantendo a original inalterada.

toLowerCase

De forma semelhante ao anterior, o toLowerCase retorna uma c�pia de uma string com todas as letras convertidas para min�sculo, mantendo a original inalterada.

String nomeA = "joaquina"; String nomeB = "Paulo"; System.out.println(nomeA.toUpperCase()); System.out.println(nomeB.toLowerCase());

C�digo 23. Exemplo dos m�todos toLowerCase e toUpperCase

trim

Gera um novo objeto string, removendo todos os caracteres de espaço em branco que aparecem no in�cio ou no fim da string em que o m�todo opera. O m�todo retorna um novo objeto string contendo a string sem espaço em branco inicial ou final. A string original permanece inalterada.

toCharArray

Cria um novo array de caracteres que cont�m uma c�pia dos caracteres da vari�vel apontada.

String s1 = "ol�"; String s2 = "TCHAU"; String s3 = " espaços "; System.out.println("s1 = "+ s1 + "\n" + "s2 = "+ s2 + "\n" + "s3 = "+s3); //M�TODO REPLACE System.out.printf("Replace 'l' por 'L' no s1: %s\n\n", s1.replace('l', 'L')); //M�TODO UPPER E LOWERCASE System.out.printf("s1.toUpperCase() = %s\n", s1.toUpperCase()); System.out.printf("s2.toUpperCase() = %s\n\n", s2.toLowerCase()); //M�TODO TRIM - REMOVE OS ESPAÇOS System.out.printf("s3 depois do trim = \"%s\"\n\n", s3.trim()); //CONVERTEU O ol� PARA CHAR char[] charArray = s1.toCharArray(); System.out.printf("s1 como um caracter array = "); for(char caracter : charArray) { System.out.print(caracter); }

C�digo 24. Exemplo dos m�todos trim e toCharArray