Vamos observar o código a seguir porque seus valores são "ab" mas porque seus resultados não são os mesmos?
String a="a";
final String b = "b";
String ab1 = "ab";
String ab2 = a + b;
String ab3 = a + "b";
String ab4 = "a" + b;
String ab5 = "a" + "b";
System.out.println(ab1 == ab2); //false
System.out.println(ab1 == ab3); //false
System.out.println(ab2 == ab3); //false
System.out.println(ab1 == ab4); //true
System.out.println(ab2 == ab4); //false
System.out.println(ab3 == ab4); //false
System.out.println(ab1 == ab5); //true
首先我们大家要知道“==”和“equals”是不同的。
“==”比较的是两个对象的地址是否相同,但“equals”比较的是两个对象的值是否相同。
Ao aprender String, todos sabemos que existe um final em String, o que significa que variáveis do tipo String não podem ser alteradas depois de definidas, mas algumas pessoas podem perguntar.
String a="a";
a="b";
System.out.println(a);//b
Neste código, o valor de a mudou do original "a" para "b". Isso não é uma mudança? Como se pode dizer que não mudou.
Na verdade, não há realmente nenhum valor de "a" na memória, mas no início, a apontava o ponteiro para um local onde o endereço de "a" estava armazenado e depois mudava o ponteiro para um local onde "b" foi armazenado, mas o pedaço "a" de memória não desapareceu, mas não há guia variável.
Então a questão é, já que já existe final no código fonte de String, o que significa adicionar um final antes de String?
Adicionar um final antes de String corrigir suas diretrizes para que não aponte para outro endereço. Quando final é adicionado, este valor realmente existe no pool de constantes, quando esta variável é chamada, o programa irá tratá-la como uma constante. Agora, isso também significa que String ab4 = "a" + b é na verdade String ab4 = "a" + "b", que deve ser definida primeiro no conjunto constante é ab1, então ab4 e ab5 são comuns quando são definidos Point para ab1, então por que os outros valores não apontam para o endereço de ab1? É porque quando o programa Java está em execução, para garantir que ele possa ser compilado completamente, os valores que não podem ser analisados em variáveis que já existem no pool de constantes são reabertos para eles e armazenados neles, porque a variável b é prefixada com Se fianl é adicionado, ele é considerado uma constante quando é chamado, e fianl não é adicionado antes da variável a, então não é considerado uma constante quando chamado.
Se você não acredita em mim, você pode imprimir os endereços deles e dar uma olhada. Abaixo está o código para imprimir os endereços.
System.out.println(System.identityHashCode(ab1));