Answers:
您计划使用它的确切内容(您想做什么与需要调用的内容有所不同)。
hashCode
如JavaDocs中所定义,表示:
在合理可行的范围内,由Object类定义的hashCode方法确实为不同的对象返回不同的整数。(通常通过将对象的内部地址转换为整数来实现,但是Java™编程语言不需要此实现技术。)
因此,如果您hashCode()
要查找它是否是内存中的唯一对象,那么这样做并不是一个好方法。
System.identityHashCode
执行以下操作:
无论给定对象的类是否覆盖hashCode(),都为给定对象返回与默认方法hashCode()返回的哈希码相同的哈希码。空引用的哈希码为零。
对于您正在执行的操作,听起来听起来像您想要的...但是根据库的实现方式,您想要执行的操作可能并不安全。
这是我解决的方法:
Integer.toHexString(System.identityHashCode(object));
==
不管对象的hashCode或equals实现如何,Double equals 始终根据对象身份进行检查。当然-确保您正在比较的对象引用是volatile
(在1.5+ JVM中)。
如果确实必须具有原始的Object toString结果(尽管这不是您的示例用例的最佳解决方案),则Commons Lang库中有一个ObjectUtils.identityToString(Object)方法将执行您想要的操作。从JavaDoc:
public static java.lang.String identityToString(java.lang.Object object)
如果类没有覆盖toString本身,则获取由Object生成的toString。null将返回null。
ObjectUtils.identityToString(null) = null
ObjectUtils.identityToString("") = "java.lang.String@1e23"
ObjectUtils.identityToString(Boolean.TRUE) = "java.lang.Boolean@7fa"
为您的所有实例添加唯一的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扩展并查询此属性。在单个虚拟机内将是安全的(假设没有使用类加载器进行游戏来解决静态问题)。
sun.misc.Unsafe
我们可以简单地从对象类的tostring复制代码以获取string的引用
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)));
}
}