概述
文章目录
- 简介
- 一、HashSet添加元素过程
- 二、LinkedHashSet
- 三、TreeSet
简介
Set接口:存储无序的,不可重复的数据。
1. 无序性:不等于随机性。存储的数据在底层中并非按照索引顺序添加,而是根据数据的哈希值决定
2. 不可重复性:保证添加的元素,先判断hashCode(),再判断equals(),返回都为true,则为重复数据
- HashSet:Set接口主要实现类;线程不安全。
- LinkedHashSet:作为HashSet的子类;遍历其内部数据时,可以按照添加的顺序遍历。
- TreeSet:可以按照添加对象的指定属性,进行排序
一、HashSet添加元素过程
如图所示:
- HashSet底层为数组,初始化为容量为16。
- 添加元素a1,首先调用a1所在类的hashCode()方法,计算a1元素的哈希值。
- 接着此哈希值通过某种算法(这里12长度数组可以理解为取12的模)计算出a1在数组中的位置。
- 如果此位置上没有其他元素,则a1元素添加成功。(a1、a2、a3以此方式添加随机位置成功)
- 如果此位置上有其他元素,如添加a4时,则比较a3和a4的hash值。(取模相同,哈希值不一定相同)
①如果hash值不相同,则肯定不是相同对象,添加成功。
②如果hash相同,则比较a4和a5的的equals()方法,返回false,添加成功。 - 5中添加成功的方式,如图会以单向链表的方式存储
①jdk 7:新添加的元素放到数组中,指向原来的元素。
②jdk 8:新添加的元素会添加到链表的末端。
hashCode方法:
- object的hashCode方法可以理解为对象地址通过一定计算得到的一个数值。
- 重新hashCode,每个属性的值的hash值*31相加的和。
- 向set中添加数据,其所在类一定要重写hashCode()和equals()。
- 重写的hashCode()和equals()尽可能保持一致性,相等对象必须具有相等的散列值。
二、LinkedHashSet
- 存储过程底层原理和hashset一样。但是在添加数据的同时,每个数据前后还维护了两个指针,记录前一个数据和后一个数据。
- 对于频繁的遍历操作,LinkedHashSet效率高于HashSet。
- 因此《集合有序性》不能描述为遍历顺序和添加顺序一致。
三、TreeSet
- 向TreeSet中添加的数据,要求是相同类的对象。
- 两种排序方式:自然排序(实现Comparable 接口) 和 定制排序 (Comparator)
①自然排序中,比较两个对象是否相同的标准:重写compareTo()返回0。不再是equals()。
②自然排序中,比较两个对象是否相同的标准:比较器compare()返回0。不再是equals()。
最后
以上就是有魅力玉米为你收集整理的浅谈Set源码的全部内容,希望文章能够帮你解决浅谈Set源码所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复