Hashtable、HashMap、TreeMap 三者区别
比较点 | Hashtable | HashMap | TreeMap |
---|---|---|---|
key | 不能为null | 可以为 null | |
value | 不能为 null | 可以为 null | |
key | 一定情况下可以为 null | ||
有序性 | 无序 | 无序 | 有序 |
容量 | 初始 11 | 初始 16,且一定为 2 n 2^n 2n | |
扩容 | 2n+1 | 2n | |
线程安全性 | 线程安全 | 线程不安全 | |
hash 值计算 | 底层是模运算,效率较低 | 底层是移位运算 |
TreeMap 关于 key 为 null 的说明:TreeMap 初始化时可以传入 Comparator 参数,但也可以不传入。如果没有传入,在 put 元素时,默认使用 key 实现的 Comparable 进行比较然后按顺序存储(如果 key 没有实现 Comparable,在 ClassCast 的时候直接抛出异常),当然,key 如果为 null,则调用方法 compare 直接空指针异常。
但是,如果传入 Comparator,那么在 Comparator 的方法 compare 中,小心地判断了 key 为 null 的情况,也是可以将 key 存储为 null 的。