首先equals完全等价于==
(不过equals也有可能被复写。如果你要自己复写的话,一定要注意满足他的几条性质。)
hashcode是怎么来的
他的内存地址是16进制的,转化成10进制你会发现值刚好等于hashcode。不信可以这样测试一下
Object ll = new Object();
Log.i(TAG, ll + "");
Log.i(TAG, ll.hashCode() + "");
为什么重写equals还要重写hashcode?
语义问题。比如两个String,明明字符串相等,但是由于内存区域不一样,==就会返回false。所以重写了equals,定义了新的语义——String的时候通过判断值来判断相等,因为他是基本数据类型。但是一个Object的标识语义由两个控制,一个是equals,另一个则是hashcode了。我们希望他们的语义是一致的。如果仅仅复写了equals,那么就会出现语义的分歧。
但是hashcode却是可以一样的(一定程度上)
比如hashmap,虽然他是通过位运算截取hashcode最后几位从而造成的一致——所以hashcode一致是被允许的,但是我们应该意识到,如果hashcode不一样,可以降低hash表的冲突,增加hash表的利用效率,提升hash表的性能
hashmap中String只重写equals不重写hashcode会发生什么?
如果只重写了equals,不重写hashcode,比如String作为key,这样一来,你会发现,明明是一样的字符,hashcode不一样,放的
位置也不一样。此外,当你取的时候,你的String的hashcode又和之前的String不一样了!所以你取到的绝壁是空值!