Understanding explicit cast for String producing different results in c# and Java

c#, java

Solution

There are two aspects to your question: when objects are created, and how `==` comparisons work:

Object creation

In terms of interning ("pooling") - only constants are interned automatically. You can intern other strings using `Intern`/`intern`, but when you just call the string constructor that will always create a new string. (Well, except for one bizarre corner case in .NET, but we can ignore that for now.)

So in your code, `s1` and `s2` always refer to different objects.

Comparison

The cause of the difference is your use of `==`. C# supports user-defined operator overloading, and `String` overloads it like this:

public static bool operator ==(string x, string y)

which compares the contents of the string rather than the references. So when you have two operands of type `string`, `x == y` ends up doing an equality comparison rather than an identity comparison. That's why the first line of the C# output is `True`.

Java doesn't have this behaviour, which is why is prints `false`.

When the operand types are `Object`, both C# and Java will use reference equality, which is why the second line is false in both cases.

Problem

I wrote a same(..similar?) piece of code for Java 7 and C#(.net 3.5) and got a confusing output. Please help me in understanding this behavior: Java: ``` public class strTest { public static void main(String [] s) { String s1 = "abc"; String s2 = new String(new char[] {'a', 'b', 'c'}); System.out.println(s1 == s2); // false System.out.println(((Object)s1) == ((Object)s2)); // false System.out.println(s1.equals(s2)); // true } } ``` Output : false false true C#: ``` namespace ConsoleApplication1 { class Program2 { static void Main(string[] args) { String s1 = "abc"; String s2 = new String(new Char[] {'a', 'b', 'c'}); Console.WriteLine(s1 == s2); // true Console.WriteLine(((Object)s1) == ((Object)s2)); // false Console.WriteLine(s1.Equals(s2)); // true } } } ``` Output : True False True I am aware of concepts like String immutability and String pool but I guess I am missing the finer print. In java: Why did it create a new String object for s2 when it could have used the one which is referenced by s1? Isn't that what String pool is supposed to achieve?

Original source