Substring

Yurek

Mitglied
Hi,

mal eine kurze frage. Die folgenden Zeilen funktionieren:

Code:
public static void main(String args[]) {
        
        String str = "hi opa";
      
        String two = "hi"; //str.substring(0,2);
        System.out.println(two);
      
        if(two == "hi") System.out.println("funktioniert!!!");

       }

    }

Aber ändere ich zu String two = str.substring(0,2); dann funktioniert es nicht obwohl two auch als hi ausgegeben wird. Ich weiß lösen mit equals aber mich würde mal interessieren wieso das ganze hier mit substring nicht funktioniert!
Danke schon mal!
 
Die JVM legt den String "hi" nur einmal an. Überall, wo "hi" verwendet wird, wird auf dieses eine Vorkommen verwiesen.
Dies ist möglich, da Strings immutable sind und keine Gefahr besteht, dass eine Änderung andere Vorkommen beeinflusst.
Das ist allerdings ein Implementierungsdetail und kann sich jederzeit ändern.
 
Strings vergleicht man nicht mit ==, sondern mit equals.
Im ersten Fall funktioniert ==, da direkt beim kompilieren auf den gleichen String verwiesen wird.
Wenn du durch substring einen neuen String mit "hi" erzeugst, wird allerdings eben ein neuer String angelegt und somit liefert == false, da eben die Referenz verglichen wird.
Nutze daher leiber folgendes: "hi".equals(two)
 
Wenn du noch weitere Details nachlesen willst, dann suche mal nach dem Stichwort Konstantenpool.
Außerdem sind solche Vergleiche gerne mal Fragen in Prüfungen (;
 
Andere Möglichkeit zu equals wäre also noch .intern();

Code:
public static void main(String args[]) {
      
        String str = "hi opa";
      
        String two = str.substring(0,2).intern();
        System.out.println(two);
    
        if(two == "hi") System.out.println("funktioniert!!!");

       }

Oder gleich kürzer:

Code:
public static void main(String args[]) {
       
        String str = "hi opa";
     
        if(str.substring(0,2).intern() == "hi") System.out.println("funktioniert!!!");

       }
 
geht schon, aber damit sollte man vorsichtig sein, denn falls du deine Strings immer mit == vergleichst und dann einmal vergisst .intern() aufzurufen, hast du direkt einen Fehler, welcher schwer zu finden ist.
Außerdem sollte man nicht für jeden String intern auf rufen, sondern lieber nur für Strings die oft benötigt werden.
 

Zurück
Oben