【问题标题】:Why does `==` sometimes work for Strings? [duplicate]为什么`==`有时对字符串有效? [复制]
【发布时间】:2014-10-05 04:21:55
【问题描述】:

考虑这段代码:

String baz = "Hello";
String foo = "Hello";
return foo.equals(baz); // Returns true as expected
return(baz == foo); // Also returns true!

为什么== 运算符在这种情况下也返回true?它应该比较对象本身的位置,而不是它们的值。

我假设 Java 做了某种内部工作并确定这两个是 String(或 Integer 等)类型,因此它隐式调用 .equals() 方法。

我很想知道具体如何这是完成的(即后台发生了什么),以及为什么 这样就完成了,如果我真的想测试它们在内存中的位置呢?

【问题讨论】:

  • 这与在这里找到的一个非常流行的线程非常相似:stackoverflow.com/questions/513832/…
  • @MattJones:同一枚硬币,但反面。
  • @MattJones 谢谢。我没有看到那个线程。虽然它包含我的答案,但我认为不应将其标记为重复,因为寻找相同答案的人可能不会在该线程中查看,因为问题本质上是不同的
  • @Tiberiu:是的,确实那个标记的问题与你的问题并不完全相同,这就是我重新打开你的问题的原因。
  • 我认为它应该被标记为重复。即使它被标记为重复,这个问题仍然存在,人们仍然可以找到他们的方式过去(和回来)。此处留下的任何答案以及以某种方式实习的重复封面字符串中的高票答案绝对没有添加任何新内容。

标签: java object reference equality


【解决方案1】:

return(baz == foo) 也返回 true,因为 所有文字字符串都在 Java 中实习。 当调用实习方法时,如果池中已经包含一个与此 String 对象相等的字符串,则确定通过 equals(Object) 方法,则返回池中的字符串。 否则,将此 String 对象添加到池中并返回对该 String 对象的引用。

简而言之,由于您的案例使用字符串实习生池return(baz == foo) 的行为与return(baz.equals(foo)) 相同

Read more about String literals in Java Specs

【讨论】:

  • 有道理,谢谢。我假设在其他 java 对象的情况下做了完全相同的事情? (Integer 等)
  • 对于 int 它也保持一个常量池,直到 value=127。 See this answer for more info on Integers constants
  • 字符串文字是特殊的,字符串实习生池也是如此。如果您使用new,您将获得一个新对象。有些类确实有静态工厂方法,可以返回具有正确值的现有对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-14
  • 1970-01-01
  • 1970-01-01
  • 2011-02-26
  • 1970-01-01
  • 1970-01-01
  • 2018-08-04
相关资源
最近更新 更多