#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? + Multi-Zitat Zitieren
#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 + Multi-Zitat Zitieren
#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? + Multi-Zitat Zitieren
#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 + Multi-Zitat Zitieren
#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. + Multi-Zitat Zitieren