HashCode()的作用
在实现Hash算法的集合里面,例如HashSet,该集合不能存放相同的数据,HashSet会根据对象的equals()和hashCode()方法来判断要存放的数据是否已经存在。Hash算法把HashSet划分成多个区域,每个区域就是以哈希码来作为该区域的唯一编码,而hashCode()的作用就是为某对象生成一个哈希码。Hash算法会认为如果两个对象的equals()比较后相等,那么它所对应的hashCode也应该相等,那么HashSet会从该哈希码所对应的那个区域来查找是否已经存在该对象数据,不存在则放进去。而如果只提供equals方法,不提供hashCode()方法,就算判断出两个对象引用相等,但是HashSet会在不同的区域下寻找是否有该对象,这样,HashSet会把相同的对象引用存放在两个不同的区域里面。注意:只有实现了Hash算法的集合hashCode才起作用。
例如:Set set = new HashSet();ReflectPoint rp = new ReflectPoint(3,4);//测试对象,根据其x,y属性来算出hashCodeset.add(rp);如果现在不需要rp数据了,想从内存中删除掉该对象引用,可以用set.remove(rp);此时可以清理出内存空间。但是如果修改了hashCode生成的x,y属性:rp.x = 66;此时调用set.remove(rp);,则无法删除该对象引用,因为改变了x属性的值,其hashCode也会改变,假如本来rp对象存放在A区域里面,hashCode一变,此时set.remove(rp)会从改变后的hashCode所对应的那个区域下寻找是否存在rp对象,存在就删除,而此时并不能找到,则不能删除掉,rp对象引用还会存放在内存中,占用内存空间,不被释放,造成内存的泄露。建议:不要轻易修改用于生成hashCode的属性。
posted on 2013-10-11 18:00 heartstage 阅读(250) 评论(0) 编辑 收藏 举报