2013-08-14 10 views
15

Jestem stoi problem z tej linii (skomentował poniżej):Uzyskiwanie dziwne wyjście podczas drukowania wynik porównania ciąg

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

który wyprowadza false.

Jednakże, System.out.println(s3==s4) wyprowadza true.

Teraz nie jestem w stanie zrozumieć, dlaczego ja dostaję ten wynik:

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 Czy jesteś brzydkim szefem? ? – jsedano

+4

Twoje dane wyjściowe nie są zgodne z kodem. Trzecia linia powinna być po prostu "false". – arshajii

+1

Proszę sprawdzić, czy zaksięgowane dane wyjściowe są poprawne. Oczywiście początkowe znaki "Wyjście" nie byłoby tam. Ponadto ostatnie wywołanie 'println' nie jest pokazywane podczas drukowania' s3', a linia środkowa jest podejrzana. –

Odpowiedz

31

Brakuje zestaw wsporników:

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

w twojej wersji "Using == ::" + s3 jest porównywany przez == do s4, co nie jest tym, czego potrzebujesz.

Ogólnie + ma wyższy precedence niż ==, dlatego "Using == ::" + s3==s4 jest oceniany jako ("Using == ::" + s3) == s4.

+0

Więc z ciekawości, co oceniał w swoim kodzie? Och, myślę, że to rozumiem, porównuje cały ciąg + s3 do s4, co jest oczywiście fałszywe. –

+1

'(" Używanie == :: "+ s3) == s4' – Tom

+5

Interesujący zwrot na zwykłych pytaniach' .equals'. +1 –

5

Linia jest poprawne:

"Using == ::"+s3 nie jest równa s4

Musisz zmienić swój kod:

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

edit: Wyjście kodu give jest:

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

Czy zatem konkatenacja łańcuchów ma wyższy priorytet niż operator porównania? Plus ... dlaczego miałby wydrukować ciąg literowy, gdyby tylko go porównywał? –

+0

Zgodnie z tym - http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html ma. – Betlista

+3

Następnie powinien wydrukować "false", a nie "Using = :: false" –

13

Używasz tego kodu:

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

który jest oceniany jako:

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

Stąd otrzymujesz fałszywy jako wyjścia.

Powód jest to, że jak na pierwszeństwa operatora + jest wyższa niż == jak na tym Operator Precedence tabeli: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html

jak inne odpowiedzi powiedzieć trzeba użyć nawiasów załączając swoje logiczną wyrażenia:

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

To jest najlepsze wytłumaczenie tego, dlaczego wyjście jest takie, jakie jest, ale byłoby lepiej z wyjaśnieniem, jak to naprawić. – Michelle

+0

@Michelle: IMO Najpierw muszę wyjaśnić, dlaczego OP otrzymuje nieprawidłowy wynik, wtedy moja odpowiedź byłaby lepiej zrozumiana. Pls sprawdź teraz edycję. – anubhava

+1

+1 Za wzmiankę o pierwszeństwie i odniesienie do dokumentów. – Michelle

Powiązane problemy