[Java] Verhalten von == und equals()

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von bur, 18. Dezember 2011 .

Schlagworte:
  1. 18. Dezember 2011
    Verhalten von == und equals()

    edit: Ach, wie immer zwei Minuten nach Erstellen des Posts habe ich selber die Antwort... obst und variable referenzieren tatsächlich beide das gleiche String-Objekt. Das erkennt man schön, wenn man variable alternativ mit String variable = new String("Apfel") erzeugt.


    equals() testet ja ob ein Objekt den gleichen Inhalt hat wie ein anderes und == ob zwei Referenzen aufs gleiche Objekt zeigen.

    Ich bin mir nicht 100% sicher ob ich das Ergebnis des folgenden Codes richtig verstehe:

    PHP:
    public class  equalsTest
    {
       public static 
    void main ( String []  args )
       {
          
    String obst  "Apfel" ;
          
    System . out . println "Bitte Apfel eingeben:"  );
          
    String input  = new  java . util . Scanner System . in  ). nextLine ();
          
    String variable  "Apfel" ;

          if ( 
    input . equals obst  ) )
                
    System . out . println "input u. equal ist OK"  );
          else 
    System . out . println "input u. equal ist NICHT OK"  );
          if ( 
    input  ==  obst  )
                
    System . out . println "input u. == ist OK"  );
          else 
    System . out . println "input u. == ist NICHT OK"  );

          if ( 
    variable . equals obst  ) )
                
    System . out . println "variable u. equal ist OK"  );
          else 
    System . out . println "variable u. equal ist NICHT OK"  );
          if ( 
    variable  ==  obst  )
                
    System . out . println "variable u. == ist OK"  );
          else 
    System . out . println "variable u. == ist NICHT OK"  );


       
    }
    }
    Abhängig davon ob ich den String "Apfel" von der Tastatur einlese oder ihn direkt im Programm belege unterscheidet sich das Ergebnis der Auswertung.

    Meine Vermutung ist dass Java nur ein einziges String-Objekt "Apfel" anlegt und obst und variable beide darauf verweisen. Dann liefert verständlicherweise equals() und == jeweils TRUE.

    Da sich bei input allerdings erst zur Laufzeit herausstellt dass es den gleichen Inhalt hat wie obst und variable wird dafür ein neues Objekt angelegt. Und das ist dann zwar equal(), aber nicht ==. Stimmt das?
     
  2. 18. Dezember 2011
    AW: Verhalten von == und equals()

    ja da hast schon recht.

    Diese String Freiheit bei Java ist übrigens echt ein großer Nachteil der Sprache. Das passt überhaupt nicht und verwirrt einfach nur.

    Code:
    String obst = "Apfel"; //Eine Ausnahme, die nicht erlaubt sein sollte
    String obst = new String("Apfel"); //richtig
     
  3. 19. Dezember 2011
    AW: Verhalten von == und equals()

    Der Unterschied ist, dass "new String("..")" neuen Speicher allokiert und den String dort reinschreibt.

    Aber warum sollte ersteres nicht erlaubt sein? Wozu sollte man denselben String zwei mal separat im Speicher haben?
     
  4. 19. Dezember 2011
    AW: Verhalten von == und equals()

    Weil Strings in Java reine Objekte sind. Diese direkte Zuweisung ist normalerweise nur bei Basisdatentypen (int, usw.) zulässig. Und Basisdatentypen lassen sich auch mit den üblichen Operatoren (==, !=, usw.) vergleichen.

    In C++ ist das viel besser gelöst. Dort kann man nämlich Strings mit den Vergleichsoperatoren vergleichen. In Java wird unnötigerweise vorgegaukelt, dass String ein Basisdatentyp ist.

    c++:
    Code:
    string s1;
    
    s1 = "Apfel";
    
    if (s1 == "Apfel") // funktioniert so wie es sein soll
    java:
    Code:
    String s1;
    
    s1 = "Apfel";
    
    if (s1 == "Apfel") // funktioniert nicht! geht nur über Methodenaufruf
     
  5. 1. Januar 2012
    AW: Verhalten von == und equals()

    Wie vermutet werden gleiche Strings nur einmal im Speicher gehalten. == vergleicht die Speicheradresse und equals() ist eine methode die den Inhalt von zwei Objekten vergleicht. Wenn du aber Obst oder Variable änderst wird ein neuer String angelegt und der Zeiger geändert.
     
  6. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.