equals、hashcode(内存地址)

首先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不一样了!所以你取到的绝壁是空值!

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值