Java------HashSet

原创 2012年03月24日 23:43:17
android培训java培训、期待与您交流!
 
       看了视频关于HashSet的讲解。首先了解到了,在collection容器中有set和list接口,然后再Set下主要包括了HashSet;List包括了ArrayList和LinkedList;
       Set:中的元素呢不能有重复的。并且无序;
       List:它里面的元素可重复但是有序;
     在hashSet中,为了实现set中不能有重复的元素这个条件。引进了hashCode方法,这个方法效率比,把每一个拿出来进行比较要高很多。就说老师讲的,说如果现在在HashSet中有1000个元素,假设不用这个算法,那么在进行add的时候,就必须把里面的每个元素拿出来和要插入的进行比较,如果equals了那就不进行插入,否则一直进行下去等把10000个元素全部进行了一遍比较后都没有equals的就插入进去。但是这样的话,对于一个简单的插入操作的效率影响就太大了点。如果我们在插入的时候,把每一个元素的hashcode按照给定的要求计算出来后,在集合里把区域分段。在某一个范围内的我们就放在同一个区域内,这样在进行add方法的时候我们就只需要在这个区域内进行比较就可以了,不用在那么逐个比较了,效率上相应就提高了许多。
视频里讲解的代码中,把对象存进HashSet中,然后针对这个集合中对象在进行修改:
Collection c1 = new HashSet();  
ReflectPoint p1 = new ReflectPoint(3,3);
ReflectPoint p2 = new ReflectPoint(5,5);
ReflectPoint p3 = new ReflectPoint(3,3);
c.add(p1);
c.add(p2);
c.add(p3);
p1.y = 7;
c.remove(p1);
System.out.println(c.size());
        这里面ReflectPoint是自定义的类,里面的hashCode和equals方法已经重写了,都是根据两个参数进行变化的。
        这个代码运行的结果是2,老师在这里讲解的时候,说p1因为y的变化导致hashCode变化了,所以在c进行remove的时候其实已经找不到p1了,就说p1并没有remove掉。我开始有点疑惑,说怎么会这样,但是后来我就想了想,首先hashCode变化的时候是按照区域进行变化的,现在这个y变化了,那么就说这个p1就已经不再这个区域了,然而在进行remove的时候它是在原本的那个区域内进行remove的那么当然找不到真正的p1了,由此c并没有变化,所以是输出是2。归根结底是hashCode和集合的区域在里面作怪呢。
       再者在进行删除的时候按照remove方法的定义是说在集合中找和传进来的数据进行比较,这个比较利用equals方法,在一般应用的时候我们如果不复写Object的equals方法,那我们比较的时候就直接使用的是object的方法了。对于对象这样的比较,显然就比较蹩脚了,因此我们要复写这个方法,但是在复写这个方法的时候有必要把hashCode方法同样的复写。主要是有这样一个规定:两个object 如果 equals() 相等,他们的hashcode也相等;如果不一同复写,equals()比较两个对象相等,但hashcode是产生的不等,在使用集合类索引就会出问题。

android培训java培训、期待与您交流!

内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java------HashSet
举报原因:
原因补充:

(最多只允许输入30个字)