Hallo Romy,
String test = "+";
// dass ist kein String sondern ein Zeichen, vielleicht '+'
Doch, das ist natürlich ein String. Und zwar einer, der aus dem einen Zeichen (Char) "Plus" besteht. Auch "" ist ein String, obwohl es gar keine Chars enthält. Dagegen ist '+' kein String, sondern ein Char, der sich allerdings in einen String umwandeln ließe, wenn es sein müsste.
if (test != "+")
Strings sind in Java konstante (finale) Objektinstanzen, die eine Kette von beliebig vielen Chars beinhalten. Da in Java auf alle Objektinstanzen mit Referenzen zugegriffen wird, speichert die Variable test also nicht den Wert "Plus", sondern einen Zeiger auf irgend eine Stelle im Hauptspeicher, wo ein String abgespeichert ist, der ein Plus repräsentiert. Genauso ist das mit dem Literal "+" in der darauffolgenden if-Abrage. Auch dieses Literal wird in Wirklichkeit als Zeiger ausgewertet, der auf eine Stelle im Hauptspeicher zeigt, wo ein entsprechender String notiert ist. Die Variable test und das Literal "+" zeigen also beide auf Stellen im Hauptspeicher, wo Strings zu finden sind, die ein Plus darstellen. Das muss nicht unbedingt beide Male die gleiche Stelle sein. Lediglich die Strings, die an den Stellen abgespeichert sind, wo diese beiden Referenzen hinzeigen, sind vom Wert her gleich. Es werden aber eben nicht diese Strings verglichen, auf welche die Referenzen zeigen, sondern die Referenzen selbst, d.h. die Stellen, wo die Strings im Hauptspeicher abgelegt sind. Daher kann es sein, dass test und "+" unterschiedlich sind.
Die Methode equals(Object anObject) vergleicht dagegen nicht die Referenzen, sondern die Inhalte der Strings selbst. Sie geht die beiden Strings also wahrscheinlich Char für Char durch und vergleich jedes Zeichen einzeln. Und hier wird true zurückgegeben, nicht wenn die beiden Strings das gleiche "Pointerziel" haben, sondern wenn sie aus der gleichen Kette von Chars bestehen ("the same sequence of characters").
Ich hoffe, ich habe mich nicht allzu umständlich ausgedrückt ;-)
Robert