2.1:hashCode方法与HashSet类基本的描述 其实引入哈希算法,就为了进行简化查找;提高查找的效率。此方法应用于集合当中。将集合分成若干个存储区域,每个对象可以计算出一个哈希码,可以将哈希码进行分组,每个组对应某个存储区域,根据一个对象的哈希吗就可以确定对象应该存储在哪个区域 HashSet就是采用哈希算法进行存取对象的集合,它内部就是采用对某个数字n进行取余的方式对哈希码进行分组和划分对象的存储区域。Obejct类中定义了一个hashCode()方法来返回每个java对象的哈希码,当从HashSet集合中查找某个对象时,java系统首先调用对象的hashCode()方法获得该对象的哈希码,然后根据哈希码找到对应的存储区域,最后取出该存储区域中的每个元素与该对象进行equals进行比较,不用遍历集合中所有的元素,就可以得到结论; 应用于HashSet类中插入,查找,删除,修改; 注意: 1:只有类的实例对象要被采用哈希算法进行存储和检索时,这个类才需要按要求进行覆盖hashCode方法,及时程序可能暂时不会用到当前了类的hashCode方法,但是为其提供了一个hashCode方法也不是个坏事,所以通常要求进行复写对象中hashCode和equals方法; 2:通常来说,一个类的两个实例对象用equals方法比较结果相等时,他们的哈希码也必须相等,但反之不成立,即:equals方法比较不相等的实例但是可以有相同的哈希码,或者可以说哈希码相同的两个对象的equals方法可以不相等。例如字符串”BB”和“Aa”的equals方法比较结果肯定不相等,但是hashCode方法返回的值却相等; 3:当一个对象被存储到hashSet集合中以后,就不能修改这个对象中参与计算哈希值的字段了,否则。对象修改后的哈希值与最初存储进HashSet集合中的哈希值就不同了。在这种情况下,即使在cotains方法中使用该对象的当前引用作为参数去HashSet集合中检索对象,也将返回找不到对象的结果。这也会导致无法从HashSet集合中单独删除当前的对象,造成内存的泄露。 代码: Collection collections=new HashSet(); ReflectPoint pt1=new ReflectPoint(3,3); //System.out.println(pt1.hashCode()); ReflectPoint pt2=new ReflectPoint(3,3); //System.out.println(pt2.hashCode()); ReflectPoint pt3=new ReflectPoint(5,5); //System.out.println(pt3.hashCode()); ReflectPoint pt4=new ReflectPoint(6,6); //System.out.println(pt4.hashCode()); collections.add(pt1); collections.add(pt2); collections.add(pt3); collections.add(pt4); collections.add(pt1); 解析: 如果ReflectPoint 类中复写hashCode和equals方法,那么进行插入时就会先判断hashCode值,如果相等,就继续判断equals方法,是否相等,如果相等,就不进行插入值,如果不能,就插入。 //pt1.y=6; //collections.remove(pt1); 解析: 如果在该元素成功插入HashSet集合中,如果其过程中进行修改了该元素参与运算hashCode的元素的字段的值,那么导致最后进行删除该引用的值时,就删除不掉了,因为hashCode值变化了; A� 32(5����ont-weight:bold; font-size:10.5000pt; font-family:'Consolas'; " >
|