Java中的Set与hashCode

来源:互联网 发布:软件测试平台搭建 编辑:程序博客网 时间:2024/05/17 08:59

Java中的集合(Collection)有两类,一类是List,再有一类是Set。你知道它们的区别吗?前者集合内的元素是有序的,元素可以重复;后者元素无序,但元素不可重复。那么这里就有一个比较严重的问题了:要想保证元素不重复,可两个元素是否重复应该依据什么来判断呢?
这就是Object.equals方法了。但是,如果每增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的次数就非常多了。也就是说,如果集合中现在已经有1000个元素,那么第1001个元素加入集合时,它就要调用1000次equals方法。这显然会大大降低效率。于是,Java采用了哈希表的原理。哈希(Hash)实际上是个人名,由于他提出一哈希算法的概念,所以就以他的名字命名了。


由于Set中的元素是不可重复的,在每次向一个Set中插入新的元素时,如果没有hashCode,就需要遍历整个集合检查是否已经存在该元素。这样会使Set的效率非常低下。

使用哈希算法可以提高从元素集合中查找一个元素的效率。根据集合元素的hashCode来将元素划分成几组,每一组对应一块存储区域。根据元素的hashCode可以找到该元素的存储区域。


首先我们必须保证如果两个元素相同(equals),它们的hashCode必定相同。

向一个Set集合插入新元素时,要通过元素的hashCode来确定这个元素存放的位置。如果这个位置上没有元素,就直接存储在这个位置上,否则就散列到其他地址。

因此在插入新元素时,我们只需与根据hashCode找到的存储区域中的元素进行对比。这样提高了Set插入元素的效率。


我们在重写对象的equals方法时,必须重写hashCode。

不使用Set的时候,大部分情况下我们并不需要关注hashCode。但是我们没有理由不去重写它。

因为如果使用到了Set,在使用equals方法时,我们是使用hashCode来找到对应的存储区域,然后再存储区域中查找和对比。如果两个元素的hashCode不同,它们很可能存储在了不同的区域上,这样它们就永远不可能相等了。

0 0
原创粉丝点击