在字符串中使用“==”? (Java)

Using '==' with strings? (Java)

String str1 = new String("I love programming");
String str2 = new String("I love programming");
boolean boo = str1 == str2; // evaluates to false

String str1 = "I love programming";
String str2 = "I love programming";
boolean boo = str1 == str2; // evaluates to true

为什么第一个计算结果为 false 而第二个计算结果为 true?

在这里您可以找到更多信息:What is the Java string pool and how is "s" different from new String("s")?

equals()方法比较String的内容,==比较Java中的引用。

如果对象本身具有相同的地址,

== 将 return 为真。出于 space 和效率原因,重复的文字被优化为使用相同的地址。第二个 str1str2 等于同一个地址,因此 == return 为真。

在第一个示例中,因为您使用 new 关键字显式声明内存,所以 str1str2 没有相同的地址。因此,str1==str2 的计算结果为 false.

测试相等性时,请改用 String.equals(); 函数。因此,str1.equals(str2); //true

它存在于 Java 内存模型中

第一个相等语句 returns 为 false,因为您正在比较两个不同对象的两个不同引用,因为您使用关键字 new 在堆内分配内存 space到两个不同的内存地址,秒,JVM 将分配内存 space 一次 "into the stack" ( 从 Java 7 它们也在堆中 ) 并且编译器通过使两个变量指向同一内存 space 来优化内存使用,它解释了相等结果是 true.

这里有一篇关于堆、栈等的有趣读物。 JVM Internals Blog

干杯

不像 C。(==) 比较 java 字符串变量的引用。它比较存储字符串的两个地址。两者按值比较,需要用string1.equals(string2).