与==两个字符串的Java比较是假的?

omg*_*omg 44 java string equals

字符串部分是String [6]:

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

但是当我比较parts[0]"231":

"231" == parts[0]
Run Code Online (Sandbox Code Playgroud)

以上结果是假的,

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

coo*_*ird 77

==运营商比较对象引用,在不值String秒.

要比较Strings 的值,请使用以下String.equals方法:

"231".equals(parts[0]);
Run Code Online (Sandbox Code Playgroud)

对于Java中的任何其他对象都是如此 - 在比较值时,始终使用equals方法而不是使用==运算符.

equals方法是一部分Object,并且应该被将以某种方式进行比较的类所覆盖.


Yis*_*hai 15

如果字符串未被实现,则==检查引用标识.使用:

 "231".equals(parts[0]);
Run Code Online (Sandbox Code Playgroud)

代替.

  • +1提及字符串文字相互比较时返回true.我的一个学生不相信我==不会检查字符串的实际内容,因为他给我的每个例子都使用了字符串文字并返回true. (2认同)

Dav*_*one 13

== 在Java中比较对象的地址(在本例中为字符串).

你想要的是什么 parts[0].equals("231")

  • 它比较对象标识.*可能*在内部实现为地址,但JVM规范和JLS不在此讨论地址. (4认同)

Jes*_*sse 10

以下打印出"真实";

String s = "231";
if(s == "231")
{
    System.out.println("true");
}
else
{
    System.out.println("false");
}
Run Code Online (Sandbox Code Playgroud)

这是因为字符串不可变,java会尝试尽可能多地节省空间,因此它指向同一个内存引用.

但是,以下打印出"false":

String s = new String("231");
if(s == "231")
{
    System.out.println("true");
}
else
{
    System.out.println("false");
}
Run Code Online (Sandbox Code Playgroud)

new 将强制它将字符串存储在新的内存位置.

顺便说一句,你应该总是.equals()用来比较字符串(对于像这样的情况)

  • 为什么这会被贬低? (2认同)

tpu*_*nen 7

使用equals方法:parts [0] .equals("231").==运算符比较对象引用.


bas*_*ero 5

"=="比较对象引用,在您的情况下,"231"是与部分[0]不同的对象.

您想使用String.equals.

parts[0].equals("231")
Run Code Online (Sandbox Code Playgroud)

  • 使用"foo".equals(bar)而不是bar.equals("foo")通常是个好主意.无论bar是否为null,第一段代码都将起作用.第二段代码将抛出NullPointerException. (5认同)