Object::hashCode的返回值是不是对象的内存地址?
某一天,和小伙伴之间的话题不知怎么转到如何实现Object::hashCode上,于是就有了这篇文章。 有什么好讨论的呢,取对象的内存基址不就挺好的吗?方便又高效。且看下文的讨论 当GC发生时…… JavaDoc中描述了Object::hashCode的三个约束,其中要求对象不变时其hash code就应该不变,Object本身没什么属性可变的,自然hash code也就不会变。而Java是自带GC的语言,大家都知道。某些GC算法,比如Copy,比如Mark-Compact都会移动对象,自然地对象的基址也会改变,基于内存基址实现hashCode返回值就有可能在GC后变了。 我们还是假设就用对象内存基址做hashCode的返回值,这样通常也不会有什么问题,毕竟直接调用hashCode方法等场景少之又少。直到遇到以下场景 Object obj = new Object(); // allocated at 0x02 Map<Object, String> map = new HashMap<>(); // 16 slots map.put(obj, "a1"); /...