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采用了原生的同步锁来保护数据安全。但是在出现迭代数据的时候,则无法保证边迭代,边正确操作。于是使用这个值来标记状态。一旦在迭代的过程中状态发生了改变,则会快速抛出一个异常,终止迭代行为。

  • 相关阅读:
    windchill系统安装大概步骤
    Javase、Javaee、Javame的区别
    Cocoa Touch事件处理流程--响应者链
    iOS KVC & KVO
    GET异步 请求图片步骤
    iOS7——图像资源Images Assets
    IOS编程教程(八):在你的应用程序添加启动画面
    Objective C内存管理之理解autorelease------面试题
    runtime 运行时机制 完全解读
    图片的异步下载
  • 原文地址:https://www.cnblogs.com/frankcui/p/14325684.html
Copyright © 2011-2022 走看看