浅谈Java中Collection集合(2)
Set接口
set接口是Collection接口中的另一个分支。也是单列集合。
Set集合的特点:
- 不允许存储重复元素
- 没有索引,没有带索引的方法。
- 不能使用普通for循环进行遍历
Set继承了很多的接口。后文会提到!
哈希值
我们在深入学习Set集合中具体的HashSet集合和LinkedHashSet集合需要先学习一个哈希值的概念。
哈希值:是一个十进制的整数,由系统随机给出(就是对象的地址值,是逻辑上的地址值。不是实际存储数据的物理地址值)。
HashSet集合
HashSet集合是Set接口下的一个集合,属于单列集合。
HashSet集合的特点
- 不允许存储重复元素
- 没有索引,没有带索引的方法,不能使用普通for循环进行遍历。
- 是一个无序的集合。
- 允许存储Null值。
- HashSet集合底层是运用HashMap实现,从底层HashSet类中的构造方法中可以看出。
- HashSet集合底层的存储结构:
HashSet集合底层存储结构是哈希表,不同版本的哈希表构造不同。(算是对哈希表功能的完善)
- jdk1.8版本之前:哈希表 = 数组 + 链表
- jdk1.8版本之后:哈希表 = 数组 + 链表 / 红黑树(大大地提高了查询的效率)
- 哈希表构造变化的原因:
- 红黑树:1972年研究。
- jdk1.8版本:2013年推出。
jdk1.8版本之前对于数据操作量不是很大,所以仅仅数组+链表的结构可以满足需要。但是随着发展,发现数据量的增大,存储和取出的元素也随之增加,依靠之前的数组+链表不足以去适应当下社会的快节奏和处理庞大的数据量。于是,进行了改变,在jdk1.8版本后,哈希表由数组+链表变成了数组+链表/红黑树。当集合存储的数据哈希值相同时,对象不同的元素不超过两个时,还是使用数组+链表的结构,一旦超过,会转换为数组+红黑树的结构。来加快集合的查询和元素操作的效率。
HashSet不允许存储重复元素的原理:
涉及到两个方法:都是来自Object超类中的方法,HashCode和equals方法。
调用add方法添加元素时,会调用HashCode方法得出元素的哈希值,之后与集合中的哈希值进行比较
- 如果没有:把元素存储到集合中;
- 如果有,再此调用equals方法进行判断两个对象值是否相等。相等:存储失败;不相等:存储成功。
【注意】:Set集合不会存储相同的元素,因为Java的哪些引用类已经重写了hashCode和equals方法。当我们使用Set集合存储自定类的元素时,需重写hashCode和equals方法来保证Set集合不会存储相同的元素。
HashSet存储是无序的原理:
在存储的时候根据HashCode得到的哈希值进行存储,哈希值是一个随机的十进制整数值,所以存储的时候是无序的。进行取出元素的时候,也是根据哈希值进行查找,进行取出。所以也是无序的。
以上的观点是自己看法,谢谢查阅!