java学习==、equals、compareTo和Map的实现原理

== 是比较堆区地址
equals:
- 每一个简单类都有继承了Object类的equals方法,实现:只是简单的return (this == obj);
- java工具类Objects有一个equals(Object a, Object b)方法,实现:return (a == b) || (a != null && a.equals(b)); 追加了a,b为空的情况

重写equals()的规范
需要注意的是,在Java规范中,它对equals()方法的使用必须要遵循如下几个规则:

1、自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
2、对称性:对于任何非空引用值 x 和 y,当且仅当y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
3、传递性:对于任何非空引用值 x、y 和z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
4、一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回false,前提是对象上 equals 比较中所用的信息没有被修改
5、对于任何非空引用值 x,x.equals(null) 都应返回false。

compareTo方法,一般都是实现comparable接口,重写它的方法。重写中判断的方式一般是先判断两个地址是否相同即==,然后再判断hashcode快速定位两个对象在散列存储结构中位置相同,最后再仔细判断其内容是否相同(如果是int直接==,如果是string,会先转成字符数组逐个比较)

map的put和get原理。map可以看成就是一个数组,每个数组元素都是一个链表。首先将k,v封装成node对象中作为map的基本元素。

  1. 当put一个node对象时,会调用k的hashCode()方法算出hash值,然后通过哈希表函数/哈希算法,将hash值转成数组下标,下标位置上的链表如果没有任何值就放到链表中;如果链表中有值,就会将k和链表上每个节点的k进行equals,如果equals都是false,就加进去,如果equals有true就覆盖。
  2. 当get一个node对象时同理,先用k算出下标,再和链表上每个k进行equals,true就返回,都是false就返回null
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值