站群 wordpress,wordpress怎么禁用多域名,企业网站维护兼职,软件免费下载网站有哪些目录
相同
不同
1. 继承的父类不同
2. 线程安全性不同
3. 包含的 contains 方法不同
4. toString方法不同
5. 是否允许null值不同
6. 计算hash值的方式不同
7. 计算索引位置的方法不同
8. 初始化容量不同
9. 扩容方式不同
10. 内部存储策略不同#xff08;此处讨论…目录
相同
不同
1. 继承的父类不同
2. 线程安全性不同
3. 包含的 contains 方法不同
4. toString方法不同
5. 是否允许null值不同
6. 计算hash值的方式不同
7. 计算索引位置的方法不同
8. 初始化容量不同
9. 扩容方式不同
10. 内部存储策略不同此处讨论的是Java 8
11. 支持的遍历种类不同
12. 迭代器不同 相同
HashMap 和 Hashtable 都实现了 Map、Cloneable、Serializable接口
不同
1. 继承的父类不同
HashMap 继承自 AbstractMap 类
Hashtable 继承自 Dictionary 类Dictionary 类是一个已经被废弃的类因此已经几乎没人用Hashtable 了。
2. 线程安全性不同
HashMap 线程不安全。HashMap 中的方法在一般情况下是非 Synchronize 的。使用 HashMap 时就必须要自己增加同步处理
Hashtable 线程安全内部方法大多是 Synchronize 的。在多线程并发的环境下可以直接使用Hashtable不需要自己为它的方法实现同步。
Hashtable 实现线程安全的代价就是效率变低因为会锁住整个 Hashtable而ConcurrentHashMap 做了相关优化因为 ConcurrentHashMap 使用了分段锁并不对整个数据进行锁定效率比 Hashtable 高很多。
3. 包含的 contains 方法不同
HashMap 是没有 contains 方法的只包括 containsValue 和 containsKey 方法
Hashtable则保留了 contains 方法效果同 containsValue还包括 containsValue 和 containsKey方法。
4. toString方法不同
HashMap没有重写toString()方法;
Hashtable重写了toString()方法。
5. 是否允许null值不同
HashMap 是允许 key 和 value 为 null 值的用 containsValue 和 containsKey 方法判断是否包含对应键值对
Hashtable 键值对都不能为空会报空指针异常。
6. 计算hash值的方式不同
HashMap 内部专门使用了名为 hash 的方法来对 key 的 hash 值做出进一步处理 (h key.hashCode()) ^ (h 16)将计算出的值作为最终的 hash 值。目的是为了获得一个更加均匀分布的整数以便哈希函数得出的地址更加均匀分布降低冲突概率
Hashtable 则是直接使用 key.hashCode() 作为最终的 hash 值。
static final int hash(Object key) {int h;return (key null) ? 0 : (h key.hashCode()) ^ (h 16);
}
7. 计算索引位置的方法不同
HashMap 在求 hash 值对应的位置索引为index (n - 1) hash这样的取模操作只需要做位运算位运算比除法的效率要高很多
Hashtableint index (hash 0x7FFFFFFF) % tab.length0x7FFFFFFF的目的是为了将负的hash 值转化为正值因为 hash 值有可能为负数而 0x7FFFFFFF 后只有符号位改变而后面的位都不变。
8. 初始化容量不同
HashMap 的初始容量为16
Hashtable 初始容量为11
但是两者的负载因子默认都是0.75。
9. 扩容方式不同
HashMap为原容量的2倍而且扩容结果一定是2的幂次数
Hashtable为原容量2倍加1。
10. 内部存储策略不同此处讨论的是Java 8
HashMap满足链表长度大于等于 8并且数组长度大于等于64时链表转变成红黑树当红黑树节点少于6时退化为链表
Hashtable都是以链表方式存储。
11. 支持的遍历种类不同
HashMap 只支持Iterator遍历
Hashtable 支持Iterator和Enumeration两种方式遍历。
12. 迭代器不同
HashMap 的迭代器Iterator是 fail-fast 迭代器
Hashtable 的enumerator迭代器不是fail-fast的。
所以当有其它线程改变了 HashMap 的结构增加或者移除元素将会抛出ConcurrentModificationException但迭代器本身的 remove() 方法移除元素则不会抛出ConcurrentModificationException 异常。但这并不是一个一定发生的行为要看 JVM 。而Hashtable 则不会。 本文参考了下述两篇文章 HashMap和Hashtable的区别(绝对经典)_hashmap hashtable-CSDN博客 HashMap和Hashtable的区别-CSDN博客