muenzchen: Strings vergleichen

Hallo!

Kann es sein, dass man in Java keine Strings vergleichen kann?

Ich habe folgendes probiert:

String test = "+";

if (test != "+") {
 System.out.println("OK");
}

Aber er schreibt trotzdem "OK" hin?

Das verstehe ich nicht, was ist denn daran falsch?

  1. Hallo,

    Kann es sein, dass man in Java keine Strings vergleichen kann?

    doch man kann, mit welcher Methode ist die Frage...
    die Operatoren == bzw. != müssen dafür überladen sein und ich weiss nicht genau ob das geht bei Strings.

    Ich habe folgendes probiert:
    String test = "+";

    // dass ist kein String sondern ein Zeichen, vielleicht '+'

    if (test != "+") {

    // hier auch

    System.out.println("OK");
    }

    Aber vielleicht gibt es in Java den Operator == für den Stringvergleich nicht, stattdessen solltest Du vielleicht eine dieser Funktionen nehmen:
    http://java.sun.com/j2se/1.4/docs/api/java/lang/String.html

    ciao
    romy

    --
    DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
    ->Alles ist gut wenn es aus Schokolade ist
    1. 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

      1. Hi Robert,

        Ich hoffe, ich habe mich nicht allzu umständlich ausgedrückt ;-)

        nein, so ungefähr dachte ich mir dass. Ich habe keine Erfahrung mit Java, aber es erschien mir Sinnvoll, dass wahrscheinlich eine Methode dazu nötig ist 2 Strings zu vergleichen. Allerdings hatte ich zuerst an die Sache mit den chars gedacht. Ich denke in C ist das so, da muss ich glaube ich char var='r' schreiebn anstatt mit doppelten Anführungszeichen. Naja, man kann halt nicht immer vergleichen ...

        danke
        ciao
        romy

        --
        DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
        ->Alles ist gut wenn es aus Schokolade ist
  2. Hallo,

    wenn du wirklich Java meinst und nicht JavaScript, dann schreibe es so:

    if (!test.equals("+")) {
    ...
    }

    in Java kann man keine Operatoren überladen, demzufolge kann man bei String und generell bei Objekten, wenn deren Inhalte miteinander verglichen werden sollen, nur mit Methoden (Funktionen) arbeiten!

    Chipsy