2
respostas

Comparação de objetos String

Por que este código retorna true? se estou comparando dois objetos em posições do heap diferentes?

class Teste{
    public static void main(String[] args){
        String a = "asd";
        String b = "asd";

        if(a == b){
            System.out.println("igual");
        } else {
            System.out.println("diferente");
        }
    }
}
2 respostas

David porque ela te retorna true? porque a variavel a e b tem o mesmo valor, e no seu if, você ta comparando se a é igual a b. Então é por isso que está te retornando true

Oi David,

Isto é uma particularidade avançada da JVM. O Java usa um conceito chamado String interning, que basicamente guarda numa pool da memória, de maneira única, todas as strings distintas do seu programa. Sempre que ele encontra uma string literal, como é o caso de a e b, ele sempre devolve essa mesma posição da memória.

Se você explicitamente instanciar duas strings, naturalmente esse comportamento não funciona mais, pois ele de fato irá alocar nova memória.

public class Teste {
    public static void main(String[] args){
        String a = new String("abc");
        String b = new String("abc");
        System.out.println(a == b); //false
    }
}

É possível você pedir que o Java guarde qualquer string nessa pool com o método .intern(), que verifica se a string já está lá e devolve a mesma referência sempre.