iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >HashMap和Hashtable的区别
  • 283
分享到

HashMap和Hashtable的区别

java哈希算法开发语言 2023-09-01 16:09:34 283人浏览 八月长安
摘要

相同点: HashMap和Hashtable都是java.util包下的类HashMap和Hashtable都实现了Map接口,存储方式都是key-value形式HashMap和Hashtable同时

相同点:

  1. HashMap和Hashtable都是java.util包下的类
  2. HashMap和Hashtable都实现了Map接口,存储方式都是key-value形式
  3. HashMap和Hashtable同时也都实现了Serializable和Cloneable接口
  4. HashMap和Hashtable的负载因子都是0.75
    • 负载因子(loadFactor):
      当我们第一次创建 HashMap 的时候,就会指定其容量(如果未明确指定,默认是 16),随着我们不断的向 HashMap 中 put 元素的时候,就有可能会超过其容量,那么就需要有一个扩容机制。

      所谓扩容,就是扩大 HashMap 的容量,在向 HashMap 中添加元素过程中,如果 元素个数(size)超过临界值(threshold) 的时候,就会进行自动扩容(resize),并且,在扩容之后,还需要对 HashMap 中原有元素进行 rehash,即将原来桶中的元素重新分配到新的桶中。

      在 HashMap 中,临界值(threshold) = 负载因子(loadFactor) * 容量(capacity)。

      loadFactor 是装载因子(负载因子),表示 HashMap 满的程度,默认值为 0.75f,也就是说默认情况下,当 HashMap 中元素个数达到了容量的 3/4 的时候就会进行自动扩容。

  5. HashMap与Hashtable的部分方法相同,如put,remove等方法

不同点:

1. HashMap是非线程安全的,Hashtable是线程安全的

书写如下代码分别查看HashMap和Hashtable的put方法。

  • HashMap:当我们进入put方法查看源码时可以发现put方法返回的方法只有个finla修饰,没有任何关于线程的存在

在这里插入图片描述

  • Hashtable:当我们点击进入之后,就能马上看到一个synchronized关键字,表示这个方法在调用的时候不能被其他的线程对象访问。
    在这里插入图片描述
2. HashMap允许null作为键或值,Hashtable不允许,运行时会报NullPointerException
  • 从上面Hashtable的put方法中我们也可以明显的看出,当我们的value值为null时,会抛出一个异常
  • 我们输出刚刚书写的代码时,也可以看出。当我们分别给HashMap和Hashtable传入空值时,分别查看它们的size时,HashMap会得到一个1,而Hashtable则会抛出一个NullPointerException
    在这里插入图片描述
3. HashMap添加元素使用的是自定义hash算法,Hashtable使用的是key的hashCode
  • HashMap使用的是自定义的算法,当我们进入put方法查看时,看见put方法中return了一个叫putVal的方法,刚方法前面把这个key传进去又调用了一个叫hash的方法,这个是它自己的方法,点进去之后会发现,他又将这个key获取了一个hashcode,然后把它右移了16位,跟当前的hashcode做了一个异或。
  • 进入put方法在这里插入图片描述
    - 进入hash方法
    在这里插入图片描述
  • 而Hashtable进入put方法后可以看见,它只是调用了当前key自己的hashcode方法
  • 所以两个虽然都是hash的算法,但是算法的本质上是不太一样的
4. HsahMap在数组+链表的结构中引入了红黑树,Hashtable没有

hash结构它的底层数据结构存储应该是一个数组加列表的形式,所以HashMap和Hashtable它的底层存储机制都是数组加列表的结构,但是在jdk 1.8版本之后HashMap增加了一个新的结构叫做红黑树。
源码中的具体体现:
map.put方法中有两个非常明显的节点,一个叫做node,一个叫做TreeNode,而这个Node存的就是普通的值(一个键,一个值,一个hash),而TreeNode存的则是当前节点的父元素、左元素、右元素,还有一个boolean类型的red(记录是否为红节点)。
这个结构Hashtable没有,而且这个结构如果长度链表长度超过8个的话,他就会自动进行红黑树的变化,然后在链表长度小于6个的时候就会变回去。

  • 进入putVal方法后可以看见Node和Tree Node两个节点
    在这里插入图片描述
  • 当我们点击Node进入之后,会发现他存的是这样一个结构;hash然后key、value,加上下一个节点
  • 而TreeNode他存储的就不是了。而是当前节点的父元素、左元素、右元素,还有一个boolean类型的red(记录是否为红节点)。
    在这里插入图片描述
5. HashMap初始容量为16,Hashtable初始容量为11
  • HashMap:默认初始容量为16
    在这里插入图片描述
  • Hashtable:默认初始容量是11个,Hashtable有一个构造方法,在构建Hashtable对象的时候传了一个11的默认值进去
    在这里插入图片描述
6. HsahMap扩容是当前容量翻倍,Hashtable是当前容量翻倍+1
  • HashMap:首先进入putVal方法,可以看到它有一个方法叫做resize,就是重新定义长度
    在这里插入图片描述
    而这里面机制就是old容量往左移一位,刚好就是乘2
    在这里插入图片描述
  • Hashtable也是同样有一个方法这个方法叫做addEntry,这个方法中有一个叫rehash方法,这个方法就是重新算长度的方法,
    在这里插入图片描述
    进入之后可以看见old往左移一位,但是后面又加了一个1

在这里插入图片描述

7. HsahMap只支持Iterator遍历,Hashtable支持Iterator和Enumeration

遍历的机制HashMap有一个叫keyset还有一个叫Entryset的两个方法,得到的结果都是Iterator(迭代器)。

而Hashtable有一个叫elements的方法,他的结果是Enumeration,同时Hashtable也能得到key和Entry,所以Hashtable的遍历方式多了一个机制。

8. HsahMap与Hashtable的部分方法不同,比如Hashtable有contains方法。

Hashtable中有contains方法,HsahMap中就没有。HsahMap只有containsKey和containsValue但是没有contains。

来源地址:https://blog.csdn.net/m0_56383107/article/details/126449690

--结束END--

本文标题: HashMap和Hashtable的区别

本文链接: https://www.lsjlt.com/news/388877.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • HashMap和Hashtable的区别
    相同点: HashMap和Hashtable都是java.util包下的类HashMap和Hashtable都实现了Map接口,存储方式都是key-value形式HashMap和Hashtable同时...
    99+
    2023-09-01
    java 哈希算法 开发语言
  • HashMap和Hashtable的区别是什么
    这篇文章主要为大家展示了“HashMap和Hashtable的区别是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“HashMap和Hashtable的区别是什么”这篇文章吧。HashMap和...
    99+
    2023-06-19
  • Hashtable与HashMap的区别有哪些
    今天就跟大家聊聊有关Hashtable与HashMap的区别有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。HashMap和Hashtable的详细比较前言:可以直接根据hash...
    99+
    2023-05-31
    hashmap hashtable
  • 在Java中HashMap和Hashtable有什么区别
    Java中HashMap和Hashtable的区别:HashMap允许空键值,而Hashtable不允许。Hashtable同步的,而HashMap是非同步的,效率上逼Hashtable要高。Hashtable继承自Dictionary类,...
    99+
    2024-04-02
  • Java入门中Hashtable和HashMap的区别是什么
    这篇文章将为大家详细讲解有关Java入门中Hashtable和HashMap的区别是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Hashtable和HashMap的区别:1.Hasht...
    99+
    2023-06-03
  • HashMap和HashTable的区别以及常见面试题是什么
    本篇文章为大家展示了HashMap和HashTable的区别以及常见面试题是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。HashMapHashMap也是我们使用非常多的Collection,它...
    99+
    2023-06-02
  • 深入浅析Java中HashMap与HashTable容器的区别
    这篇文章给大家介绍深入浅析Java中HashMap与HashTable容器的区别,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1、HashMap HashMap继承抽象类AbstractMap,实现接口Map、Clon...
    99+
    2023-05-31
    java hashmap hashtable
  • Java中HashTable和HashMap的区别_动力节点Java学院整理
    HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的区别。主要的区别有:线程安全性,同步(synchronization),以及速度。HashMap几乎可以等价于Hashtable,除了HashMap...
    99+
    2023-05-31
    java hashtable hashmap
  • Java的HashMap和HashTable有什么用
    这篇文章主要讲解了“Java的HashMap和HashTable有什么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java的HashMap和HashTable有什么用”吧!HashMap...
    99+
    2023-06-02
  • HashMap和Hashtable有什么不同
    HashMap和Hashtable有什么不同,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。线程安全两者最主要的区别在于Hashtable是线程安全,而HashM...
    99+
    2023-06-19
  • hashmap和hashset的区别是什么
    数据结构: HashMap是基于哈希表实现的,使用键值对存储数据;而HashSet是基于哈希表实现的Set集合,只存储值而不存储...
    99+
    2024-04-02
  • hashmap和concurrenthashmap的区别是什么
    HashMap和ConcurrentHashMap都是Java中的集合类,用于存储键值对。它们的区别如下:1. 线程安全性:- Ha...
    99+
    2023-08-25
    hashmap
  • C#中Hashtable和Dictionary有什么区别
    这篇文章给大家介绍C#中Hashtable和Dictionary有什么区别,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Dictionary<K,V>在使用中是顺序存储的,而Hashtable由于使用的是哈...
    99+
    2023-06-15
  • C#中Hashtable和Dictionary的区别与用法示例
    前言 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对,其中key通常可用...
    99+
    2024-04-02
  • java中LinkedHashMap和HashMap的区别有哪些
    这篇文章主要介绍了java中LinkedHashMap和HashMap的区别有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Java的优点是什么1. 简单,只需理解基本的...
    99+
    2023-06-14
  • WeakHashMap 和 HashMap 区别及使用场景
    目录引言1. 回顾 HashMap 和 LinkedHashMap1.1 说一下 HashMap 的实现结构1.2 说一下 LinkedHashMap 的实现结构2. 认识 Weak...
    99+
    2022-11-16
    WeakHashMap HashMap区别 WeakHashMap HashMap
  • JavaArrayList与LinkedList及HashMap容器的用法区别
    目录前言一、ArrayList1.原理2.用法二、LinkedList1.原理2.用法三、HashMap1.原理2.用法四、对比优缺点及区别前言 Java中容器对象主要用来存储其他对...
    99+
    2024-04-02
  • Java中HashSet和HashMap的区别_动力节点Java学院整理
    什么是HashSet?HashSet实现了Set接口,它不允许集合中有重复的值,当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能比较对象的值是否...
    99+
    2023-05-31
    java hashset hashmap
  • LinkedList和ArrayList的区别、Vector和ArrayList的区别
      LinkedList和ArrayList的区别  继承类和实现接口上来讲  他们都实现了List接口下的方法,他们都允许重复,允许null,并且有序的集合。  LinkedList实现了Deque接口。  底层实现上来讲  ArrayL...
    99+
    2023-06-02
  • Mybatis——#{}和${}的区别
    在使用mybatis的时候我们会使用到#{}和${}这两个符号来为sql语句传参数,那么这两者有什么区别呢? #{}是预编译处理,是占位符,${}是字符串替换,是拼接符 Mybatis在处理#{}...
    99+
    2023-09-13
    mybatis java mysql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作