HashMap | Hashtable | |
所属包 | java.util | java.util |
继承 | AbstractMap | Dictionary |
实现 | Map<K,V>, Cloneable, Serializable | Map<K,V>, Cloneable, Serializable |
底层结构 | jdk1.7:数组+单向链表 jdk1.8:数组+单向链表+红黑树( 当链表节点数量达到树化阀值TREEIFY_THRESHOLD(阀值>8,并且数组长度>64)时,链表就会转化为红黑树;当红黑树的节点数量减少到UNTREEIFY_THRESHOLD <=6时,红黑树又会转化为单向链表 )具体区别下面附有单独区分 | 数组+链表 |
常用方法 | HashMap<Object, Object> hashMap = new HashMap<>(); hashMap.put("",""); hashMap.putAll(new HashMap<>()); hashMap.get(0); hashMap.containsKey(""); hashMap.entrySet(); hashMap.getOrDefault(0,""); hashMap.remove(""); MapUtils.isNotEmpty(hashMap); MapUtils.isEmpty(hashMap); | Hashtable<Object, Object> hashtable = new Hashtable<>(); hashtable.put("123","456"); hashtable.putAll(new HashMap<>()); hashtable.get(0); hashtable.containsKey(""); hashtable.entrySet(); hashtable.getOrDefault(0,""); hashtable.remove(""); MapUtils.isNotEmpty(hashtable); MapUtils.isEmpty(hashtable); Enumeration<Object> elements = hashtable.elements(); hashtable.contains("456"); hashtable.containsValue(""); |
key | 可为null | 不可为null,会NullPointerException |
value | 可为null | 不可为null,会NullPointerException |
hash算法不同 | 自定义的hash算法 | key的hash值 |
多线程 | 线程不安全的,在多线程并发的环境下,可能会产生死锁等问题,需要自己处理多线程的安全问题。 虽然是线程不安全的,但是它的效率远远高于Hashtable,这样设计是合理的,因为大部分的使用场景都是单线程。 | 线程安全的,它的每个方法上都有synchronized 关键字,因此可直接用于多线程中。当需要多线程操作的时候可以使用线程安全的ConcurrentHashMap。 ConcurrentHashMap虽然也是线程安全的,但是它的效率比Hashtable要高好多倍。因为ConcurrentHashMap使用了分段锁,并不对整个数据进行锁定。 |
初始容量 |
DEFAULT_INITIAL_CAPACITY = 1 << 4 | public Hashtable() { this(11-initialCapacity, 0.75f); } |
加载因子 | DEFAULT_LOAD_FACTOR = 0.75f | public Hashtable() { this(11, 0.75f-loadFactor); } |
扩容大小 | 2n | 2n+1 |
jdk1.7和1.8的hashmap
hashMap1.8做了哪些优化?_会飞的IT蜗牛的博客-CSDN博客_hashmap 1.8新特性红黑树与平衡二叉树_百图详解红黑树_小吴先森的博客-CSDN博客