一、Set接口

特点:

  1. 唯一
  2. 无序(相对List接口部分来说的,无序不等于随机)
  3. 没有索引相关的方法

遍历方式:

  1. 迭代器
  2. 增强 for 循环(底层还是 Itr 迭代器)

二、HashSet

1. HashSet的特点

  1. add方法添加 成功返回 true,失败则 false
  • 注意!对于自定义的数据类型没有 唯一,无序效果。
  • 只有系统给的类型,才符合特点。
  • 为什么呢?????

2. HashSet的简要原理

HashSet需要根据 hashCode 计算 哈希值,然后使用 equals 比较,放在底层数组中,处理哈希冲突的方法是链地址。
所以 哈希表 = 数组 + 链表

所以为什么 我们 自定义的类 使用HashSet装的时候不能 无序、不重复 知道了吧。

因为没有重新写 hashCode 和 equals 方法。
没有哈希值,又不能比较,怎么做到无序,没法,所以自定义的类才不能 无序、不重复

3. 问题

1.数组的长度是多少。
2.数组的类型是什么?
3.hashCode,equals方法真的调用了吗?验证
4.底层表达式是什么?
5.同一个位置的数据 向前放 还是 向后放?
6.放入数组中的数据,是直接放的吗?是否封装为对象了?

4. 实现原理

底层就是一个HashMap

public class HashSet<E>{//重要属性:private transient HashMap<E,Object> map;private static final Object PRESENT = new Object();//构造器:public HashSet() {map = new HashMap<>();//HashSet底层就是利用HashMap来完成的}public boolean add(E e) {return map.put(e, PRESENT)==null;}
}

三、LinkedHashSet的使用

特点:

  1. 唯一
  2. 有序(按照输入顺序进行输出 )

其实就是在HashSet的基础上,多了一个总的链表,这个总链表将放入的元素串在一起,方便有序的遍历。

四、TreeSet的使用

特点:

  1. 唯一
  2. 有序(升序)

底层逻辑结构 : 二叉树
二叉树底层是按中序遍历,所以结果是升序。

系统提供的类型都重写了compare方法,如果自定义类型也想排序存储,需要重写compare比较器接口。

默认TreeSet会使用内部比较器, 自定义类重写 compare方法

public class Student implements Comparable<Student> {private int age;private String name;// get / set / 构造方法省略@Overridepublic String toString() {return "Student{" +"age=" + age +", name='" + name + '\'' +'}';}@Overridepublic int compareTo(Student o) {return this.getAge()-o.getAge();}
}public class Test03 {//这是main方法,程序的入口public static void main(String[] args) {//创建一个TreeSet:TreeSet<Student> ts = new TreeSet<>();ts.add(new Student(10,"elili"));ts.add(new Student(8,"blili"));ts.add(new Student(4,"alili"));ts.add(new Student(9,"elili"));ts.add(new Student(10,"flili"));ts.add(new Student(1,"dlili"));System.out.println(ts.size());System.out.println(ts);}
}

一旦指定外部比较器,那么就会按照外部比较器来比较。比较器类 实现 Comparator 接口,重写 compare 方法。在 TreeSet 的构造方法中传入 比较器对象。

public class Student  {private int age;private String name;// get / set / 构造方法省略 @Overridepublic String toString() {return "Student{" +"age=" + age +", name='" + name + '\'' +'}';}
}
class BiJiao implements Comparator<Student>{@Overridepublic int compare(Student o1, Student o2) {return o1.getName().compareTo(o2.getName());}
}public class Test03 {//这是main方法,程序的入口public static void main(String[] args) {//创建一个TreeSet://利用外部比较器,必须自己制定:Comparator<Student> com = new BiJiao();TreeSet<Student> ts = new TreeSet<>(com);//一旦指定外部比较器,那么就会按照外部比较器来比较ts.add(new Student(10,"elili"));ts.add(new Student(8,"blili"));ts.add(new Student(4,"alili"));ts.add(new Student(9,"elili"));ts.add(new Student(10,"flili"));ts.add(new Student(1,"dlili"));System.out.println(ts.size());System.out.println(ts);}
}

实际开发中多用外部比较器,接口比类扩展性好。

TreeSet源码

底层就是 TreeMap,值也是 PRESENT对象present,是个Object对象


public class TreeSet<E> extends AbstractSet<E>implements NavigableSet<E>, Cloneable, java.io.Serializable{//重要属性:private transient NavigableMap<E,Object> m;private static final Object PRESENT = new Object();//在调用空构造器的时候,底层创建了一个TreeMappublic TreeSet() {this(new TreeMap<E,Object>());}TreeSet(NavigableMap<E,Object> m) {this.m = m;}public boolean add(E e) {return m.put(e, PRESENT)==null;}}

集合深度学习07—Set、HashSet、LinkedHashSet、TreeSet、 底层原理 源码解析相关推荐

  1. 【深度学习实战03】——YOLO tensorflow运行及源码解析

    本文章是深度学习实战系列第三讲文章,以运行代码+源码分析 为主: 转载请注明引用自:https://blog.csdn.net/c20081052/article/details/80260726 首 ...

  2. 深度学习大模型训练--分布式 deepspeed PipeLine Parallelism 源码解析

    deepspeed PipeLine Parallelism 源码解析 basic concept PipeDream abstract 1F1B 4 steps Code comprehension ...

  3. 基于深度学习的恶意样本行为检测(含源码) ----采用CNN深度学习算法对Cuckoo沙箱的动态行为日志进行检测和分类...

    from:http://www.freebuf.com/articles/system/182566.html 0×01 前言 目前的恶意样本检测方法可以分为两大类:静态检测和动态检测.静态检测是指并 ...

  4. 一文看尽深度学习中的20种卷积(附源码整理和论文解读)

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 引言 卷积,是卷积神经网络中最重要的组件之一.不同的卷积结构有着不一样的功能,但本质上都是用于提取特征 ...

  5. 52 个深度学习目标检测模型汇总,论文、源码一应俱全!(附链接)

    来源:AI有道 本文约2000字,建议阅读5分钟 本文给你总结52个深度学习检测模型. 标签:计算机视觉 目标检测作为计算机视觉中的一个重要分支,近些年来随着神经网络理论研究的深入和硬件 GPU 算力 ...

  6. 最全深度学习训练过程可视化工具(附github源码)

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 Datawhale干货 作者:Edison_G,来源:计算机视觉研究院 编辑丨极市平台 ...

  7. 52 个深度学习目标检测模型汇总,论文、源码一应俱全

    本文约2000字,建议阅读5分钟 本文给你总结52个深度学习检测模型. 标签:计算机视觉 目标检测作为计算机视觉中的一个重要分支,近些年来随着神经网络理论研究的深入和硬件 GPU 算力的大幅度提升,一 ...

  8. 目前最全:52 个深度学习目标检测模型汇总,论文、源码一应俱全!

    文章来源:https://zhuanlan.zhihu.com/p/115035951 作者:红色石头 目标检测作为计算机视觉中的一个重要分支,近些年来随着神经网络理论研究的深入和硬件 GPU 算力的 ...

  9. 的训练过程_最全深度学习训练过程可视化工具(附github源码)

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 Datawhale干货 作者:Edison_G,来源:计算机视觉研究院编辑丨极市平台. ...

最新文章

  1. 简单探讨JavaScript 与 TypeScript之间的联系
  2. puppet原理及配置
  3. Android自定义Shape
  4. 需求: 计算一下你来到这个世界多少天 拓展:改成 生日是键盘录入的 而且可以循环录入 直到录入 exit 结束循环
  5. 单词替换(信息学奥赛一本通-T1406)
  6. 内涝预测过程的噪音_第七章噪声解析
  7. hive内置函数_Hive Query生命周期 —— 钩子(Hook)函数篇
  8. MATLAB 如何使用pascal函数创建Pascal(帕斯卡)矩阵
  9. vax关于js方面的一些设置
  10. 怎样解题 --解题表(how to solve it)
  11. STC8H8K64U单片机学习-1-芯片功能介绍
  12. proteus常用元器件名称
  13. Accessibility辅助功能的使用
  14. opencv 4.5.5 imread 失败(报错)的处理方式
  15. 奥城大学计算机专业,研究生美国留学双录取院校汇总
  16. SpringBoot+Vue打造资产出入库管理系统
  17. html基本标记练习钱塘湖春行,实验1HTML基本标记的练习.doc
  18. 收藏篇:请学习本文的排名靠前大法,如何编写一篇高质量的技术博文
  19. 【渝粤教育】电大中专品牌管理与推广_1作业 题库
  20. cdma2000解析_LTE和CDMA2000互操作方案分析

热门文章

  1. APEX V2.0 - ANGULAR 5+ BOOTSTRAP 4 HTML ADMIN TEMPLATE启动报错解决办法
  2. try 与catch的作用
  3. UnboundLocalError: local variable 'end_page' referenced before assignment
  4. 剑三 服务器维护 终止跟宠cd,剑三宠物cd监控已进cd什么意思 | 手游网游页游攻略大全...
  5. android 桌面插件 语录,一句话心情语录app
  6. 中国计算机安全评测,等保2.0 Windows主机测评
  7. accdb原有的数据怎么清除_数据库存储(database storage)
  8. 如何在百度搜索结果中屏蔽不显示某些指定垃圾网站?
  9. 省市县街道村五级联动
  10. win10 “你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问。解决方案(实测有效)