String final

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));

Acho que você gosta

Origin blog.csdn.net/MCYZSF/article/details/89890555
Recomendado
Clasificación