一,HashMap

1、HashMap是键值对key-value形式双列集合。它的底层存储原理是哈希表。

2、对应HashMap采用哈希表存储键值对元素的方式。

HashMap.put(key,value)方法的注意点:

(1)没有synchronized关键字修饰,意味着它是非线程安全的。

public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}

(2)key和value可以是null-null、null-value、key-null的形式。如果Map中不存在将要添加的元素那么返

回值为null,如果已经存在且value不为null,那么新value覆盖旧value,返回旧value,如果旧value为null,

那么将新value和key形成一个key-value映射,并返回null。key为null的时候,null也是一个键,键具有唯

一性,value可以重复。

3、HashMap的resize()方法理解

这个方法时HashMap容量不够时进行扩容的方法,觉得有必要说一下。

当HashMap的容量不够用时,再往容器中添加元素时,HashMap会进行扩容操作。当HashMap的容量为最大的

时,则不扩容,但是容器阈值会设置为Integer类型的最大值。当不是最大的时,容器会进行扩容,容量会变为

原来的二倍(此时也不大于最大容量),并且阈值也会随之变化,变为原阈值的二倍。扩容就是在堆中新

创建一个HashMap容器,然后将原来就的HashMap中的元素放到新容器中,放置的时候会重新计算每个Node节

点在哈希表中的位置。

4、HashMap的构造

我们常用的都是空参构造。空参构造一个HashMap,那么它的构造方法使用的是默认的初始化容量10和

加载因子0.5。

HashMap是非线程安全的,是因为HashMap的方法都是没有用synchronized关键字修饰的。

二,HashTable

1、Hashtable的方法几乎都是同步的,都有synchronized关键字修饰,因此和HashMap相比,它是线程安全的。

2、Hashtable中key-value的映射,key和value 都是不允许为null的,如果为null了呢?对不起,空指针异常抛出。

3、Hashtable在计算节点元素在哈希表中的位置使用的算法稍有区别,它有它的好处,但和HashMap的算法比

起来明显性能低一些。
三,HashMap和Hashtable有哪些主要区别呢?

1、HashMap是继承自AbstractMap类,而HashTable是继承自Dictionary类。不过它们都实现了同时实现了map、Cloneable(可复制)、Serializable(可序列化)这三个接口。

2、Hashtable比HashMap多提供了elments() 和contains() 两个方法。

3、HashMap的key-value支持key-value,null-null,key-null,null-value四种。而Hashtable只支持key-value一种(即

key和value都不为null这种形式)。既然HashMap支持带有null的形式,那么在HashMap中不能由get()方法来判断

HashMap中是否存在某个键, 而应该用containsKey()方法来判断,因为使用get的时候,当返回null时,你无法判断到底

是不存在这个key,还是这个key就是null,还是key存在但value是null。

4、线程安全性不同,HashMap的方法都没有使用synchronized关键字修饰,都是非线程安全的,而Hashtable的方法几乎

都是被synchronized关键字修饰的。但是,当我们需要HashMap是线程安全的时,怎么办呢?我们可以通过Collections.synchronizedMap(hashMap)来进行处理,亦或者我们使用线程安全的ConcurrentHashMap。ConcurrentHashMap虽然也是线程安全的,但是它的效率比Hashtable要高好多倍。因为ConcurrentHashMap使用了分段锁,并不对整个数据进行锁定。

5、初始容量大小和每次扩充容量大小的不同

6、计算hash值的方法不同 
为了得到元素的位置,首先需要根据元素的 KEY计算出一个hash值,然后再用这个hash值来计算得到最终的位置。

Hashtable直接使用对象的hashCode。hashCode是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值。然后再使用除留余数发来获得最终的位置。

最新文章

  1. C# 发送邮件 附件名称为空
  2. centOS6.4 extundelete工具恢复rm -rf 删除的目录
  3. Html基础知识讲解
  4. 如何配置Drupal数据库信息?
  5. JUnit测试工具在项目中的用法
  6. ollicle.com: Biggerlink – jQuery plugin
  7. uva 1411 Ants
  8. SQL 逻辑优化 case when 转为 union all
  9. vue-router的学习
  10. 【dfs】p1451 求细胞数量
  11. Maven - 实例-2-使用本地仓库中的依赖包
  12. python处理csv文档
  13. learning at command AT+CGSN
  14. 防止 IE 自动跳兼容模式
  15. PHP strlen()函数和strpos()函数
  16. SpringMVC和Springboot的区别
  17. 【转】每天一个linux命令(40):wc命令
  18. locust
  19. python第三方模块之paramiko模块
  20. c#基础 第八讲

热门文章

  1. Java连载15-boolean类型&类型转换&++运算符
  2. ng 使用阿里巴巴矢量图
  3. 【生活现场】从诗词大会飞花令到elasticsearch原理解析(转)
  4. kvm虚拟机日常管理与配置
  5. .net core启用 autoMapper
  6. PIE SDK影像快速拼接
  7. Winform中实现根据配置文件重新加载ZedGraph属性的实现思路
  8. Linux组管理(6)
  9. Java代码中可以优化性能的小细节
  10. 使用Dictionary键值对判断字符串中字符出现次数