此问题已在此处有答案:
How do I compare strings in Java?(23答案)
What is Java String interning?(8个回答)
String comparison and String interning in Java(3个答案)
3天前关闭。
此帖子已于2天前编辑并提交审核,未能重新打开帖子:
原始关闭原因未解决
我是Java新手。我理解我们应该使用.equals
来进行字符串比较,而不是==
运算符。我无法理解下面的args
与key
在比较方面的行为。这两个变量都是String数组,第一个元素是qwerty
。
class Main {
public static void main(String[] args) {
String[] key = {"qwerty"};
String obj = "qwerty";
System.out.println(args[0] == "qwerty"); // false, why?
System.out.println(args[0] == key[0]); // false, why
System.out.println(key[0] == "qwerty"); // true, okay
System.out.println(obj == "qwerty"); // true, okay
System.out.println(obj == key[0]); // true, okay
System.out.println(obj == args[0]); // false, why?
}
}
如果将qwerty
作为参数传递给程序,我希望所有qwerty
检查都为真
注意:在我理解了原因之后,我编辑了这个问题,以更多地关注 * 实习 * 方面,而不是==
与equal
比较的细微差别。我们在其他问题中的大多数答案都强调了后者,很少有地方讨论实习是关键概念。所以这个问题并不是关于如何在Java中进行字符串比较。它涉及到一个不同的概念。
2条答案
按热度按时间pkwftd7m1#
不是所有条件都返回
true
的原因如下。在Java中,需要使用
String.equals
方法来比较两个字符串的内容。==
运算符不用于String
比较,除非您要确定两个String
对象是否相同,这并不常见。Comparing Strings and Portions of Strings (The Java™ Tutorials > Learning the Java Language > Numbers and Strings)。
我相信,对于某些局部值,您获得
true
的原因是因为在Java中,通俗地称为interning
。这里有一个相关的StackOverflow问题。
我想象实习是为了减少内存消耗,因为从统计学上讲,
String
值有很高的概率是相同的。因此,从本质上讲,JVM只是返回堆中
String
的引用,而String
恰好具有相同的值。而不是用相同的值存储一个新的
String
值。也就是说,您与
args
的比较产生false
的原因很可能是因为JVM不再访问该池。因此,尽管
String
的值相同,但实际对象却不同。acruukt92#
在java中,文字字符串和变量字符串是不同的。
示例:
编译器为
x
和y
分配相同的地址;为z
分配新地址。因此,当您使用==
比较两个对象时,会比较地址。为了避免灾难,开发团队将避免对String使用比较运算符。有很多方法可以进行比较。请跟随他们。Good Read