2013-08-14 7 views
15

Sono di fronte a un problema con questa linea (commentata sotto):Ottenere uscita strano quando la stampa di risultato di un confronto di stringhe

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

quali uscite false.

Tuttavia, System.out.println(s3==s4) uscite true.

Ora, io non sono in grado di capire il motivo per cui sto ottenendo questo risultato:

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 sei un capo dai capelli a punta? ? – jsedano

+4

L'output non è coerente con il tuo codice. La terza riga dovrebbe essere 'false'. – arshajii

+1

Verifica che l'output pubblicato sia corretto. Ovviamente i personaggi iniziali "Output-" non sarebbero lì. Inoltre, l'ultima chiamata 'println' non viene visualizzata stampando' s3' e la linea centrale è sospetta. –

risposta

31

Stai perdendo un set di staffe:

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

Nella vostra versione, "Using == ::" + s3 viene confrontato tramite == a s4, che non è quello che vuoi.

In generale, + ha una maggiore precedence di ==, motivo per cui "Using == ::" + s3==s4 viene valutata come ("Using == ::" + s3) == s4.

+0

Quindi, per curiosità, cosa stava valutando nel suo codice? Oh penso di averlo capito, sta comparando l'intera stringa + s3 a s4, che è ovviamente falso. –

+1

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

+5

Interessante svolta sulle solite domande' .equals'. +1 –

5

La linea è corretta:

"Using == ::"+s3 non è uguale a s4

Sarà necessario modificare il codice:

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

edit: L'uscita del codice di dare is:

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

Quindi la concatenazione di stringhe ha una precedenza più alta di un operatore di confronto? Inoltre ... perché dovrebbe stampare la stringa letterale se la stesse confrontando? –

+0

Secondo questo - http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html ha. – Betlista

+3

Quindi dovrebbe stampare "false" e non "Using = :: false" –

13

Si utilizza questo codice:

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

che viene valutata come:

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

Quindi hai trovato falsa come output.

Il motivo è che come per l'operatore di precedenza + è superiore a quello di cui al presente ==Operator Precedence tabella: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html

Come altre risposte dicono è necessario utilizzare le parentesi che racchiude l'espressione booleana:

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

Questa è la migliore spiegazione di _why_ l'output è quello che è, ma sarebbe meglio con una spiegazione su come risolverlo. – Michelle

+0

@Michelle: IMO Innanzitutto devo spiegare perché l'OP sta facendo un output errato, quindi la mia risposta sarà meglio compresa. Pls controlla la modifica ora. – anubhava

+1

+1 Per la menzione della precedenza e il riferimento ai documenti. – Michelle

Problemi correlati