一,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类型的数值。然后再使用除留余数发来获得最终的位置。

HashMap和HashTable本质性的区别的更多相关文章

  1. HashMap 和 Hashtable 有什么区别?(未完成)

    HashMap 和 Hashtable 有什么区别?(未完成)

  2. ArrayList,Vector,HashMap,HashSet,HashTable之间的区别与联系

    在编写java程序中,我们最常用的除了八种基本数据类型,String对象外还有一个集合类,在我们的的程序中到处充斥着集合类的身影!java中集合大家族的成员实在是太丰富了,有常用的ArrayList. ...

  3. HashMap与HashTable联系与区别

    HashMap与HashTable 1.hashMap去掉了HashTable 的contains方法,但是加上了containsValue()和containsKey()方法. 2.hashTabl ...

  4. HashMap和HashTable简介和区别

    一.HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长. HashMap是非线程安全的, ...

  5. LinkedList,ArrayList,Vector,HashMap,HashSet,HashTable之间的区别与联系

    在编写java程序中,我们最常用的除了八种基本数据类型,String对象外还有一个集合类,在我们的的程序中到处充斥着集合类的身影!java中集合大家族的成员实在是太丰富了,有常用的ArrayList. ...

  6. HashMap、HashTable、ConcurrentHashMap区别

    HashMap与HashTable区别 HashMap与ConcurrentHashMap区别 1.HashMap与HashTable的区别 HashMap线程不安全,HashTable线程安全 Ha ...

  7. Java的HashMap和Hashtable有什么区别HashSet和HashMap有什么区别?使用这些结构保存的数需要重载的方法是哪些?

    HashMap与Hashtable实现原理相同,功能相同,底层都是哈希表结构,查询速度快,在很多情况下可以互用 两者的主要区别如下 1.Hashtable是早期JDK提供的接口,HashMap是新版J ...

  8. HashMap 和 Hashtable两者的区别以和解释

    HashMap 和 Hashtable 是 Java 开发程序员必须要掌握的,也是在各种 Java 面试场合中必须会问到的. 但你对这两者的区别了解有多少呢? 现在,栈长我给大家总结一下,或许有你不明 ...

  9. hashMap,hashTable,concurrentHashMap区别

    HashTable 底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相 ...

随机推荐

  1. golang语言特性

    1. 垃圾回收 a. 内存⾃动回收,再也不需要开发⼈员管理内存 b. 开发人员专注业务实现,降低了心智负担 c. 只需要new分配内存,不需要释放   2. 天然并发 a. 从语⾔层面⽀持并发,⾮常简 ...

  2. [跨域问题]ssm+vue前后台分离跨域问题解决方法

    跨域未解决时: Access to XMLHttpRequest at 'http://localhost:8080/vue/findall from origin 'http://localhost ...

  3. Android Studio出现Wait for build to finish解决办法

    公司用钉钉打卡,我作弊哈哈,买了个大牛助手. 刚续费包年,开发商竟然跑路了.服务器连不上,不能用了,心血来潮想说能否自己破解了.好家伙需要学的还真不少,首先还要从安卓开发学起... 刚装了Androi ...

  4. 【翻译】tus----一个可续传文件上传的开放协议

    tus tus是一个可续穿文件上传协议,它以Http协议为载体,统一了一个文件断点续传的标准. 这篇文章翻译自https://tus.io/ 目前该协议版本信息如下: Version: 1.0.0 ( ...

  5. PIE截图方法的优化

    因为我们组的项目要通过截图获取数据,所以要经常使用截图工具,之前截图都是根据教程(https://www.cnblogs.com/PIESat/p/10243308.html)用的地图显示范围截图,而 ...

  6. android studio学习---标签页分离,满足查同一个文件的不同部分

    分离一个标签窗口:右键标签页,打开上下文菜单,选择Split Vertically or Split Horizontall改变分离窗口的摆放方式:右键标签页,打开上下文菜单,选择 Change Sp ...

  7. 【软件工程第二次作业】个人项目:WordCountPy

    一.GitHub 地址 项目 GitHub 地址为:https://github.com/bytemo/WordCountTool 二.PSP表格 PSP2.1 Personal Software P ...

  8. MySQL 错误代码:2003 idea错误:ERROR DruidDataSource:1846 - create connection error

    idea项目一启动就报错: 20:01:13,047 ERROR DruidDataSource:1846 - create connection error com.mysql.jdbc.excep ...

  9. nginx无网络启动失败——proxy_pass域名DNS解析出错

    问题: nginx启动或者reload的时候,会对proxy_pass后面的域名进行DNS解析,如果解析失败,启动就会失败或者reload失败. 我们是to B的产品,客户的环境可能是不通公网的,因此 ...

  10. Tomcat服务器编码格式设置

    /** *1.找到.xml server文件 */ /** * 2. 设置encoding */