Concatenación de literales de Java String

public static void main(String[] args){ one(); two(); three(); } public static void one() { String s1 = "hill5"; String s2 = "hill" + 5; System.out.println(s1==s2); } public static void two() { String s1 = "hill5"; int i =5; String s2 = "hill" + i; System.out.println(s1==s2); } public static void three() { String s1 = "hill5"; String s2 = "hill" + s1.length(); System.out.println(s1==s2); } 

La salida es

 true false false 

Los literales de cadena usan el proceso de internación, entonces ¿por qué two() y three() son falsos? Puedo entender en el caso de three() pero two() no está claro. Pero necesito una explicación adecuada para ambos casos.

¿Alguien puede explicar la razón?

En el caso de 2 y 3, el comstackdor no puede calcular el valor de String, ya que hill + i es un enunciado de tiempo de ejecución, lo mismo para s1.length()

lea aquí que le pregunté el mismo caso – enlace

Piensa así: String s1 and s2 usan constante de comstackción, s1="hill5" y s2="hill" + 5 , recuerda, la cadena asignada como literal es constante, su estado no se puede modificar, ya que las cadenas son inmutables .

Por lo tanto, en el momento de la comstackción, el comstackdor dice “oh sí, se calculan con el mismo valor, debo asignar la misma referencia a s1 y s2”.

Pero en el caso del método two() y three() , el comstackdor dice “no sé, puede ser valor de i se puede cambiar en cualquier momento, o s1.length() cambia en cualquier momento”, es una cosa de tiempo de ejecución, por lo que el comstackdor no Ponga s2 del método two() y three() en el grupo,

Por lo tanto, son falsos porque en tiempo de ejecución, se crea un objeto nuevo tan pronto se cambia correctamente.

La cadena con expresión constante de tiempo de comstackción se colocará en el grupo de cadenas. La condición principal es la expresión constante de tiempo de comstackción. Si hace que la variable local sea final en el método two() entonces two() también imprimirán true

 public static void two() { String s1 = "hill5"; final int i =5; String s2 = "hill" + i; System.out.println(s1==s2); } 

Salida:

 true