ArrayList和HashSet的异同:
1)ArrayList是一个有顺序的数组,每次放入其中的都是对象的引用,是可重复放入的。ArrayList就好像一个旅馆,一个人用他的名字可以定多个房间,他任何时候来都可以再定一个房间。
2)HashSet是一个集合,每次放入一个新的元素,都会对其进行检查对象是否存在,如果存在则不会放入。而HashSet就好像只有一个房间,多个床位,当来一个人来了,没有他的位置就分个床位给他,如果有,那他就不能再获得位置了。
3)那么HashSet如何判断这个元素是否存在呢?如果一个一个进行比较,元素个数少还好,但是一万个,也要一个一个比较吗?这样效率太低了,所以哈希算法由此而生。内存被分成了一个一个大致相当的区域,每一个区域有一个编号,当进行存放对象时,给每一个对象一个哈希码,对哈希码取余,获得的值就是内存区域的编号,而对象就放入这个空间中,那么当需要比较时,先从对象获得哈希码,然后计算出对象应该存放的内存区域,取出这个区域内的对象调用equals()方法进行比较,这样效率就极大的提高了,进行比较的操作就只会发生在一片区域内。但是这就需要保证不同对象的哈希值不一样,所以Object类中有一个获得哈希值的方法:hashCode()。
4)只有在hash集合中的存放对象时,hashCode方法才有用。只有类的实例对象要被采用哈希算法存储与检索时,这个类才被要求覆盖hashCode方法,但是为了将来的扩展性提供一个也没什么不好,通常hashCode方法与equals方法一同被覆盖。
5)当一个对象equals相等时,hashCode也必须相等。
6)如果一个对象被存储进hash集合后,不能修改参与hash计算的字段。否则,会造成内存泄露。
|
|