2013-08-14 5 views
15

ich mit dieser Linie ein Problem bin vor (kommentierte unten):Erste merkwürdige Ausgabe, wenn Ergebnis eines String-Vergleich Druck

System.out.println("Using == ::"+s3==s4) 

die Ausgänge false.

Jedoch System.out.println(s3==s4) Ausgänge true.

Jetzt bin ich nicht in der Lage zu verstehen, warum ich dieses Ergebnis bin immer:

public class string { 
    public static void main(String[] args){ 
     String s3="Shantanu"; 
     String s4=s3; 
     String s1=new String("java"); 
     String s2=new String("javaDeveloper"); 

     System.out.println("Using Equals Method::"+s1.equals(s2)); 
     System.out.println("Using Equals Method::"+s3.equals(s4)); 
     System.out.println("Using == ::"+s3==s4);//Problem is here in this line 
     System.out.println(s1+"Directly printing the s2 value which is autocasted from superclass to string subclass "); 
     System.out.println("Directly printing the s1 value which is autocasted from superclass to string subclass "+s2); 
     System.out.println(s3); 
    } 
} 
 
Output-Using Equals Method::false 
Using Equals Method::true 
Using == ::false 
java Directly printing the s2 value which is autocasted from superclass to string subclass 
Directly printing the s1 value which is autocasted from superclass to string subclass javaDeveloper 
+3

@roippi Bist du ein spitzenhaariger Boss? ? – jsedano

+4

Ihre Ausgabe stimmt nicht mit Ihrem Code überein. Die dritte Zeile sollte nur "falsch" sein. – arshajii

+1

Bitte überprüfen Sie, ob Ihre veröffentlichte Ausgabe korrekt ist. Offensichtlich wären die Anfangsbuchstaben "Output-" nicht da. Außerdem wird der letzte println-Aufruf nicht angezeigt, wenn "s3" gedruckt wird und die mittlere Zeile verdächtig ist. –

Antwort

31

Sie verpassen eine Reihe von Klammern:

System.out.println("Using == ::" + (s3==s4)); 

In Ihrer Version, "Using == ::" + s3 wird über == mit s4 verglichen, was nicht das ist, was Sie wollen.

Im Allgemeinen + hat eine höhere precedence als ==, weshalb "Using == ::" + s3==s4 als ("Using == ::" + s3) == s4 ausgewertet wird.

+0

Also aus Neugier, was wurde in seinem Code bewertet? Oh ich denke, ich verstehe es, es vergleicht die ganze Zeichenfolge + s3 mit s4, was offensichtlich falsch ist. –

+1

'(" Using == :: "+ s3) == s4' – Tom

+5

Interessante Wendung zu den üblichen' .equals' Fragen. +1 –

5

Die Linie ist richtig:

"Using == ::"+s3 ist gleich nicht zu s4

Sie benötigen, um Ihren Code zu ändern:

"Using == ::"+(s3==s4) 

edit: Der Ausgang des Code geben ist:

Using Equals Method::false 
Using Equals Method::true 
false 
javaDirectly printing the s2 value which is autocasted from superclass to string subclass 
Directly printing the s1 value which is autocasted from superclass to string subclass javaDeveloper 
Shantanu 
+1

Also hat String-Verkettung eine höhere Priorität als ein Vergleichsoperator? Plus ... warum würde es die literale Zeichenkette drucken, wenn sie es nur vergleicht? –

+0

Nach diesem - http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html hat es. – Betlista

+3

Dann sollte es "falsch" und nicht "Using = :: false" drucken –

13

Sie verwenden diesen Code:

System.out.println("Using == ::"+ s3==s4); 

Welche bewertet wird als:

System.out.println(("Using == ::" + s3) == s4); 

Daher sind Sie falsch als Ausgabe zu bekommen.

Grund ist, dass gemäß der Rangfolge der Operatoren + höher als == nach dieser Operator Precedence Tabelle: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html

Wie andere Antworten sagen, dass Sie Klammern verwenden, um Ihre boolean Ausdruck umschließenden:

System.out.println("Using == ::" + (s3==s4)); 
+1

Dies ist die beste Erklärung von _why_ die Ausgabe ist, was es ist, aber wäre besser mit einer Erklärung, wie es zu beheben ist. – Michelle

+0

@Michelle: IMO Zuerst muss ich erklären, warum OP's falsche Ausgabe bekommen, dann würde meine Antwort besser verstanden werden. Bitte überprüfen Sie die Bearbeitung jetzt. – anubhava

+1

+1 Für die Erwähnung der Vorrangstellung und Verweis auf Dokumente. – Michelle