如何toString()和hashCode()方法被覆盖,当你在Java对象的“对象引用”?

StackOverflow https://stackoverflow.com/questions/580984

  •  06-09-2019
  •  | 
  •  

我想打印用于调试目的Java中的对象的“对象引用”。 即以确保该对象是根据情况相同(或不同)。

的问题是,所讨论的类从另一个类,这已重写两个toString()和hashCode()方法通常会给我的ID继承。

实施例的情况: 运行一个多线程应用程序,其中,I(显影期间)要检查,如果所有线程使用资源对象的同一实例或不

有帮助吗?

解决方案

究竟是什么你就用它做规划(你想要做什么让你需要什么叫差异)。

hashCode ,如JavaDoc中所定义,表示:

  

多达是合理可行,由Object类定义的hashCode方法并针对不同的对象返回不同的整数。 (这一般是通过将该对象的内部地址转换成一个整数来实现的,但不是由Java™编程语言不需要这种实现技巧。)

所以,如果你正在使用hashCode()来看看它是在内存中唯一的对象,是不是做的好方法。

System.identityHashCode 执行以下操作:

  

返回给定对象相同的散列码如将被默认方法的hashCode(返回),该给定对象的类是否重写hashCode()。为空引用的哈希码是零。

其中,对于你在做什么,听起来像你想要什么......但你想要做取决于库是如何实现的可能不是安全的。

其他提示

这是我如何解决它:

Integer.toHexString(System.identityHashCode(object));

双等于==将基于对象标识经常检查,而不管对象的执行的hashCode或等于的。当然 - 确保你是比较对象引用volatile(在1.5 + JVM)。

如果你真的必须有原始对象的toString结果(虽然它并不适合你的榜样使用情况的最佳解决方案),下议院Lang库有一个方法的 ObjectUtils.identityToString(对象)会做你想要什么。根据JavaDoc:

public static java.lang.String identityToString(java.lang.Object object)
  

获取的toString这将是   通过对象生成如果一个类没有   覆盖的toString本身。空意愿   返回空值。

 ObjectUtils.identityToString(null)         = null
 ObjectUtils.identityToString("")           = "java.lang.String@1e23"
 ObjectUtils.identityToString(Boolean.TRUE) = "java.lang.Boolean@7fa"

您不能安全地做你想做的,因为默认的hashCode()可能不会返回地址,并已提及,与相同的hashCode多个对象是可能的。只有这样,才能达到你想要什么,是真正覆盖有问题的对象的hashCode()方法,并保证它们都提供了独特的价值。这是否是您的情况是可行的则是另一个问题。

有关的记录,我已经经历在IBM VM与相同的默认哈希码的多个对象在运行的WAS服务器。我们必须在那里被物体放入远程缓存将获得正因为如此覆盖的缺陷。这有启发我在该点,因为我假定默认散列码是对象的内存地址,以及

添加一个唯一的ID给所有的情况下,即。

public interface Idable {
  int id();
}

public class IdGenerator {
  private static int id = 0;
  public static synchronized int generate() { return id++; }
}

public abstract class AbstractSomething implements Idable {
  private int id;
  public AbstractSomething () {
    this.id = IdGenerator.generate();
  }
  public int id() { return id; }
}

这AbstractSomething扩展并查询这个属性。将单个VM(假设没有游戏玩类加载器来解决静态)内是安全的。

我们可以简单地将代码从对象类的复制的toString得到 串的参考

class Test
{
  public static void main(String args[])
  {
    String a="nikhil";     // it stores in String constant pool
    String s=new String("nikhil");    //with new stores in heap
    System.out.println(Integer.toHexString(System.identityHashCode(a)));
    System.out.println(Integer.toHexString(System.identityHashCode(s)));
  }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top