HashMap与HashTable、HashSet的区别

2023-05-16

HashTable和HashMap区别
区别一:继承的父类不同 
Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。

public class Hashtable<K,V> extends Dictionary<K,V>  
implements Map<K,V>, Cloneable, Serializable  
 
public class HashMap<K,V> extends AbstractMap<K,V>  
implements Map<K,V>, Cloneable, Serializable 
区别二:线程安全性不同,Hashtable是线程安全,而HashMap则非线程安全
Hashtable的实现方法里面都添加了synchronized关键字来确保线程同步,因此相对而言HashMap性能会高一些,我们平时使用时若无特殊需求建议使用HashMap,在多线程环境下若使用HashMap需要使用Collections.synchronizedMap()方法来获取一个线程安全的集合(Collections.synchronizedMap()实现原理是Collections定义了一个SynchronizedMap的内部类,这个类实现了Map接口,在调用方法时使用synchronized来保证线程同步,当然了实际上操作的还是我们传入的HashMap实例,简单的说就是Collections.synchronizedMap()方法帮我们在操作HashMap时自动添加了synchronized来实现线程同步,类似的其它Collections.synchronizedXX方法也是类似原理)

区别三:是否提供contains方法 
HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey,因为contains方法容易让人引起误解。 
Hashtable则保留了contains,containsValue和containsKey三个方法,其中contains和containsValue功能相同。

区别四:**key和value是否允许null值 
其中key和value都是对象,并且不能包含重复key,但可以包含重复的value。 
Hashtable中,key和value都不允许出现null值。 
HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,可能是 HashMap中没有该键,也可能使该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键, 而应该用containsKey()方法来判断。 
PS:这个面试喜欢问。

区别五:哈希值的计算方法不同,Hashtable直接使用的是对象的hashCode,而HashMap则是在对象的hashCode的基础上还进行了一些变化。

//Hashtable中可以看出的是直接采用关键字的hashcode作为哈希值
    int hash = key.hashCode();
    //然后进行模运算,求出所在哗然表的位置 
    int index = (hash & 0x7FFFFFFF) % tab.length;
//HashMap中的实现
   //这两行代码的意思是先计算hashcode,然后再求其在哈希表的相应位置      
    int hash = hash(key.hashCode());
    int i = indexFor(hash, table.length);
    static int hash(int h) {
     // This function ensures that hashCodes that differ only by
     // constant multiples at each bit position have a bounded
     // number of collisions (approximately 8 at default load factor).
        h ^= (h >>> 20) ^ (h >>> 12);
        return h ^ (h >>> 7) ^ (h >>> 4);
    }
   //求位于哈希表中的位置
    static int indexFor(int h, int length) {
        return h & (length-1);
    }
区别六:内部实现使用的数组初始化和扩容方式不同,内存初始大小不同,HashTable初始大小是11,而HashMap初始大小是16

 public Hashtable() {
                //从这里可以看出,默认的初始化大小11,
                //这里的11并不是11个字节,而是11个       Entry,这个Entry是
                //实现链表的关键结构
                //这里的0.75代表的是装载因子
                this(11, 0.75f);
     }
    public HashMap() {
        //这个默认的装载因子也是0.75
         this.loadFactor = DEFAULT_LOAD_FACTOR;
        //默认的痤为0.75*16
        threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR);
        //这里开始是默认的初始化大小,这里大小是16
        table = new Entry[DEFAULT_INITIAL_CAPACITY];
        init();
    }
Hashtable采用的是2*old+1,而HashMap是2*old

HashMap和HashSet的区别
面试中经常被问到HashMap与HashSet的区别。于是本渣静下心来总结了一下HashSet与HashMap的区别。

  先了解一下HashMap跟HashSet

 HashSet:

  HashSet实现了Set接口,它不允许集合中出现重复元素。当我们提到HashSet时,第一件事就是在将对象存储在

HashSet之前,要确保重写hashCode()方法和equals()方法,这样才能比较对象的值是否相等,确保集合中没有

储存相同的对象。如果不重写上述两个方法,那么将使用下面方法默认实现:

 public boolean add(Object obj)方法用在Set添加元素时,如果元素值重复时返回 "false",如果添加成功则返回"true"

HashMap:

  HashMap实现了Map接口,Map接口对键值对进行映射。Map中不允许出现重复的键(Key)。Map接口有两个基本的实现

TreeMap和HashMap。TreeMap保存了对象的排列次序,而HashMap不能。HashMap可以有空的键值对(Key(null)-Value(null))

HashMap是非线程安全的(非Synchronize)

我们能否让HashMap同步?
HashMap可以通过下面的语句进行同步:
Map m = Collections.synchronizeMap(hashMap);

public Object put(Object Key,Object value)方法用来将元素添加到map中。

HashSet与HashMap的区别:

HashMap    HashSet
实现了Map接口    实现Set接口
存储键值对    仅存储对象
调用put()向map中添加元素    调用add()方法向Set中添加元素
HashMap使用键(Key)计算Hashcode    
HashSet使用成员对象来计算hashcode值,

对于两个对象来说hashcode可能相同,

所以equals()方法用来判断对象的相等性,

如果两个对象不同的话,那么返回false

HashMap相对于HashSet较快,因为它是使用唯一的键获取对象    HashSet较HashMap来说比较慢

————————————————
版权声明:本文为CSDN博主「斯维特哈特」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_24309787/article/details/88950246

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HashMap与HashTable、HashSet的区别 的相关文章

  • Hashcode() 与 Equals()

    我有下面这两门课 class Emp implements Comparable String name job public String getName return name public void setName String na
  • Java HashSet 具有自定义相等标准? [复制]

    这个问题在这里已经有答案了 我一直在寻找类似于 Java TreeSet 在实例化时接收自定义比较器的能力 因此我不需要使用对象的默认相等 和哈希码 标准 我能想到的最接近的方法是将我的对象包装在一个私有的自定义类中 但这看起来很老套 这最
  • 如何将 HashMap> 存储在列表中?

    我的哈希图将字符串存储为键 将数组列表存储为值 现在 我需要将其嵌入到列表中 也就是说 它将采用以下形式 List
  • 对于范围从 0 到最大值的 uint64_t 键,最佳哈希函数是什么?

    假设我们有一组元素并希望将它们存储在哈希映射中 例如std unordered set 并且每个元素都有一个 type 的键uint64 t其值可以从 0 到最大可能值变化 使用简单哈希函数 其中键的哈希值就是键本身 是最佳选择吗 它是否取
  • ANSI C 哈希表实现,数据位于一个内存块中

    我正在寻找一种哈希表的开源 C 实现 它将所有数据保存在一个内存块中 因此可以轻松地通过网络发送数据 我只能找到为添加到其中的每个键值对分配小块内存的内存 预先非常感谢您的所有投入 编辑 它不一定需要是哈希表 无论键值对表可能会做什么 序列
  • 如何在java hashset中查找并返回对象

    根据 HashSet javadoc HashSet contains 仅返回布尔值 如何在 hashSet 中 查找 对象并修改它 它不是原始数据类型 我看到 HashTable 有一个 get 方法 但我更喜欢使用该集合 您可以删除一个
  • HashSet 与 LinkedHashSet

    它们之间有什么区别 我知道 LinkedHashSet 是 HashSet 的有序版本 维护一个跨所有元素的双向链接列表 使用此类代替 HashSet 当您关心迭代顺序时 当你迭代 HashSet 时 顺序是不可预测的 而 LinkedHa
  • 初始化 HashMap 的最佳方法

    我通常会这样做 HashMap
  • JSON 中的哈希到底是什么?

    我正在学习 JSON 但我发现你也可以将所谓的 哈希 放入 JSON 中 我在哪里可以找到什么是哈希 或者你能向我解释一下什么是哈希吗 另外 什么是哈希图 我有 C 和 C 经验 正在学习 JS Jquery 和 JSON 哈希是一个稀疏数
  • 从 arraylist 和 hashmap 中删除重复项

    我有一个数组列表 其中包含付款人的姓名 另一个数组列表包含每次付款的费用 例如 nameArray 尼古拉 劳尔 洛伦佐 劳尔 劳尔 洛伦佐 尼古拉 价格数组 24 12 22 18 5 8 1 我需要将每个人的费用相加 所以数组必须变成
  • 线程“main”中的异常 java.lang.StackOverflowError

    我有一段代码 但我无法弄清楚为什么它在线程 main java lang StackOverflowError 中给出异常 这是问题 Given a positive integer n prints out the sum of the
  • 如何将哈希表添加到多维数组?无法通过成员访问枚举分配值

    我在将哈希表添加到多维数组时遇到问题 我编码如下 Data BIBs BIB BIBName BIBName Standort Standort B cher BuchName BuchName Autor Autor 此代码正在运行并创建
  • Hashmap 不适用于 int、char [重复]

    这个问题在这里已经有答案了 可能的重复 在 Java 集合中存储原始值 https stackoverflow com questions 2504959 storing primitive values in a java collect
  • 为什么 Hashtable 不允许空键或空值?

    正如 JDK 文档中所指定的 Hashtable 不允许空键或空值 HashMap 允许一个空键和任意数量的空值 为什么是这样 Hashtable 是较旧的类 通常不鼓励使用它 也许他们看到了对 null 键的需要 更重要的是 null 值
  • 哈希表到 Lwuit 表

    Hashtable iHashtable new Hashtable iHashtable put Name Jhon iHashtable put Address India Enumeration iEnumeration iHasht
  • 如何使用clojure中的map函数打印哈希映射列表的每个元素?

    我正在构建一个哈希映射列表 然后将其传递给另一个函数 当我尝试使用打印列表中的每个哈希映射时map它不工作 我可以打印完整列表或获取第一个元素等 defn m a println a map println a 以下仅适用于 repl m
  • 从 HashMap 条目列表中删除重复项

    我有一个List
  • HashMap 中的 keySet 字段为 null

    我正在尝试循环HashMap与keySet 方法如下 for String key bundle keySet String value bundle get key 我在代码的其他部分在 HashMap 上使用了很多 for each 循
  • 具有动态键值哈希映射的 Swagger 复杂响应模型

    我正在努力使用 swagger 的语法来描述响应类型 我想要建模的是具有动态键和值的哈希映射 这是允许本地化所必需的 语言可能有所不同 但应始终提供英语 JSON 格式的响应如下所示 id 1234 name en english text
  • 在 C++ 中为哈希映射提供复合键

    我有一个数据结构

随机推荐

  • 简单说说OSI网络七层模型

    如果你读过计算机专业 xff0c 或者学习过网络通信 xff0c 那你一定听说过 OSI 模型 xff0c 它曾无数次让你头大 OSI 是 Open System Interconnection 的缩写 xff0c 译为 开放式系统互联 O
  • 第七届中国项目管理办公室(PMO)发展大会亮点抢先看

    中国项目管理办公室 xff08 PMO xff09 发展大会是全国PMO专业人士的年度盛会 xff0c 是业内了解PMO前沿理论与资讯 分享PMO最佳实践经验 彰显PMO价值的高端会议交流平台 今年是PMO大会的第七年 xff0c 本届PM
  • UIScrollView原理解析

    了解更多IOS底层原理知识 xff0c 关注腾讯课堂 八点钟学院IOS高级开发 IOS学习交流群 431449751 xff1b 在我们app中 xff0c UIScrollView几乎贯穿我们整个项目业务 xff0c 为什么这么说 xff
  • 调试rviz,并解决问题“For frame [laser]: Fixed Frame [map] does not exist”

    以rplidar为例 xff0c 运行命令 roslaunch rplidar ros rplidar launch 然后运行rviz xff0c 查看输出的雷达扫描数据 rosrun rviz rviz结果如下 xff1a 可以看到什么都
  • QT简单入门实例3【QMessageBox使用,包含消息框,警告框,错误框。实现一定延时后自行关闭功能】

    本文对 QMessageBox Information xff0c QMessageBox Warning xff0c QMessageBox Critical 三种消息框进行演示 并实现两种弹出方式 xff1a 1 等待用户点击后关闭 2
  • hutool两个list取差集subtractToList

    span class token comment 旧角色列表 span List span class token operator lt span Long span class token operator gt span userRo
  • myBatisPlus分页查询使用pagehelper插件

    一 pom xml 中版本 span class token operator lt span dependency span class token operator gt span span class token operator l
  • vim常用配置及命令

    如果你是linux初学者 xff0c 会发现linux的编程用的IDE较少 xff0c 没有widows下vc那样编辑器 xff0c 怎么办呢 xff0c 当你安装linux之后 xff0c 好多软件都没有 xff0c OMG xff0c
  • Visual studio C++:LQR轨迹跟踪仿真

    前言 xff1a 因为工作需要开始学习车辆横纵向控制 xff0c 然后学到了LQR xff0c 正好写一个博客把程序保存下来 为了加强C 43 43 代码能力 xff0c 本次仿真的所有文件均用C 43 43 完成 代码结构梳理 开始之前非
  • Android系统权限和root权限

    Android 权限说明 Android 系统是运行在 Linux 内核上的 xff0c Android 与 Linux 分别有自己的一套严格的安全及权限机制 xff0c Android 系统权限相关的内容 xff0c xff08 一 xf
  • SuperMap三维复杂模型建模之3D极坐标建模——原理篇

    作者 xff1a 超图研究院技术支持中心 于丁 随着SuperMap iDesktop 10i 2021 V10 2 1的上线发布 xff0c 为进一步拓展全空间数据模型及其分析计算能力 xff0c 一个新功能 3D极坐标建模 也随着该版本
  • html标签中的<meta charset="utf-8">是什么鬼?

    首先来说明一下 utf 8 是一种字符编码 charset 61 utf 8 是告知浏览器此页面属于什么字符编码格式 xff0c 下一步浏览器做好 翻译 工作 常见的字符编码有 xff1a gb2312 gbk unicode utf 8
  • springboot集成ELK

    ELK是Elasticsearch 43 Logstash 43 Kibana简称 Elasticsearch 是一个分布式的搜索和分析引擎 xff0c 可以用于全文检索 结构化检索和分析 xff0c 并能将这三者结合起来 Elastics
  • 实验 13 EIGRP 路由协议的配置

    一 xff0e 实验目的 掌握路由器 EIGRP 路由协议的配置方法 二 xff0e 实验要点 通过对路由器 A 和路由器 B启用 EIGRP 路由协议 使路由器 A 可 Ping 通路由器 B 所连的各个网络 反之 亦然 三 xff0e
  • 生产环境mysql安装规划及调优实践--mysql8.0.29为例

    以前运维人员部署在生产环境的mysql又被扫描出安全漏洞 xff0c 需要进行修补 这种事情本来应该是很简单的事儿 xff0c 但如今执着于软件领域技术的人是越来越少 xff0c 竟然没有人愿意去做去学 xff0c 都想等着别人去处理 xf
  • 【异常处理】AJAX发送PUT请求的坑(请求数据无法获取)

    发现问题 表单通过PUST请求发送数据给服务器 xff0c 请求体中可以看到数据 但是控制台中接受到的数据都是null 原因 Tomcat xff1a 1 将请求体中的数据 xff0c 封装一个map 2 request getParame
  • IIC协议详解

    文章目录 1 IIC简介2 IIC物理层2 1 IIC硬件2 2 IIC协议特点 3 IIC协议层4数据传输4 1 IIC写数据4 2 IIC读数据 5 信号分析 1 IIC简介 IIC Inter xff0d Integrated Cir
  • TS2717:Property contentRect must be of type DOMRectReadOnly

    首先 在现有旧项目剥离的时候创建的新的项目 新项目应用的 angular13 版本 其中集成 resize observer polyfill 类库的时候抛出了如下异常 TS2717 Property contentRect must be
  • CentOS7.6 安装xrdp远程桌面

    1 系统准备 本篇文章是在CentOS7 6中安装的 xff0c 一般7 x版本都可以 一键安装脚本的GITHUT地址为 https github com MeowLove Linux Remote Desktop Environment
  • HashMap与HashTable、HashSet的区别

    HashTable和HashMap区别 区别一 xff1a 继承的父类不同 Hashtable继承自Dictionary类 xff0c 而HashMap继承自AbstractMap类 但二者都实现了Map接口 public class Ha