views:

84

answers:

2

I want to demonstrate with a few line of code that in Java, that to compare two strings (String), you have to use equals() instead of the operator ==.

Here is something I tried :

public static void main(String Args[]) {
   String s1 = "Hello";
   String s2 = "Hello";

   if (s1 == s2)
      System.out.println("same strings");
   else
      System.out.println("different strings");
}

I was expecting this output : different strings, because with the test s1 == s2 I'm actually comparing two references (i.e. addresses) instead of the objet's content.

But I actually got this output : same strings !

Browsing the internet I found that some Java implementation will optimize the above code so that s1and s2 will actually reference the same string.

Well, how can I demonstrate the problem using the == operator when comparing Strings (or Objects) in Java ?

+14  A: 

The compiler does some optimizations in your case so that s1 and s2 are really the same object. You can work around that by using

String s1 = new String( "Hello" );
String s2 = new String( "Hello" );

Then you have two distinct objects with the same text content.

tangens
thanks ! I didn't know that using `new` or not when instanciating a String would produce something different !
Jérôme
+1  A: 

Well, how can I demonstrate the problem using the == operator when comparing Strings (or Objects) in Java ?

Here a way:

String s = "ab";
String t = new String("ab");
System.out.println(s == t); // false

Also be careful when comparing primitive wrappers and using auto-boxing: Integer (and Long) for instance caches (and re-uses!) the values -128..127. So:

Integer s = -128;
Integer t = -128;
System.out.println(s == t);

will print true, while:

Integer s = -129;
Integer t = -129;
System.out.println(s == t);

prints false!

Bart Kiers
Thanks. I didn't know about caching of values -128..127. I'm not sure to understand the reason why Java does that, but it's good to know !
Jérôme
@Jérôme, this is done because the developers thought (think) these values were used so often that it was beneficial to *not* create new instances of these values each time. And since they're immutable, it can't hurt to *re-use* these instances.
Bart Kiers
Its a great example of Flyweight pattern.
Vivart