【问题标题】:String replace(), return value comparison using '==' [duplicate]字符串替换(),返回值比较使用'==' [重复]
【发布时间】:2013-04-28 08:17:42
【问题描述】:

System.out.print("a".replace('a','1')=="a".replace('a','1'));

true 是预期的,因为 replace() 返回字符串,并且可以使用 == 进行字符串比较。 但是上面的代码打印出false。解释?

【问题讨论】:

  • 您不应该将 java 中的字符串与== 进行比较。它检查它们的引用是否相同,而不是它们的值。
  • 我通过上面 Nizet 爵士的帖子了解了 String Interning 的概念。这就是S.O.Pln ("a"=="a"); 返回true 的原因。感谢大家的时间和合作。 :)

标签: java return-value equals-operator


【解决方案1】:

== 检查它们是否是内存中的同一个对象,所以在同一个位置。

由于这两个不同的字符串恰好具有相同的内容,因此您需要与 .equals 进行比较,后者比较的值不是引用。

【讨论】:

  • 或者如果你想比较你替换它们的数值,你需要解析那个新的替换然后你可以使用==
  • 让爵士:S.O.Pln ("ab"=="ab");返回true。它们共享相同的内存吗?
  • @ChaZ 在这种情况下是的,因为它们在编译时是已知的,因此它们在内存中被赋予了一个静态位置,而不是在运行时创建。这是一个棘手的案例。为安全起见,请始终将字符串与 .equals 进行比较,除非您明确知道自己关心内存位置。
  • @Jean-BernardPellerin:会的。顺便说一句,这只是一个学术问题。我很清楚equals() 的用途,但现在,我也很清楚== 的风险。非常感谢! :)
【解决方案2】:

不,不建议使用 == 进行字符串比较。在某些情况下,例如:

new String("test") == new String("test")

它返回 false。

这一切都是因为理论上Java应该在字符串池中搜索某个字符串,但实际上有些操作会返回新对象而不是驻留在字符串池中的对象。

始终使用“equals”方法而不是 ==!! 非常重要!

【讨论】:

  • 我什至会说,在大多数种情况下,相等性测试将返回 false。
  • 我什至会说永远不要使用== 来比较字符串。
  • 同意。这是一个学术问题,这就是我问的原因。顺便说一句,为什么S.O.Pln ("ab"=="ab"); 返回true?我想他们不共享相同的记忆。
  • 他们会,阅读有关字符串池的信息。
  • 这方面的知识非常重要。如果某些愚蠢的方法在内存中创建了许多相同的 String 对象,您可能会遇到内存问题。然后,您可以使用“intern()”方法强制 JVM 将其放入字符串池以释放内存。研究这个主题,因为根据我的经验,它可能会帮助您在未来发现一些性能问题:)
猜你喜欢
  • 1970-01-01
  • 2018-06-14
  • 2011-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多