zoukankan      html  css  js  c++  java
  • Java Collection

    总结

    1.线程安全性不同

    • HashMap线程不安全;(需要多线程操作的时候可以使用线程安全的ConcurrentHashMap。ConcurrentHashMap虽然也是线程安全的,但是它的效率比Hashtable要高好多倍。因为ConcurrentHashMap使用了分段锁,并不对整个数据进行锁定)
    • Hashtable 中的方法是Synchronize的。它的每个方法中都加入了Synchronize方法。

    2.继承的父类不同

    HashMap继承自AbstractMap;Hashtable继承自Dictionary

    3.key、value是否允许null

    HashMap的key和value都是可以是null,key只允许一个null;

    Hashtable的key和value都不可为null。

    4.初始容量大小和每次扩充容量大小的不同

    Hashtable会尽量使用素数、奇数。而HashMap则总是使用2的幂作为哈希表的大小
    • Hashtable默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。
    • HashMap默认的初始化大小为16。之后每次扩充,容量变为原来的2倍。

    4.1 为什么要保证HashTable数组长度总是原来的2n+1 

    之所以会有这样的不同,是因为Hashtable和HashMap设计时的侧重点不同。

    • Hashtable的侧重点是哈希的结果更加均匀,使得哈希冲突减少。当哈希表的大小为素数时,简单的取模哈希的结果会更加均匀。
    • 而HashMap则更加关注hash的计算效率问题。在取模计算时,如果模数是2的幂,那么我们可以直接使用位运算来得到结果,效率要大大高于做除法。当 length 总是2的n次方时,hash & (length-1)运算等价于对 length 取模,也就是 hash%length,但是&比%具有更高的效率。比如 n % 32 = n & (32 -1)。HashMap为了加快hash的速度,将哈希表的大小固定为了2的幂。当然这引入了哈希分布不均匀的问题,所以HashMap为解决这问题,又对hash算法做了一些改动。这从而导致了Hashtable和HashMap的计算hash值的方法不同

    5.计算hash值的方法不同

    • Hashtable直接使用对象的hashCode, Hashtable在计算元素的位置时需要进行一次除法运算,而除法运算是比较耗时的。
    • HashMap为了提高计算效率,将哈希表的大小固定为了2的幂,这样在取模预算时,不需要做除法,只需要做位运算。位运算比除法的效率要高很多。当 length 总是2的n次方时,hash & (length-1)运算等价于对 length 取模,也就是 hash%length,但是&比%具有更高的效率。比如 n % 32 = n & (32 -1)。

    6.迭代器不同

    • HashMap的Iterator是fail-fast迭代器;当有其它线程改变了HashMap的结构(增加,删除,修改元素),将会抛出ConcurrentModificationException。不过,通过Iterator的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。
    • Hashtable还使用了enumerator迭代器。JDK8之前的版本中,Hashtable是没有fast-fail机制的。在JDK8及以后的版本中 ,HashTable也是使用fast-fail的

    modCount的使用类似于并发编程中的CAS(Compare and Swap)技术。我们可以看到这个方法中,每次在发生增删改的时候都会出现modCount++的动作。而modcount可以理解为是当前hashtable的状态。每发生一次操作,状态就向前走一步。设置这个状态,主要是由于hashtable等容器类在迭代时,判断数据是否过时时使用的。尽管hashtable采用了原生的同步锁来保护数据安全。但是在出现迭代数据的时候,则无法保证边迭代,边正确操作。于是使用这个值来标记状态。一旦在迭代的过程中状态发生了改变,则会快速抛出一个异常,终止迭代行为。

  • 相关阅读:
    算法竞赛入门经典习题2-3 韩信点兵
    ios入门之c语言篇——基本函数——5——素数判断
    ios入门之c语言篇——基本函数——4——数值交换函数
    144. Binary Tree Preorder Traversal
    143. Reorder List
    142. Linked List Cycle II
    139. Word Break
    138. Copy List with Random Pointer
    137. Single Number II
    135. Candy
  • 原文地址:https://www.cnblogs.com/frankcui/p/14325684.html
Copyright © 2011-2022 走看看