HashMap和Hashtable的区别

1.    两者最主要的区别在于Hashtable是线程安全,而HashMap则非线程安全 Hashtable的实现方法里面都添加了synchronized关键字来确保线程同步,因此相对而言HashMap性能会高一些,我们平时使用时若无特殊需求建议使用HashMap,在多线程环境下若使用HashMap需要使用Collections.synchronizedMap()方法来获取一个线程安全的集合(Collections.synchronizedMap()实现原理是Collections定义了一个SynchronizedMap的内部类,这个类实现了Map接口,在调用方法时使用synchronized来保证线程同步,当然了实际上操作的还是我们传入的HashMap实例,简单的说就是Collections.synchronizedMap()方法帮我们在操作HashMap时自动添加了synchronized来实现线程同步,类似的其它Collections.synchronizedXX方法也是类似原理)

2.    HashMap可以使用null作为key,而Hashtable则不允许null作为key 虽说HashMap支持null值作为key,不过建议还是尽量避免这样使用,因为一旦不小心使用了,若因此引发一些问题,排查起来很是费事 HashMap以null作为key时,总是存储在table数组的第一个节点上。

3.    HashMap是对Map接口的实现,HashTable实现了Map接口和Dictionary抽象类

4.    HashMap的初始容量为16,Hashtable初始容量为11,两者的填充因子默认都是0.75 HashMap扩容时是当前容量翻倍即:capacity*2,Hashtable扩容时是容量翻倍+1即:capacity*2+1 5.    两者计算hash的方法不同 Hashtable计算hash是直接使用key的hashcode对table数组的长度直接进行取模 int hash = key.hashCode();int index = (hash & 0x7FFFFFFF) % tab.length; HashMap计算hash对key的hashcode进行了二次hash,以获得更好的散列值,然后对table数组长度取模

1.    static int hash(int h) {        // This function ensures that hashCodes that differ only by

2.            // constant multiples at each bit position have a bounded

3.            // number of collisions (approximately 8 at default load factor).

4.            h ^= (h >>> 20) ^ (h >>> 12);        return h ^ (h >>> 7) ^ (h >>> 4);

5.        } static int indexFor(int h, int length) {        return h & (length-1); 6.        }  

6.    HashMap和Hashtable的底层实现都是数组+链表结构实现 HashMap实现同步功能:Map m = Collections.synchronizeMap(hashMap);

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值