为什么这会返回 true?这似乎有点奇怪,因为我有两个字符串,它们是单独的对象,但据说是彼此的别名。
public boolean stringEquals() {
String tmp1 = "hello";
String tmp2 = "hello";
return tmp1==tmp2;
}
字符串文字由 JVM 保留,因此它们的引用将是相同的。
换句话说,每个使用的字符串字面量都将只存储一次,因此它们的对象将是相似的。看
== 运算符比较 2 个对象的引用而不是它们的值。因此,除非我们使用,否则我们.equals()
必须期望看到false
这些是 2 个独立的对象。
但是这种特殊情况发生在字符串上。在 Java 中,字符串是不可变的。意味着它们的价值不能改变。JVM 使用此属性来优化内存。Java 中的字符串存储在内存中称为字符串池的单独空间中。由于这两个字符串是相同的并且它们是不可变的,JVM 将“hello”存储在池中并为两个对象重用相同的引用。这是安全的,因为字符串是不可变的。(如果您稍后在代码中为其分配其他内容,它将在池中的其他地方创建一个新值并引用它)。
同时有趣的是,使用构造函数时并非如此。如果我们使用构造函数构造一个新字符串,它总是创建一个具有唯一引用的单独对象,而不管值是否相同。
String a = new String("Hello");
String b = new String("Hello");
return a==b;
会回来false
的。
字符串池的概念仅适用于使用没有构造函数的字符串文字时。