【问题标题】:The == operator in Java [duplicate]Java中的==运算符[重复]
【发布时间】:2014-03-01 00:56:14
【问题描述】:

以下在 Java 中是正确的

"abc"=="abc"

为什么?两个Strings是两个不同的对象,它们的对象标识应该不一样吧?

【问题讨论】:

  • The two Strings are two different objects - 是吗?
  • 最好使用"abc".equals("abc")
  • @yshavit 不,这不是重复的,请再次阅读问题
  • @Warlord 我在提交后立即编辑了重复投票评论。恕我直言,我们不能在这里拥有“String ==”的所有变体。它们基本上都是同一个问题,即“字符串字面量在 Java 中是如何工作的?”

标签: java string-interning object-identity


【解决方案1】:

Java 中对非原始对象的== 操作将按内存位置进行比较。由于这两个字符串都是编译时常量,编译器只会将它们存储一次,因此您将得到您描述的结果。

【讨论】:

    【解决方案2】:

    这是因为 Java 编译器执行了优化。

    在编译时,它发现你有一个常量字符串"abc",所以当它遇到另一个常量字符串时,它会检查并发现它已经将该字符串加载到内存中。所以,它只是再次使用相同的对象。

    结果是它们在内存中是完全相同的对象。

    【讨论】:

      【解决方案3】:

      Java 将所有文字(放置在代码中的字符串)保存在 JVM 内存的特殊部分中。 如果有两个或多个相同的文字,JVM 只需指向同一个对象,而不是创建几个具有相同内容的字符串。

      所以:

      "ab" == "ab" // true - because they are the same objects
      

      但是:

      "ab" == new String("ab") // false - because new String(...) is new String not literal
      

      您可以通过调用intern() 方法来获取或移动您的字符串到特殊内存。

          String ab1 = "ab";
          String ab2 = new String("ab");
          // ab1 == ab2 is false as described above
          ab2 = ab2.intern();
          // ab1 == ab2 but now it's true because ab2 pointers to "ab" in special part of memory.
      

      【讨论】:

        猜你喜欢
        • 2012-05-26
        • 2010-10-02
        • 2012-08-23
        • 2011-11-06
        • 2013-09-07
        • 2014-05-10
        • 1970-01-01
        • 2011-01-20
        • 2018-03-21
        相关资源
        最近更新 更多