Dúvida com String

8 respostas
L

Eu aprendi que uma String deve ser sempre comparada utilizando o método equals e sempre foi assim… Se eu comparar duas strings, de mesmo conteúdo, com o operador == ele sempre dará falso. Essa semana um amigo me disse que se eu comprar 2 strings com == funcionaria e assim criei uma classe com void main criei duas strings e comparei e pra minha surpresa ele me retornou true. Já li no livro de certificação da kathy que se os objetos tem valores iguais por economia de memória o java faz as duas referências apontarem para o mesmo objeto mas pq isso n acontece quando programo para web?

Segue o código do programa

public class TesteString {

	public static void main(String[] args) {
		String teste = "diego";
		String teste1 = teste();
		
		if(teste == teste1){
			System.out.println("São iguais");
		}

	}
	
	public static String teste(){
		return "diego";
	}
	

}

8 Respostas

M

Como no seu exemplo vc está utilizando uma constante (“diego”), o resultado será true mesmo que você o execute na web , mas se voce utilizar um request.getParameter , estará recebendo objetos String diferentes, por isso o resultado de “==” vai retornar false.

L

Como assim uma constante? Não entendi.

Seria como se o método request.getParameter tivesse criado uma String pelo comando new?

M

Como a String “diego” está fixa no seu código, ela será colocada no pool de String apenas uma vez , independente de quantas vezes ela apareça no seu código, e como o “==” está avaliando se teste e teste1 estão referenciam o mesmo objeto String “diego”, o resultado é true.Agora imagine que vc tem uma página com dois campos input,chamados v1 e v2, e vc tem o seguinte código no servlet:

//...codigo servlet
    String teste   = request.getParameter("v1");
    String teste1 = request.getParameter("v2");

     System.out.println("igual -->" + (teste==teste1) )

As variáveis teste e teste1 referenciam objetos String diferentes,mesmo o seu conteudo sendo o mesmo, por isso o resultado será false.

L

HUMMMMMM

Entendi! Todas as Strings que eu atribuo o valor ele joga no pool de strings?

Ex. String a = “diego”

Mas caso eu colocasse:

String a = new String(“diego”);

Seriam diferentes pois dessa forma ele cria o objeto e não joga no pool, certo?

Quando eu faço um getParameter as strings não estão no pool, seria isso?

M

Exatamente, quando a jvm encontra uma String fixa no codigo,como por ele é esperta e primeiro verifica se essa string já exite no pool.

String a = "diego";
    String b = "diego";
    String c = "diego";
  //jvm esperta, cria um objeto String com o valor "diego" no pool

  String nome = new String("diego"); 
     ....

  //2 objetos String criados, a variável nome  e a constante "diego"
L

Muito obrigado marciomarc vc me ajudou muito…

Tenho q aprender esses princípios para conseguir a certificação.

Abraços

N

Para complementar…

Pesquise sobre comparações [color=“red”]dentro e fora[/color] do Heap na JVM .

:arrow: Vide exemplo: http://www.javafree.org/javabb/viewtopic.jbb?t=3932

:wink:

L

Obrigado Neves2EE,

Vou dar uma lida nesse conteúdo que você passou

Abraços

Criado 9 de novembro de 2007
Ultima resposta 12 de nov. de 2007
Respostas 8
Participantes 3