Set接口

目录

一、概述

二、特点

如何理解其两大特点

三、实现类

1.HashSet

LinkedHashSet

2.TreeSet


一、概述

        Set接口时Collection接口的子接口。set接口中没有定义新的方法,使用的都是collection接口中的方法。

二、特点

1.无序
2.不可重复

如何理解其两大特点

以hashset为例

1.无序性:无序性不等于随机性,存储的数据在底层数组中并非按照数组索引的顺序添加,而是数据的hashcode值来决定

2.不可重复:保证添加的元素,按照equals()判断时,不能返回true,即相同的元素只能添加一个

先hashset中添加元素a,首先会元素a所在类的hashcode,计算元素a的hash值,此时哈希值通过某种算法,计算出在hashset底层数组中存放的位置(即为索引位置),

判断数组此位置上是否有元素,如果没有元素,,则元素a添加成功

如果此位置上有其他元素B(或者以链表形式存在的多个元素),则比较a与存在元素的hash值

如果hash值不同,则元素a添加成功-------------->情况1

如果hash值相同,进而需要调用元素a所在类的equals方法,如果返回true,则a添加失败

​ 如果返回false,则添加成功------------>情况2

对于情况一,情况二,添加成功的元素则以链表的方式存储

三、实现类

1.HashSet

(HashSet是非线程安全的)

1.不能保证元素的顺序,元素是无序的

2.元素不可重复

3.HashSet是不同步的,需要外部保持线程之间的同步问题,Collections.synchronizedSet(new XXSet());

4.集合元素值允许为null

5.底层:jdk1.8以前:数组+链表,

           jdk1.8以后:数组+链表+红黑树

LinkedHashSet

        LinkedHashSet是HashSet的一个“扩展版本”,HashSet并不管什么顺序,不同的是LinkedHashSet会维护“插入顺序”。HashSet内部使用HashMap对象来存储它的元素,而LinkedHashSet内部使用LinkedHashMap对象来存储和处理它的元素。LinkedHashSet内部会维护插入顺序所以LinkedHashSet的遍历是按照插入顺序进行的。

2.TreeSet

TreeSet 是一个有序的集合,它的作用是提供有序的Set集合。

TreeSet是基于TreeMap实现的。TreeSet中的元素支持2种排序方式:自然排序(无参构造方法)(需要类来实现Comparable接口的CompareTo()方法)

或者 根据创建 TreeSet 提供的 Comparator(带参构造方法)(使用匿名内部类的形式传入一个Comparator实现对象) 进行排序。这取决于使用的构造方法。

TreeSet为基本操作(add、remove 和 contains)提供受保证的 log(n) 时间开销。

(TreeSet是非线程安全的)

上一篇:清华学长免费分享Java基础核心知识大总结(1)


下一篇:List 去重的 6 种方法