【问题标题】:java equals and == confusion [duplicate]java等于和==混淆[重复]
【发布时间】:2012-11-20 19:37:16
【问题描述】:

可能重复:
what is String pool in java?

1. 我知道 == 检查两个对象是否指向相同的内存位置,并且 equals 的默认定义使用 == 进行检查,表示两者相同。

2. String 类重写 equals 方法来检查两个字符串是否具有相同的值。

考虑 S1 =“测试”和 S2 = S1;

现在 S1 和 S2 是两个不同的对象,因此根据点 1 S1==S2 应该是 false 并且根据点 2 S1.equals(S2 ) 应该是 true 但是当我在 Eclipse 中运行这个小程序时,两者都返回 true。 S1 == S2 也成立的字符串对象有什么特别之处吗?

【问题讨论】:

  • 这可能是该论坛上提出并已回答的#1 Java 问题。 ;)
  • “现在 S1 和 S2 是两个不同的对象” - 不,它们不是。 S2 和 S1 都是对同一个字符串对象的引用。
  • 初始化 S2=S1 时,它们都指向相同的内存位置。尝试 S1 =“测试”; S2 =“测试”;这会给你 S1==S2 false
  • @PeterLawrey 每次被问到,都会得到多次回答。真是浪费时间……;)

标签: java equals string-comparison comparison-operators


【解决方案1】:

考虑 S1 =“测试”和 S2 = S1;现在 S1 和 S2 是两个不同的对象

不。这就是你的论点失败的地方。

您创建了 一个 字符串对象,并且您的两个变量都引用了同一个字符串对象。赋值不会制作字符串的新副本。

【讨论】:

    【解决方案2】:

    当你写作时

    s1 = s2;
    

    s1s2 是对同一个对象的引用,所以 s1 == s2 将始终返回 true。

    更令人困惑 - 如果你写:

    s1 = "test";
    s2 = "test";
    s3 = new String("test");
    

    你会发现s1 == s2 是真的,而s1 == s3 是假的。这在in this post有更详细的解释。

    【讨论】:

      【解决方案3】:

      Wiritng S1 = S2 导致它们指向同一个对象

      写作

      String S1 = "test"
      String S2 = "test"
      

      将产生与现在相同的结果。 这是由于编译器优化,编译器注意到字符串类是不可变的,因此他将优化代码以使用相同的实例。您可以通过构造函数实例化它们来强制他创建新字符串

      String s1  = new String("test");
      String s2  = new String("test");
      System.out.println(s1 == s2) // false
      System.out.println(s1.equals(s2)) //true
      

      【讨论】:

        【解决方案4】:

        当你初始化时

        S2=S1 
        

        它们都指向相同的内存位置。

        试试

        S1 = "test"; 
        S2 = "test";
        

        这会给你

         S1==S2 //false
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-08-09
          • 2016-04-02
          • 2013-08-02
          • 2017-10-28
          • 1970-01-01
          • 2021-10-22
          • 1970-01-01
          相关资源
          最近更新 更多