Comparacaode String

7 respostas
Fabio_Montefuscolo

Olá pessoal,

Eu quero uma string com o valor "Teste". Os dois modos mais básicos de atribuir este valor a uma String são:

String str = new String("Teste"); String str1 = new String("Teste");
ou

String str2 = "Teste"; String str3 = "Teste";

Eu achava que as duas formas deveriam ser iguais. Se fizermos

(str == str1) isso vai dar false, como era esperado. Entretando, se fizermos

(str2 == str3) vai dar true.

Então, qual é a diferença de fazer

String str = "Teste" e

String str = new String("Teste")?

Grato

7 Respostas

A

Isso acontece porque o compilador, para otimização, registra todas as string literais como constantes, e são únicas, ou seja, todas as Strings “Teste” da sua classe serão uma única constante. No primeiro caso, (new String(“Teste”)), você estará criando um novo objeto com esse conteúdo, enquanto que no segundo (= “Teste”), você estará apenas assinalando uma referência, sendo assim, será realmente o mesmo objeto. Deu para entender?

Abraço,

Armando

cassio

Pelo que entendi a JVM trata todas as strings como instâncias da classe java.lang.String. Logo, não há diferença entre declarar

String str1 = new String("Teste");

ou

String str3 = "Teste";

Ambas as maneiras geram objetos do tipo String. Entretanto, como vc criou um objeto str2 com o valor “Teste”, quando fez String str3 = “Teste” a JVM associou str3 ao endereço de memória da instância str2, já que as duas teriam EXATAMENTE O MESMO VALOR. Isso é uma economia de mmória, e também é perfeitamente seguro, já que a classe String é imutável por natureza.

eric_jf

para comparar vc deve usar o metodo equals

String teste = new Teste("Teste"); String teste2 = "Teste"; teste2.equals(teste);

Fabio_Montefuscolo

Olá

Vamos ver se entendi. As referências str2 e str3 estão apontando para um mesmo conteúdo. Certo? Se estiver certo, quando eu resolver alterar o conteúdo de str2, estaria alterando também o conteúdo de str3. Entretando, isto não acontece.
public class Teste {
	public static void main(String[] args) {
		String str2 = "Teste";
		String str3 = "Teste";
		
		System.out.println( str2== str3 ); // Da true
		System.out.println( str2 + " " + str3); // Teste Teste
		
		str2 = "Teste2";
		System.out.println( str2 == str3 ); // Dai sim false
		System.out.println( str2 + " " + str3); // Teste2 Teste
	}
}

Isso é meio estranho e chato de entender

A

Não, você está errado pelo seguinte: String é um objeto imutável. Portanto, quando você faz str2 = “Teste2”, está apontando a referência para outro objeto, e não alterando o conteúdo do objeto. Por isso, str1, que é outra referência, não é alterado.

Abraço,

Armando

Fabio_Montefuscolo

Muito obrigado pelas respostas. :wink:

Fabio_Montefuscolo

Olá denovo,

Para essa dúvida que postei algumas horas atrás, foi indicada um leitura neste link [url]http://javatechniques.com/public/java/docs/basics/string-equality.html[/url]

Espero que seja útil

Grato,
Fabio Montefuscolo

Criado 11 de dezembro de 2006
Ultima resposta 11 de dez. de 2006
Respostas 7
Participantes 4