【问题标题】:How to determine if an object is the same one or different如何判断一个对象是相同的还是不同的
【发布时间】:2019-10-14 15:34:40
【问题描述】:

我知道this.toString() 不打印对象的地址,而是打印哈希码。我也读过this one 之类的讨论

但是,假设this.toString() 在 2 次打印相同的值在第 3 次打印不同的值那么,我是否可以断定前2次的对象相同,而第三次的对象不同?

我正在尝试确定(仅用于测试)一个对象是相同的还是不同的。比如this 指向相同或不同的地址。

在 Android 设备上运行的 Java 中,有没有更好的方法来检查一个对象是否相同或不同? 或者如果我能以某种方式获得对象的地址,那么整个困境就解决了。

【问题讨论】:

  • toString 可以以任何可能的方式实现,因此您永远无法从中获得一般意义上的可靠信息。如果您只关心具有已知toString() 实现的特定对象,那么您可能会有所收获……但在一般情况下不会。另请注意,获取地址甚至不能完全解决问题,因为一旦原始对象被 GC,地址可能会被重新使用。

标签: java android object tostring


【解决方案1】:

在Java中比较两个对象主要有三种方式:

  1. 比较对象引用(您正在寻找的那个)

    obj1 == obj2
    

    此条件为真当且仅当两个引用都指向同一个对象

    CustomType obj1 = new CustomType();
    CustomType obj2 = ob1;
    boolean thisIsTrue = obj1 == obj2;
    

    但是:

    CustomType obj1 = new CustomType();
    CustomType obj2 = new CustomType();
    boolean thisIsFalse = obj1 == obj2;
    
  2. 比较对象数据

    obj1.equals(obj2)
    

    这种情况的结果取决于equals 方法在obj1 的类上的实际实现。例如。这种设计不佳的equals 方法将始终返回false。即使obj1obj2 指向同一个对象。

    @Override
    public boolean equals(Object other){
        return false;
    }
    
    CustomType obj1 = new CustomType();
    CustomType obj2 = ob1;
    boolean thisIsTrue = obj1 == obj2;
    boolean thisIsFalse = obj1.equals(obj2);
    
  3. 比较对象哈希码

    obj1.hashCode() == obj2.hashCode()
    

    这种情况的结果取决于hashCode 方法在obj1obj2 的类上的实际实现。不鼓励使用这种方法,因为它更不可信。两个完全不同的对象可以具有相同的哈希码。在某些特定情况下,应谨慎谨慎地使用它。

【讨论】:

    【解决方案2】:

    确定对象引用是否与其他引用指向同一实例的最简单方法是使用== 运算符:

    yourRef1 == yourRef2
    

    或者,如果你想知道一个对象的不可变引用,你可以使用System.identityHashCode(yourObject)

    为给定对象返回与返回相同的哈希码 通过默认方法 hashCode(),无论给定对象的 类覆盖 hashCode()。空引用的哈希码是 零。

    【讨论】:

    • 如何在 this 指针上调用 System.identityHashCode
    • 只需调用 System.identityHashCode(yourObject);
    • 所有出色的答案,但接受此答案,因为它是记录System.identityHashCode 返回的值所需的最少代码量,并进行简单检查。
    【解决方案3】:

    如果你想检查消息的相等性,你应该使用对象类中可用的equals方法,默认情况下它是Java中所有类的超类。

    让我们检查对象Mapper。你可以这样做:

    Mapper mapper = new Mapper();
    Mapper mapper1 = mapper;
    Mapper mapper2 = new Mapper();
    mapper.equals(mapper1); //true
    mapper.equals(mapper2); //false
    

    可以有两个具有相同hashcode 的对象,但它们仍然可以不同。如果你想要一些自定义的相等检查逻辑,那么你应该在你的 Class 中覆盖 Object 类的 hashcodeequals 方法。

    【讨论】:

      猜你喜欢
      • 2018-05-14
      • 1970-01-01
      • 1970-01-01
      • 2012-09-22
      • 2018-09-15
      • 2015-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多