集合之equals与hashCode方法
一 equals
equals方法是Object级的,默认对比两个对象的内存地址,很多类都重写了该方法,对比对象的实际内容,一般对比同一类对象相同属性的属性值是否相同。
二 hashCode
1.哈希表
哈希表是一个数组,数组中的每一个元素都是一个单向链表,同一单向链表中的节点具有相同的属性,属性值是数组的下标,这个相同的属性被称作hashCode哈希值。
2.hashCode哈希值的作用与意义
在hashCode产生前,检索集合需要逐个对比,查询效率低。如果根据某一属性将集合中属性值相同的元素分为一组,集中存储,查询时先获取查询对象该属性的值,依据该值定位到对应的组别,大大缩小了查询范围,提高了查询效率,这就是hashCode产生的背景。
两个对象的hashCode相等,只是表明两者在同一组别中,不能保证一定相同,还要对比两个对象的内存地址或者通过equals方法对比具体内容,只有该项满足以后,才能确定两个对象相同。
由上可知,在哈希表中,相同的两个对象必定具有相同的哈希值。
3.hashCode()方法
hashCode()方法是Object级的,默认基于对象的内存地址生成一个int数值,该数值与内存地址一对一对应,由于通过equals确认相同的两个对象只是保证相同属性的属性值相同,在不重写hashCode的情况下,哈希值不同,存放到哈希表中时被当两个不同内容的对象处理,导致哈希表中出现内容相同的两个元素,占用不必要的内存,因此一旦重写了equals方法,必须重写hashCode方法,并且确保相同的对象具有相等的值。
三 应用
哈希值主要应用于哈希表,HashMap与HashSet的底层是哈希表,因此要想将一个对象存放到HashMap或者HashSet中,必须重写该类中的equals与hashCode两个方法,并使得相同的对象具有相等的哈希值。
不能仅仅停滞在实现上,应该去追求代价更小、性能更优的实现