一、HashMap
1.HashMap是基于 哈希表的 Map接口的 非同步 实现。此实现提供所有可选的映射操作,
2.并允许使用null值和null键(HashMap最多只允许一条记录的键为null,允许多条记录的值为null。)。
3.此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
4.HashMap中不允许出现重复的键(Key)
5.Hashmap是非线程安全的,如果多个线程同时访问一个HashMap,可能会导致数据不一致,所以当其中至少一个线程从结构上(指添加或者删除一个或多个映射关系的任何操作)修改了,则必须保持外部同步,以防止对映射进行意外的非同步访问。
6.其迭代器是fail-fast的
7.HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体,(JDK1.8增加了红黑树部分,会将时间复杂度从O(n)降为O(logn))。
红黑树
即使负载因子和Hash算法设计的再合理,也免不了会出现拉链过长的情况,一旦出现拉链过长,则会严重影响HashMap的性能。于是,在JDK1.8版本中,对数据结构做了进一步的优化,引入了红黑树。而当链表长度太长(默认超过8)时,链表就转换为红黑树,利用红黑树快速增删改查的特点提高HashMap的性能,其中会用到红黑树的插入、删除、查找等算法。
二、HashSet
HashSet中的数据不是key-value键值对,其只是单值,虽然其借助与HashMap来实现,但是其只是将值作为key来存入HashMap中,因为HashMap中的值是key-value键值对的,所以每个HashSet存储到HashMap的数据对应的value值只是一个new Object()对象,
三、TreeMap
TreeMap 是一个有序的key-value集合,它是通过红黑树实现的。
TreeMap 继承于AbstractMap,所以它是一个Map,即一个key-value集合。
TreeMap 实现了NavigableMap接口,意味着它支持一系列的导航方法。比如返回有序的key集合。
TreeMap 实现了Cloneable接口,意味着它能被克隆。
TreeMap基于红黑树(Red-Black tree)实现。该映射根据其键的自然顺序(字母排序)进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。
TreeMap的基本操作 containsKey、get、put 和 remove 的时间复杂度是 log(n) 。
TreeMap是非线程安全的。 它的iterator 方法返回的迭代器是fail-fast的。
HashMap | TreeMap |
---|---|
遍历出来数据无序 | 自然排序或者创建映射提供的Comparator 进行排序 |
基于散列表 | 红黑树 |
取值速度快 | 取值速度慢 |
适用于在Map中插入、删除和定位元素 | 适用于按自然顺序或自定义顺序遍历键(key) |