Java 7 と C#(.net 3.5) で同じ (..similar?) コードを書いたところ、紛らわしい出力が得られました。この動作を理解するのを手伝ってください:
ジャワ:
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
}
}
出力: 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
}
}
}
出力:真偽真
文字列の不変性や文字列プールなどの概念は認識していますが、細かい部分が欠けていると思います。
Java: s1 によって参照されるものを使用できたのに、なぜ s2 の新しい String オブジェクトを作成したのですか? それは String プールが達成すべきことではありませんか?