1、Map部分框架结构
2、对于Map实现类的介绍
1、HashMap是线程不安全的,可以存储值都为null的键值对,
2、与之相反,Hashtable作为古老的实现类,它是线程安全的,但是它不可以存储值为null的键值对,否则会报空指针异常。(似乎古老的实现类都是线程安全的?)
3、HashMap与Hashtable,键值对存储的位置与添加的位置是不同的,所以它们输出的键值对与存入的顺序不同
4、HashMap的子类 LinkedHashMap 会使用链表来标记存入的键值对,所以它输出的键值对顺序就是存入的顺序。并且遍历时按照添加顺序遍历,所以对于频繁的查询比HashMap快
5、Properties类用于存储字符串的键值对,常用于配置文件。
6、TreeMap类会对存入的键值对进行排序,排序方式:
- 自然排序,Comparable,默认从小到大
- 定制排序,Comparator
注意:
TreeMap根据键值进行排序,所以键的类型必须实现Comparable或者Comparator。
3、HashMap底层实现
- JDK7及之前,数组 + 链表
- JDK8及之后,数组 + 链表 + 红黑树
键-值对先被封装成entry对象,再把entry对象存入map的entry数组中。entry对象存储在数组中的过程与 HashSet 一致。
不同的点在于:
- 当数组某一位置上链表长度 > 8 AND 此时entry数组的长度 > 64 时,把这一位置 的链表结构,转换成红黑树。
- 当添加key相同的键值对时,会把key对象对应的value值更新。
eg:map.put(key1,value_10),把key1对应的value值更新为value_10