Java中的Set与hashCode
2016-05-11 21:00
357 查看
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不同,它们很可能存储在了不同的区域上,这样它们就永远不可能相等了。
这就是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不同,它们很可能存储在了不同的区域上,这样它们就永远不可能相等了。
相关文章推荐
- JAVA004--3种循环对比,for;while;do{}while
- java 中static final用法
- 二叉树的Java实现
- 最长递增子序列
- 深入理解Java:注解(Annotation)基本概念
- JAVA学习笔记(二)-运算符、选择语句、循环语句
- java线程深度解析(五)——并发模型(生产者-消费者)
- 解决Setting property 'source' to 'org.eclipse.jst.jee.server的问题
- Java基础知识总结
- Java中abstract class和interface的区别
- 4种方法让SpringMVC接收多个对象
- Java语言简介及第一个程序
- [团队项目] Scrum 项目 3.0 SCRUM 流程的步骤2: Spring 计划
- Java编程思想第四版第五章学习(3)
- 生产者消费者模式的一种java实现
- javaweb一些其他内容
- intelj idea cucumber java搭建教程
- [Spring MVC] - SpringMVC的各种参数绑定方式
- java学习笔记(十六)
- 从源码理解Hashtable.java