HashMap和Hashtable的区别
那么多大佬解释这个问题,太长了根本看不进去,自己简短总结一下吧!
1、HashMap是线程不安全的,在多线程环境下会容易产生死循环,但是单线程环境下运行效率高;Hashtable线程安全的,很多方法都有synchronized修饰,但同时因为加锁导致单线程环境下效率较低。
2、HashMap允许有一个key为null,允许多个value为null;而Hashtable不允许key或者value为null
3,底层数组的长度不同HashMap的底层数组的长度必须为2^n,这样做的好处是为以后的hash算法做准备,而Hashtable底层数组的长度可以为任意值,这就造成了当底层数组长度为合数的时候,Hashtable的hash算法散射不均匀,容易产生hash冲突。
4,哈希算法不同Hashtable的hash算法首先使得hash的值小于等于整型数的最大值,再通过%运算实现均匀散射。
由于计算机是底层的运算是基于2进制的,所以HashMap的hash算法使用&运算代替%运算,在运算速度上明显HashMap的hash算法更优。
5,扩容的机制有区别:HashMap数组的扩容的整体思想就是创建一个长度为原先2倍的数组。然后对原数组进行遍历和复制
Hashtable的扩容将先创建一个长度为原长度2倍的数组,再使用头插法将链表进行反序
6,结构有区别:HashMap在jdk1.8在原先的数组+链表的结构进行了优化,将实现结构变为数组+链表+红黑树,在一条链表节点元素大于8的时候,会将链表封装成红黑树
Hashtable到了jdk1.8了内部结构并没有实质优化,继续使用数组+链表的方式实现