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