Java 集合的一些约定

equals

自反性(Reflexive):

对于非null的x来说,x.equals(x)必须返回true;

对称性(Symmetric):

对于非null的x和y来说,如果x.equals(y)为true,则y.equals(x)也必须为true;

传递性(Transitive):

对于非null的x、y和z来说,如果x.equals(y)为true,y.equals(z)也为true,那么x.equals(z)也必须为true;

一致性(Consistent):

对于非null的x和y来说,只要x和y状态不变,则x.equals(y)总是一致地返回true或者false;
对null的比较:
即x.equals(null)永远返回false。

hashCode

终生不变性
equals相同则hashCode必须相同
equals不同hashCode可以不同(为不相同的对象提供不同的hashCode可以显著提高哈希表的性能)

Comparable 排序

小于返回 -1;
大于返回1;
等于返回0;

它的坑:

  1. 自定义比较器的时候,严格按约定写,不要小于就写个其他的负数,比如比较int的时候,直接相减返回结果,这是会遇到溢出的问题的.
  2. 自定义的Comparable要尽量和equals保持一致,尤其是Set相关的集合中,
    比如SortedSet和SortedMap就是用比较器来做的唯一及排序判断,没有与equals保持一致,会出现对象消失的问题.
    再比如:User类中有id和年龄字段,要求根据年龄从小到达排序,比较器中不能只写年龄,还得加上id,不然相同年龄不同id的对象会被当作一样的对象去重,造成对象消失的问题.
  3. Comparator 有很多写好的比较器了,尽量用,不要自己写;

额外的: Comparator还有级联写法

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值