0

可能重复:
java中的字符串池是什么?

1.我知道==检查两个对象是否指向相同的内存位置,equals的默认定义使用==进行检查,意味着两者都是相同的。

2. String类重写 equals 方法来检查两个字符串是否具有相同的值。

考虑 S1 =“测试”和 S2 = S1;

现在 S1 和 S2 是两个不同的对象,因此根据第 1 点S1==S2应该为,根据第 2 点S1.equals(S2)应该为,但是当我在 eclipse 中运行这个小程序时,两者都返回真。关于 S1 == S2 的字符串对象有什么特别之处吗?

4

4 回答 4

3

考虑 S1 =“测试”和 S2 = S1;现在 S1 和 S2 是两个不同的对象

没有。这是你的论点失败的地方。

您创建了一个字符串对象,并且您的两个变量都引用了同一个字符串对象。赋值不会制作字符串的新副本。

于 2012-12-03T10:42:50.773 回答
3

当你写

s1 = s2;

s1并且s2是对同一个对象的引用,所以s1 == s2总是返回 true。

更令人困惑 - 如果你写:

s1 = "test";
s2 = "test";
s3 = new String("test");

你会发现这s1 == s2是真的,但又s1 == s3是假的。这在这篇文章中有更详细的解释。

于 2012-12-03T10:43:03.087 回答
2

Wiritng S1 = S2 导致它们指向同一个对象

写作

String S1 = "test"
String S2 = "test"

将产生与您现在相同的结果。这是由于编译器优化,编译器注意到字符串类是不可变的,因此他将优化代码以使用相同的实例。您可以通过使用构造函数实例化它们来强制他创建新字符串

String s1  = new String("test");
String s2  = new String("test");
System.out.println(s1 == s2) // false
System.out.println(s1.equals(s2)) //true
于 2012-12-03T10:44:22.507 回答
1

当你初始化

S2=S1 

它们都指向相同的内存位置。

尝试

S1 = "test"; 
S2 = "test";

这会给你

 S1==S2 //false
于 2012-12-03T10:45:52.870 回答