cadena final

Observemos el siguiente código por qué sus valores son "ab" pero ¿por qué sus resultados no son los mismos?

		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”比较的是两个对象的值是否相同。

Al aprender String, todos sabemos que hay un final en String, lo que significa que las variables de tipo String no se pueden cambiar después de que se definen, pero algunas personas pueden preguntar.

		String a="a";
        a="b";
        System.out.println(a);//b

En este código, el valor de a ha cambiado de la "a" original a la "b". ¿No es esto un cambio? ¿Cómo se puede decir que no ha cambiado?
De hecho, en realidad no hay ningún valor de "a" en la memoria, pero al principio apuntó el puntero a un lugar donde se almacenaba la dirección de "a", y luego cambió el puntero a un lugar donde "b" fue almacenado Pero la pieza de memoria "a" no ha desaparecido, pero no hay una guía variable.

Entonces, la pregunta es, dado que ya existe una final en el código fuente de String, ¿qué significa agregar una final antes de String?
Agregar un final antes de String corrige sus pautas para que no apunte a otra dirección. Cuando se agrega final, este valor realmente existe en el conjunto de constantes. Cuando se llama a esta variable, el programa la tratará como una constante. Ahora bien, esto también significa que String ab4 = "a" + b es en realidad String ab4 = "a" + "b", que debe definirse primero en el conjunto constante es ab1, por lo que ab4 y ab5 son comunes cuando se definen Point a ab1, entonces ¿por qué los otros valores no apuntan a la dirección de ab1? Es porque cuando el programa Java se está ejecutando, para garantizar que se pueda compilar por completo, los valores que no se pueden analizar en variables que ya existen en el grupo de constantes se vuelven a abrir para ellos y se almacenan en ellos, porque la variable b tiene el prefijo Si se agrega fianl, se considera una constante cuando se llama, y ​​fianl no se agrega antes de la variable a, por lo que no se considera una constante cuando se llama.
Si no me crees, puedes imprimir sus direcciones y echar un vistazo, abajo está el código para imprimir las direcciones.

System.out.println(System.identityHashCode(ab1));

Supongo que te gusta

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