HashSet、TresSet、HashMap、TreeMap 的区别
HashSet与TreeSet
相同点:
- 都是Set接口的实现类
- 都不能重复
不同点
HashSet | TreeSet |
---|---|
底层实现逻辑为哈希表 | 底层实现逻辑为二叉树 |
能够存储null, 仅能存储一个null | 不能存储null |
存储的数据是无序的 | 存储的数据是排好序的 |
HashMap与TreeMap
相同点
- 都是Map的实现类
- 都是线程不安全的
- 都是以键值对的形式存储的
不同点
HashMap | TreeMap |
---|---|
存储的数据是无序的 | 存储的数据是有序的(存储的键是有序的) |
底层实现是hash表 | 底层实现是红黑树 |
更适合 增、删 、定位元素(效率更高) | 更适合整体遍历或自定义排序 |
HashSet和HashMap
相同点
- 底层实现逻辑都是哈希表
不同点
HashSet | HashMap |
---|---|
为Set的实现类 | 为Map的实现类 |
存储的数据为对象 | 存储的数据以键值对存储 |
使用add方法添加数据 | 使用put添加键值对 |
获取数据的速度慢 | 获取数据的速度快(因为是使用key来获取值) |
使用set的这个对象为生成hashCode的依据 | 使用map的Key作为hashCode生成的依据 |
TreeSet和TreeMap
相同点
- 底层实现都是二叉树
- 存储的数据都是有序的
- 都是非同步的 线程不安全的
- 运行速度都比hash的慢
不同点
TreeSet | TreeMap |
---|---|
Set的实现类 | Map的实现类 |
只存储对象 | 数据以键值对的形式存储 |
不可以有重复的对象 | 可以有重复的键值对 |
⚠️
- hashSet是不允许重复的 在向hashSet中添加新的元素的时候 确保已经在类中重写了equals和hashCode方法了 这样才能判断hashSet中是否有两个相同的元素
- 使用TreeSet保存对象的时候 要先确保类继承了Comparable方法 这样才能在确定该其中的大小关系