Wie Ihr Euch bestimmt denken könnt, verbrauchen Strings aufgrund ihrer Unveränderbarkeit jede Menge Speicherplatz.
Also hat sich die JVM (naja, eher deren Entwickler) etwas ausgedacht: Für jedes Objekt, welches neu angelegt werden soll, wird überprüft, ob ein gleiches Objekt schon existiert:
String a = “abc”;
String b = “abc”; // gleicher Inhalt, also zeigt b auf das selbe Objekt wie a
System.out.println(a==b); // true; da beide auf das selbe Objekt referenzieren
System.out.println(a.equals(b)); // true; da Werte ebenfalls gleich sind
Soll diese Überprüfung aber nicht stattfinden, muss ein neuer String mit new angelegt werden:
String c = new String(“abc”);
System.out.println(a==c); // false, da auf unterschiedliche Objekte referenziert wird
System.out.println(a.equals(c)); // true, da Werte gleich sind