如何toString()和hashCode()方法被覆盖,当你在Java对象的“对象引用”?
题
我想打印用于调试目的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)));
}
}