【问题标题】:Java String objects equality and referenceJava String 对象相等和引用
【发布时间】:2020-07-15 15:37:14
【问题描述】:

我有以下代码:

public class Test{

     public static void main(String []args){
        String x = "a";
        String y = "a";

        System.out.println(System.identityHashCode(x) == System.identityHashCode(y)); //true
        System.out.println(x.hashCode() == y.hashCode()); //true

        y = y+"b";

        System.out.println(x); // "a"
        System.out.println(y); // "ab"

        System.out.println(System.identityHashCode(x) == System.identityHashCode(y)); //false
        System.out.println(x.hashCode() == y.hashCode()); //false
     }
}

首先我创建 2 个字符串 x 和 y。然后我检查它们的 HashCodes 并且它们是相同的,所以这意味着它们是一个对象并且它们指向一个内存位置。但是当我改变 y 值时,x 的值不会改变。如果我再次检查它们的哈希码,它们是不同的,这意味着 2 个不同的对象和 2 个不同的内存位置。为什么会这样?为什么当 y 改变时 x 不改变? (因为我们只是在改变一个内存的内容)

我按照this 问题的建议使用哈希码。

更新: 我的困惑有两个原因:

a) 我认为相同的哈希码表示相同的对象(您可以查看 thisthis 问题,了解我错的详细解释。)

b) 字符串是不可变的,如果值发生变化,则会创建新字符串(如下面的答案所述。)

【问题讨论】:

标签: java string oop object


【解决方案1】:

Java 中的字符串是不可变的。您不是在“更改 y 的值”,而是在创建一个新字符串并将其分配给 y。由于您没有为 x 分配任何其他内容,因此它仍会引用您在其中的前一个字符串。

【讨论】:

    【解决方案2】:

    我认为这个问题最终源于您对xy 是对象的误解。 xy 不是对象。

    xy变量,由于String 是一个引用类型,xy 存储引用 到对象。 = 赋值运算符更改这些变量存储的引用。

    这两行:

    String x = "a";
    String y = "a";
    

    xy 存储引用同一对象的引用。

    但是当您执行y = y + "b" 时,y + "b" 会创建一个新对象。然后= 使y 存储对该新对象的引用,因此y 不再指向与x 相同的对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-05
      • 2015-07-26
      • 1970-01-01
      • 2012-05-11
      • 1970-01-01
      • 2018-07-04
      • 1970-01-01
      相关资源
      最近更新 更多