set接口和实现类

简介: set

Set 特性: 相对于 List

1.    无序的;
2.    唯一的;
3.    无索引的;      没有 get方法

无序的,唯一的,都有特殊解释;
无序:    有的实现类无序,有的实现类有序,有的是实现按照自然顺序;
唯一:    有具体的协定,满足了协定要求才是真的唯一;
协定要求的内容: 有些set 不遵守这个 协定 有自己的协定;
如果有重复的元素,那么就拒绝添加;
经过测试,和 == 没有关系;
hashcode  和  equals 相互作用;

先 hash后equals原因 hash是基本数据,判断 == 效率比 hash 好很多!

重复的元素:
        hashcode
        equals    
        在每次添加元素的时候,都会先计算要添加的元素的hashcode值;
        如果有相等 hashcode 值,代表元素有可能相等,然后再去 equals 得到最终的结束(添加 或者 拒绝);
        如果没有像等的 hashcode 值,那么直接添加;

结论: 自定义的数据类型,必须重写 hashcode  和 equals 方法;
        hashcode重写:
                对象 equals 那么 hashcode 必须相等;
                对象不equals 那么 hashcode尽量不要想等;

Set 注意:

    每一个 Set 实例,底层都包含了一个 Map 实例;
    Set 实例的元素,实际上 就是 Map实例的 Key;


ashSet 实现类
HashSet 实现类 如果是 Integer类型 则自带排序,其他的 无序

特性:
    1.    底层是 HashMap  哈希表
    2.    完全的无序 ( 插入时顺序没有保证,    比较顺序也没有保证 )
    3.    可以为 null;
    4.    整体效率快;

HashSet 有一个比较重要的子类:    LinkedHashSet
HashSet    是不同步的, 线程不安全的;
Hashtable 是类似于 HashSet的实现;
        Hashtable 线程是安全的, 加锁;
                 效率是低于 HashSet 的;
                 底层 也是 哈希表;

hash相关:
hash 哈希的 特性 就是 速度快!

哈希快的原因是: 底层是 哈希表;

哈希表是根据元素的 hash 值 和 规定的哈希算法, 把数据构成了一个表,这个表称为 哈希表; 哈希表是一种 数据结构;

TreeSet 实现类
TreeSet

    其 实例, 有 TreeMap 支持;
    底层:    红黑二叉树;

特性:

1.    元素不能为 null, 不然会报空指针异常;
2.    元素被插入时, 保证了自然顺序;
3.    元素插入 避免重复, 没有遵循 hashcode equals 协定;

重点:

避免重复,没有遵循 hashcode equals 协定;
(1)自定义的数据类型:
        判断是否重复的协定,重写 CompareTo 方法;
(2)如果是 java 自定义的数据类型,没有实现内部比较器,应该继承 约定的 Comparator 外部比较器来进行比较;

TreeSet 比较的协定:
1.    比较功能 ( 内部比较器 Comparable      外部比较器 Comparator)
2.    比较功能返回的是 int 值;
    0 代表相等, 拒绝添加;
    + 代表大于    右边,
    -  代表小于, 左边;

重写 comparaTo ()
括号里的是节点,return this --- 括号!!!!! 有讲究的 不是 随便的

LinkedHashSet 实现类
LinkedHashSet 学习

继承与 HashSet

底层是 链表 + 哈希表 ( 数组 + 链表 );

特性:

1.    保证了元素插入时的顺序;
2.    可以为null;

相对于 父类 HashSet而言,底层过于复杂,效率低于父类; 但比 ArrayList 快;

相关文章
|
1月前
|
存储 Java 测试技术
滚雪球学Java(61):从源码角度解读Java Set接口底层实现原理
【6月更文挑战第15天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
30 1
滚雪球学Java(61):从源码角度解读Java Set接口底层实现原理
|
2月前
|
存储 安全 Java
Java的List、Set、Queue等接口及其实现类的技术性文章
Java的List、Set、Queue等接口及其实现类的技术性文章
13 1
|
2月前
|
存储 Java
【JAVA学习之路 | 进阶篇】Set及其实现类与常用方法
【JAVA学习之路 | 进阶篇】Set及其实现类与常用方法
|
2月前
|
存储 安全 Java
Java list set map等接口及其实现类
Java list set map等接口及其实现类
|
2月前
|
存储 安全 Java
Java一分钟之-集合框架进阶:Set接口与HashSet
【5月更文挑战第10天】本文介绍了Java集合框架中的`Set`接口和`HashSet`类。`Set`接口继承自`Collection`,特征是不允许重复元素,顺序不确定。`HashSet`是`Set`的实现,基于哈希表,提供快速添加、删除和查找操作,但无序且非线程安全。文章讨论了`HashSet`的特性、常见问题(如元素比较规则、非唯一性和线程安全性)以及如何避免这些问题,并提供了代码示例展示基本操作和自定义对象的使用。理解这些概念和注意事项能提升代码效率和可维护性。
29 0
|
2月前
|
Java 开发者
Java中三种Set的实现类的用法和区别
Java中三种Set的实现类的用法和区别
|
2月前
|
Python
python 格式化、set类型和class类基础知识练习(下)
python 格式化、set类型和class类基础知识练习(下)
36 0
|
2月前
|
索引 Python
python 格式化、set类型和class类基础知识练习(上)
python 格式化、set类型和class类基础知识练习
114 0
|
2月前
|
存储 Java 索引
Java Set接口及其常用实现类详解
Java Set接口及其常用实现类详解
123 2
|
2月前
|
安全 Java API
Java并发 - J.U.C并发容器类 list、set、queue
Queue API 阻塞是通过 condition 来实现的,可参考 Java 并发 - Lock 接口 ArrayBlockingQueue 阻塞 LinkedBlockingQueue 阻塞 ArrayQueue 非阻塞 LinkedQueue 非阻塞