三 Set 接口
Set 是一种不包括重复元素的 Collection 它维持它自己的内部排序, 所以随机访问没有任何意义与 List 一样, 它同样运行 null 的存在但是仅有一个由于 Set 接口的特殊性, 所有传入 Set 集合中的元素都必须不同, 同时要注意任何可变对象, 如果在对集合中元素进行操作时, 导致 e1.equals(e2)==true, 则必定会产生某些问题实现了 Set 接口的集合有: EnumSetHashSetTreeSet
3.1EnumSet
是枚举的专用 Set 所有的元素都是枚举类型
3.2HashSet
HashSet 堪称查询速度最快的集合, 因为其内部是以 HashCode 来实现的它内部元素的顺序是由哈希码来决定的, 所以它不保证 set 的迭代顺序; 特别是它不保证该顺序恒久不变
HashSet 详解
对于 HashSet 而言, 它是基于 HashMap 来实现的, 底层采用 HashMap 来保存元素所以如果对 HashMap 比较熟悉, 那么 HashSet 是 so easy!!
一定义
HashSet 继承 AbstractSet 类, 实现 SetCloneableSerializable 接口其中 AbstractSet 提供 Set 接口的骨干实现, 从而最大限度地减少了实现此接口所需的工作 Set 接口是一种不包括重复元素的 Collection, 它维持它自己的内部排序, 所以随机访问没有任何意义
基本属性
构造函数
从构造函数中可以看出 HashSet 所有的构造都是构造出一个新的 HashMap, 其中最后一个构造函数, 为包访问权限是不对外公开, 仅仅只在使用 LinkedHashSet 时才会发生作用
二方法
既然 HashSet 是基于 HashMap, 那么对于 HashSet 而言, 其方法的实现过程是非常简单的
iterator()方法返回对此 set 中元素进行迭代的迭代器返回元素的顺序并不是特定的底层调用 HashMap 的 keySet 返回所有的 key, 这点反应了 HashSet 中的所有元素都是保存在 HashMap 的 key 中, value 则是使用的 PRESENT 对象, 该对象为 static final
size()返回此 set 中的元素的数量 (set 的容量) 底层调用 HashMap 的 size 方法, 返回 HashMap 容器的大小
isEmpty(), 判断 HashSet()集合是否为空, 为空返回 true, 否则返回 false
contains(), 判断某个元素是否存在于 HashSet()中, 存在返回 true, 否则返回 false 更加确切的讲应该是要满足这种关系才能返回 true:(o==null ? e==null : o.equals(e))底层调用 containsKey 判断 HashMap 的 key 值是否为空
add()如果此 set 中尚未包含指定元素, 则添加指定元素如果此 Set 没有包含满足(e==null ? e2==null : e.equals(e2)) 的 e2 时, 则将 e2 添加到 Set 中, 否则不添加且返回 false 由于底层使用 HashMap 的 put 方法将 key = e,value=PRESENT 构建成 key-value 键值对, 当此 e 存在于 HashMap 的 key 中, 则 value 将会覆盖原有 value, 但是 key 保持不变, 所以如果将一个已经存在的 e 元素添加中 HashSet 中, 新添加的元素是不会保存到 HashMap 中, 所以这就满足了 HashSet 中元素不会重复的特性
remove 如果指定元素存在于此 set 中, 则将其移除底层使用 HashMap 的 remove 方法删除指定的 Entry
clear 从此 set 中移除所有元素底层调用 HashMap 的 clear 方法清除所有的 Entry
clone 返回此 HashSet 实例的浅表副本: 并没有复制这些元素本身
后记:
由于 HashSet 底层使用了 HashMap 实现, 使其的实现过程变得非常简单, 如果你对 HashMap 比较了解, 那么 HashSet 简直是小菜一碟有两个方法对 HashMap 和 HashSet 而言是非常重要的, hashcode 和 equals
3.3TreeSet
基于 TreeMap, 生成一个总是处于排序状态的 set, 内部以 TreeMap 来实现它是使用元素的自然顺序对元素进行排序, 或者根据创建 Set 时提供的 Comparator 进行排序, 具体取决于使用的构造方法
TreeSet 详解
一 TreeSet 定义
我们知道 TreeMap 是一个有序的二叉树, 那么同理 TreeSet 同样也是一个有序的, 它的作用是提供有序的 Set 集合通过源码我们知道 TreeSet 基础 AbstractSet, 实现 NavigableSetCloneableSerializable 接口其中 AbstractSet 提供 Set 接口的骨干实现, 从而最大限度地减少了实现此接口所需的工作 NavigableSet 是扩展的 SortedSet, 具有了为给定搜索目标报告最接近匹配项的导航方法, 这就意味着它支持一系列的导航方法比如查找与指定目标最匹配项 Cloneable 支持克隆, Serializable 支持序列化
同时在 TreeSet 中定义了如下几个变量
其构造方法:
二 TreeSet 主要方法
1add: 将指定的元素添加到此 set(如果该元素尚未存在于 set 中)
2addAll: 将指定 collection 中的所有元素添加到此 set 中
3ceiling: 返回此 set 中大于等于给定元素的最小元素; 如果不存在这样的元素, 则返回 null
4clear: 移除此 set 中的所有元素
5clone: 返回 TreeSet 实例的浅表副本属于浅拷贝
6comparator: 返回对此 set 中的元素进行排序的比较器; 如果此 set 使用其元素的自然顺序, 则返回 null
7contains: 如果此 set 包含指定的元素, 则返回 true
8descendingIterator: 返回在此 set 元素上按降序进行迭代的迭代器
9descendingSet: 返回此 set 中所包含元素的逆序视图
10first: 返回此 set 中当前第一个 (最低) 元素
11floor: 返回此 set 中小于等于给定元素的最大元素; 如果不存在这样的元素, 则返回 null
12headSet: 返回此 set 的部分视图, 其元素严格小于 toElement
13higher: 返回此 set 中严格大于给定元素的最小元素; 如果不存在这样的元素, 则返回 null
14isEmpty: 如果此 set 不包含任何元素, 则返回 true
15iterator: 返回在此 set 中的元素上按升序进行迭代的迭代器
16last: 返回此 set 中当前最后一个 (最高) 元素
17lower: 返回此 set 中严格小于给定元素的最大元素; 如果不存在这样的元素, 则返回 null
18pollFirst: 获取并移除第一个 (最低) 元素; 如果此 set 为空, 则返回 null
19pollLast: 获取并移除最后一个 (最高) 元素; 如果此 set 为空, 则返回 null
20remove: 将指定的元素从 set 中移除(如果该元素存在于此 set 中)
21size: 返回 set 中的元素数(set 的容量)
22subSet: 返回此 set 的部分视图
23tailSet: 返回此 set 的部分视图
三最后
由于 TreeSet 是基于 TreeMap 实现的, 所以如果我们对 treeMap 有了一定的了解, 对 TreeSet 那是小菜一碟, 我们从 TreeSet 中的源码可以看出, 其实现过程非常简单, 几乎所有的方法实现全部都是基于 TreeMap 的
来源: http://www.92to.com/bangong/2018/02-15/33334065.html