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 快;