开源saas建站系统,公司装修免费设计,个人备案网站做电影站,常州网络排名优化一、简介
HashMap:
1、HashMap是非线程安全的#xff0c;只是用于单线程环境下#xff0c;多线程环境下可以采用concurrent并发包下的concurrentHashMap。
2、HashMap 实现了Serializable接口#xff0c;因此它支持序列化#xff0c;实现了Cloneable接口#xff0c;能被…一、简介
HashMap:
1、HashMap是非线程安全的只是用于单线程环境下多线程环境下可以采用concurrent并发包下的concurrentHashMap。
2、HashMap 实现了Serializable接口因此它支持序列化实现了Cloneable接口能被克隆。
3、HashMap中key和value都允许为null。key为null的键值对永远都放在以table[0]为头结点的链表中。
4、HashMap是基于哈希表实现的每一个元素是一个key-value对其内部通过单链表解决冲突问题容量不足超过了阀值时同样会自动增长。
Hashtable:
1、Hashtable同样是基于哈希表实现的同样每个元素是一个key-value对其内部也是通过单链表解决冲突问题容量不足超过了阀值时同样会自动增长。
2、Hashtable也是JDK1.0引入的类是线程安全的能用于多线程环境中。
3、Hashtable同样实现了Serializable接口它支持序列化实现了Cloneable接口能被克隆。
二、分析两者不同
1、继承的父类不同
HashMap继承自AbstractMap类。但二者都实现了Map接口。 Hashtable继承自Dictionary类Dictionary类是一个已经被废弃的类见其源码中的注释。父类都被废弃自然而然也没人用它的子类Hashtable了。
2、HashMap线程不安全Hashtable线程是安全的。
3、包含的contains方法不同
HashMap是没有contains方法的而包括containsValue和containsKey方法hashtable则保留了contains方法效果同containsValue,还包括containsValue和containsKey方法。
4、是否允许null值
Hashmap是允许key和value为null值的用containsValue和containsKey方法判断是否包含对应键值对HashTable键值对都不能为空否则包空指针异常。
5、计算hash值不同
为了得到元素的位置首先需要根据元素的 KEY计算出一个hash值然后再用这个hash值来计算得到最终的位置。
hashmap是通过位运算hashtable是通过除法
6、扩容方式不同
当容量不足时要进行resize方法而resize的两个步骤 ①扩容 ②rehash:这里HashMap和HashTable都会会重新计算hash值而这里的计算方式就不同了看5 HashMap 哈希扩容必须要求为原容量的2倍而且一定是2的幂次倍扩容结果而且每次扩容时原来数组中的元素依次重新计算存放位置并重新插入 而Hashtable扩容为原容量2倍加17、解决hash冲突方式不同
出现hash冲突时
hashmap:
1、如果冲突数量小于8则是以链表方式解决冲突。
2、而当冲突大于等于8时就会将冲突的Entry转换为**红黑树进行存储。
3、而又当数量小于6时则又转化为链表存储。
hashtable:都是以链表方式存储。