Java中两个字符串使用==进行比较的结果为false吗?

12 浏览
0 Comments

Java中两个字符串使用==进行比较的结果为false吗?

字符串 parts 是一个包含 6 个元素的字符串数组:

["231", "CA-California", "Sacramento-155328", "aleee", "Customer Service Clerk", "Alegra Keith.doc.txt"]

但是当我将 parts[0]"231" 进行比较时:

"231" == parts[0]

上述结果是 false,

我感到困惑,所以有人能告诉我为什么吗?

0
0 Comments

Java中使用==运算符比较的是对象的引用,而不是String的值。

要比较String的值,可以使用String.equals方法:

"231".equals(parts[0]);

这对于Java中的任何其他对象都是适用的——在比较值时,总是使用equals方法而不是使用==运算符。

equals方法是Object的一部分,应该被那些将要以某种方式进行比较的类重写。

0
0 Comments

Java中比较两个字符串是否相等时,使用"=="运算符会返回false的原因是,如果字符串没有被interned(即没有被放入字符串常量池),那么"=="运算符会检查引用的身份。解决方法是使用equals方法进行比较,如下所示:

"231".equals(parts[0]);

其中一个人提到,字符串字面量之间使用"=="运算符比较时会返回true。但是,我的一位学生不相信我,他认为"=="运算符会检查字符串的实际内容,因为他所提供的所有示例都是使用字符串字面量并返回true。

有人问为什么数组中的字符串没有被interned,如果数组是使用字符串字面量创建的。另一个人回答说,问题的设定是数组只是列举了字符串的内容,并没有说明它们是如何创建的。

有人想要指出的是,如果使用以下方式创建字符串:string=new String[]{"231"}[0];,那么它是没有被interned的。对于为什么会这样,他也不清楚,因为字符串是硬编码在代码中的(数组使用了字符串字面量)。

另一个人回答说,如果根据问题描述来判断,实际上并不是这样的,只是问题的提问者简化了描述。如果你真的遇到了这个问题,那么他也不知道原因。

令人惊讶的是,如果字符串是按照上述方式创建的,它将不会被interned。提问者决定另外提一个问题来询问为什么会这样。

0
0 Comments

在Java中,使用==比较对象(在本例中是字符串)的地址。你想要的是parts[0].equals("231")。它比较对象的标识。这可能在内部实现为地址,但JVM规范和JLS在这里没有讨论地址。

是的,我也看到了这一点。这只是一点小问题,但从技术上讲,你不能说它比较地址。(即使我会有点震惊,如果存在任何一个JVM不是这样实现的...)

解决方法:

要比较两个字符串的内容是否相等,应该使用equals方法而不是==运算符。所以,正确的比较应该是parts[0].equals("231")。使用equals方法可以确保比较的是字符串的内容而不是地址。

0