Set 不重复实现原理
来源:互联网 发布:初中生编程培训 编辑:程序博客网 时间:2024/06/17 23:45
Java中的set是一个不包含重复元素的集合,确切地说,是不包含e1.equals(e2)的元素对。Set中允许添加null。Set不能保证集合里元素的顺序。
在往set中添加元素时,如果指定元素不存在,则添加成功。也就是说,如果set中不存在(e==null ? e1==null : e.queals(e1))的元素e1,则e1能添加到set中。
下面以set的一个实现类HashSet为例,简单介绍一下set不重复实现的原理:
s1.equals(s2):true
s3.equals(s4):false
set size:3
oliver.examination.part1.HashSetTest$MyString@4f1d0d
a
oliver.examination.part1.HashSetTest$MyString@1fc4bec
也许你已经看出关键来了,没错就是equals方法。这么说还是不恰当,准确的说应该是equals和hashcode方法。
java.lnag.Object中对hashCode的约定:
1. 在一个应用程序执行期间,如果一个对象的equals方法做比较所用到的信息没有被修改的话,则对该对象调用hashCode方法多次,它必须始终如一地返回同一个整数。
2. 如果两个对象根据equals(Object o)方法是相等的,则调用这两个对象中任一对象的hashCode方法必须产生相同的整数结果。
3. 如果两个对象根据equals(Object o)方法是不相等的,则调用这两个对象中任一个对象的hashCode方法,不要求产生不同的整数结果。但如果能不同,则可能提高散列表的性能。
根据第一条,s1和s2返回的hashcode值是一样的。
在HashSet中,基本的操作都是有HashMap底层实现的,因为HashSet底层是用HashMap存储数据的。当向HashSet中添加元素的时候,首先计算元素的hashcode值,然后用这个(元素的hashcode)%(HashMap集合的大小)+1计算出这个元素的存储位置,如果这个位置位空,就将元素添加进去;如果不为空,则用equals方法比较元素是否相等,相等就不添加,否则找一个空位添加。
会后,附赠HashSet源码中文注释版,摘自javaeye:http://xifangyuhui.javaeye.com/blog/798796
- Set 不重复实现原理
- Set 不重复实现原理
- Set 不重复实现原理
- Set集合实现元素不重复原理
- Java集合类补充—Set中实现元素不重复的原理
- Java中的Set集合接口实现插入对象不重复的原理
- Java中的Set集合接口实现插入对象不重复的原理
- Set不重复原因
- Set 怎么保证不重复
- Set实现没有重复元素
- 实现随机数不重复
- 重写javascript的Array.prototype.push方法实现类似java.util.set添加不重复元素
- 【BZOJ2761】[JLOI2011]不重复数字 STL set
- BZoj 2761: [JLOI2011]不重复数字 (set
- HashSet类是如何实现添加元素保证不重复的---哈希码的原理
- mysql主主同步两个数据库同时写入,实现原理:自动增长主键不重复
- mysql主主同步两个数据库同时写入,实现原理:自动增长主键不重复
- mysql主主同步两个数据库同时写入,实现原理:自动增长主键不重复
- ActiveMQ入门实例
- 输出今天的日期,以YYYY-MM-DD的方式,比如今天是2017年7月29日,则输出2017-07-29
- Android_Manager:PackageManager
- Path Sum
- HDU 6035 Colorful Tree(树形DP)
- Set 不重复实现原理
- 详述获取字节码文件及其内容的方法
- LintCode python 小白-简单题-22平面列表
- poj 3683 2SAT入门+挑战模板
- 《Drools7.0.0.Final规则引擎教程》第4章 4.4 LHS简介&Pattern
- 冒泡排序、插入排序和选择排序
- 百度、腾讯和阿里内部的级别和薪资待遇是什么样的?
- 高并发的核心技术-幂等的实现方案
- 原生js实现检测对象变化