Hola Kevin,
Te explico con un ejemplo:
public class Comparacion {
public static void main(String[] args) {
String s1 = "HolaMundo";
String s2 = "HolaMundo";
String s3 = new String("HolaMundo");
System.out.println(s1 == s2); // true
System.out.println(s1 == s3); // false
System.out.println(s1.equals(s3)); // true
}
}
s1 y s2:
El valor de ambas es "HolaMundo". En Java, las String literales se almacenan en un pool de cadenas dentro de la Heap, lo que significa que si dos cadenas tienen el mismo valor literal y se crean de la misma forma, apuntarán al mismo objeto en memoria. ( Para optimizar recursos )
Entonces, s1 == s2 es true porque ambos apuntan al mismo objeto.
s3:
Se crea explícitamente con new String("HolaMundo"), lo que fuerza a Java a crear un nuevo objeto en la Heap. Aunque s3 tiene el mismo contenido que s1, apunta a un objeto diferente en memoria.
Por lo tanto, s1 == s3 es false porque están en ubicaciones diferentes en la memoria.
Sin embargo, s1.equals(s3) es true porque compara el contenido de las cadenas, no sus referencias , es por esta razon que no es recomendable usar "==". En este ejemplo sencillo no pasa nada pero imaginate en cientos de lineas de codigo.
Espero haber ayudado. Si fue asi por favor marca como solucionado.