IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> JavaSE Set集合 -> 正文阅读

[数据结构与算法]JavaSE Set集合

JavaSE Set集合


目录


Set 集合是什么?有什么用?

Set 集合类似于一个罐子,对于加入集合的元素,集合通常不能记住元素的添加顺序。

Set 集合与 Collection 集合基本相同,没有提供任何额外的方法。不同在于,Set 集合不允许包含重复元素。

Set 集合和 Map 集合关系密切,HashSet 底层是 HashMap,LinkedHashSet 底层是 LinkedHashMap,TreeSet 底层是 TreeMap。

返回目录


Set 集合怎么用?

1 Set 集合的继承图(常用部分)

在这里插入图片描述

返回目录


2 Set 接口

Set 接口是 Collection 接口的子接口,没有提供任何额外的方法。

public interface Set<E> extends Collection<E> {
	...
    // 增:向集合中添加元素
    boolean add(E e);
    boolean addAll(Collection<? extends E> c);
    
    // 删:从集合中删除指定的元素
    boolean remove(Object o);
    boolean removeAll(Collection<?> c);
    void clear();
    // 从当前集合中,删除集合c不包含的元素。相当于留下当前集合和集合c的交集。
    boolean retainAll(Collection<?> c);
    
    // 查:判断集合是否包含指定的元素
    boolean contains(Object o);
    boolean containsAll(Collection<?> c);

    // 返回集合中元素的数量
    int size();

    // 判断集合是否为空
    boolean isEmpty();
    ...
}

返回目录


3 HashSet 类

  • 3-1 介绍

    HashSet 类实现了 Set 接口。HashSet 的底层是 HashMap。

    HashSet 是线程不安全的。

    HashSet 的元素可以为 null,但是只能有一个。

    HashSet 不能保证元素的顺序。

    HashSet 根据元素的 hashCode,将其添加到数组的特定位置上。通过 equals 方法判断两个元素是否相等。

返回目录

  • 3-2 底层结构

    HashSet 的底层是 HashMap。HashSet 的元素保存在 key 上,value 上用一个空值 PRESENT 占位。

    (1)HashMap 底层是数组+链表的数据结构。

    数组是 Node[] table,数组的每个位置上,存放着 Node 节点,该节点可以指向下一个 Node节点,从而形成链表。

    (2)k-v 包装在 Node 类中,该类是 HashMap 的内部类。

public class HashSet<E>...{
    ...
    // HashMap
    private transient HashMap<E,Object> map;
	// 占位的空值
    private static final Object PRESENT = new Object();
    
    // 无参构造器
    public HashSet() {
        map = new HashMap<>();
    }
    // 有参构造器,自定义容量
    public HashSet(int initialCapacity) {
        map = new HashMap<>(initialCapacity);
    }
    // 有参构造器,自定义容量、负载因子
    public HashSet(int initialCapacity, float loadFactor) {
        map = new HashMap<>(initialCapacity, loadFactor);
    }
    ...
}

返回目录

  • 3-3 扩容机制

    与 HashMap 的扩容机制一样。

public class HashSet<E>...{
    ...
    // HashMap
    private transient HashMap<E,Object> map;
	// 占位的空值
    private static final Object PRESENT = new Object();

    // 添加元素
    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }
    ...
}

返回目录

  • 3-4 常用方法

    移步 Set 接口。

返回目录


4 LinkedHashSet 类

  • 4-1 介绍

    LinkedHashSet 是 HasSeth 的子类。LinkedHashSet 底层是 LinkedHashMap。

    HashSet 是无序的,即它不能保证元素的迭代顺序和插入顺序一致。

    而 LinkedHashSet 可以保证元素的迭代顺序和插入顺序一致。

返回目录

  • 4-2 底层结构

    LinkedHashSet 底层是 LinkedHashMap。

public class LinkedHashSet<E> extends HashSet<E>...{
    ...   
    // 无参构造器
    public LinkedHashSet() {
        super(16, .75f, true);
    }
    // 有参构造器,自定义容量
    public LinkedHashSet(int initialCapacity) {
        super(initialCapacity, .75f, true);
    }
    // 有参构造器,自定义容量,负载因子
    public LinkedHashSet(int initialCapacity, float loadFactor) {
        super(initialCapacity, loadFactor, true);
    }
    ...
}
public class HashSet<E>...{
    ...
    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<>(initialCapacity, loadFactor);
    }
    
    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<>(initialCapacity, loadFactor);
    }
    
    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<>(initialCapacity, loadFactor);
    }
    ...
}

返回目录

  • 4-3 扩容机制

    和 LinkedHashMap 一样。

返回目录

  • 4-4 常用方法

    移步 Set 接口。

返回目录


5 TreeSet 类

  • 5-1 介绍

    TreeSet 类实现了 Set 接口。TreeSet的底层是 TreeMap。

    TreeSet 可以保证所有的元素处于有序状态。

返回目录

  • 5-2 底层结构

    TreeSet 底层是 TreeMap。

public class TreeSet<E>...{
    ...
    // TreeMap 类实现了 NavigableMap 接口
    private transient NavigableMap<E,Object> m;
	// 占位空值
    private static final Object PRESENT = new Object();
    
    // 无参构造器
    public TreeSet() {
        this(new TreeMap<E,Object>());
    }
    // 有参构造器,传入比较器
    public TreeSet(Comparator<? super E> comparator) {
        this(new TreeMap<>(comparator));
    }
    ...
}

返回目录

  • 5-3 常用方法

    移步 Set 接口。

返回目录


6 不同 Set 集合的使用场景

HashSet:允许元素无序时使用。

LinkedhashSet:需要元素的取出顺序和插入顺序一致时使用。

TreeSet:需要对元素进行排序时使用。

返回目录


  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-12-07 12:17:52  更:2021-12-07 12:19:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 14:30:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码