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