我需要检查返回的列表是否创建过一次,或者它是否是对象的副本。有可能找到它的地址吗?
// thread 1
List<Object> list = supplier.get();
System.out.print("list: " + list + "@" + getAddress(list));
// thread 2
List<Object> list = supplier.get();
System.out.print("list: " + list + "@" + getAddress(list));
getAddress(list)
怎么样?问题是通常返回地址的hashCode()
在AbstractList
中被覆盖,因此它将返回有效的哈希码而不是地址。
答案 0 :(得分:8)
我猜你想要
System.identityHashCode(list);
javadoc说
返回与默认方法hashCode()返回的给定对象相同的哈希码,无论给定对象的类是否覆盖hashCode()。
答案 1 :(得分:6)
是否有可能找到它的地址?
没有。但是,您可以检查参考相等性 - 这是您关心的所有内容:
if (list1 == list2)
{
// They're the same
}
如果您确实希望通过日志记录执行此操作,则可以使用System.identityHashCode
代替,但请注意,此不意味着被视为地址。它仍然是一个哈希码,并不保证是唯一的。它可能与某些内部地址相关,但这远远不能保证。
答案 2 :(得分:2)
对象的地址在Java中没有固定,它可以移动,所以你无法得到它。
为什么不直接查看if(list1 == list2)
?