前言
Set 接口常见俩个实现类 :HashSet TreeSet
倆个类的主要保存单列数据,数据无序不重复
无序指写入顺序和取出顺序不一样
HashSet TreeSet 基本操作都几乎相同,不同的是TreeSet 默认会将数据排序
所以TreeSet 里面不能保存null 元素
HashSet 底层结构和源码
HashSet 创建底层直接创建了hashMap
hashMap 底层是hashtable 就是hash表
HashSet 底层维护了hashMap ,也是和hashMap 底层一样,是基于hash表结构的
HashSet 怎么实现不可重复?
新元素不是使用equals 和原來元素比較
它是获取新元素的hashcode,通过位运算获取index
如果该索引没有其他值,直接添加
如果该索引有其他元素,则需要equals方法判断,如果不相等则以链表方式追加到已经有的元素后面,判断次数很少
如果相等则返回false,直接覆蓋
防止hashcode相等或者让相同对象hashcode相等可以重写hashCode方法
重写hashcode原则:
当然也可以使用idea等编码工具重写hashCode() equals() 方法
TreeSet 底层结构和源码
TreeSet 特点
不容许重复,不能为null,元素必须可排序
可以实现对里面元素排序 排序有俩种,自然排序 定制排序
TreeSet 结构和HashSet类似,底层维护treeMap 也是一个hashtable
排序是基于红黑数进行的排序,红黑树是二叉树的一种
如何实现去重?