Getting strange output when printing result of a string comparison

I am facing a problem with this line (commented below):

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

which outputs false.

However, System.out.println(s3==s4) outputs true.

Now, I am not able to understand why I am getting this result:

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

Solution 1:

You're missing a set of brackets:

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

In your version, "Using == ::" + s3 is being compared via == to s4, which isn't what you want.

In general, + has a higher precedence than ==, which is why "Using == ::" + s3==s4 is being evaluated as ("Using == ::" + s3) == s4.

Solution 2:

You are using this code:

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

Which is being evaluated as:

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

Hence you are getting false as output.

Reason is that as per the operator precedence + is higher than == as per this Operator Precedence table: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html

As other answers say you need to use brackets enclosing your boolean expression:

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

Solution 3:

The line is correct:

"Using == ::"+s3 is not equals to s4

You'll need to change your code:

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

edit: The output of the give code 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