我为 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
}
}
输出:假假真
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 对象?这不是字符串池应该实现的吗?