0

为什么这会返回 true?这似乎有点奇怪,因为我有两个字符串,它们是单独的对象,但据说是彼此的别名。

public boolean stringEquals() {
  String tmp1 = "hello";
  String tmp2 = "hello";
  return tmp1==tmp2;

}
4

2 回答 2

2

字符串文字由 JVM 保留,因此它们的引用将是相同的。

换句话说,每个使用的字符串字面量都将只存储一次,因此它们的对象将是相似的。看

在此处输入图像描述

取自这里:https ://www.geeksforgeeks.org/interning-of-string/

于 2019-12-04T19:35:57.003 回答
1

== 运算符比较 2 个对象的引用而不是它们的值。因此,除非我们使用,否则我们.equals()必须期望看到false这些是 2 个独立的对象。

但是这种特殊情况发生在字符串上。在 Java 中,字符串是不可变的。意味着它们的价值不能改变。JVM 使用此属性来优化内存。Java 中的字符串存储在内存中称为字符串池的单独空间中。由于这两个字符串是相同的并且它们是不可变的,JVM 将“hello”存储在池中并为两个对象重用相同的引用。这是安全的,因为字符串是不可变的。(如果您稍后在代码中为其分配其他内容,它将在池中的其他地方创建一个新值并引用它)。

同时有趣的是,使用构造函数时并非如此。如果我们使用构造函数构造一个新字符串,它总是创建一个具有唯一引用的单独对象,而不管值是否相同。

String a = new String("Hello");
String b = new String("Hello");
return a==b;

会回来false的。 字符串池的概念仅适用于使用没有构造函数的字符串文字时。

于 2019-12-04T19:37:15.017 回答