java面试题: HashMap、HashSet 和 HashTable 的区别

 

HashMap 常用方法

 

HashMap 是一个基于哈希表的 Map 接口的实现。它允许使用 null 值和 null 键。

 

java

复制

// 创建一个HashMap

HashMap<KeyType, ValueType> map = new HashMap<>();

 

// 添加元素

map.put(key, value);

 

// 获取元素

ValueType value = map.get(key);

 

// 删除元素

map.remove(key);

 

// 替换元素

map.replace(key, newValue);

 

// 如果指定的键尚未与值关联(或其值为null),则将其与该值关联

map.putIfAbsent(key, value);

 

// 判断键/值是否存在

boolean containsKey = map.containsKey(key);

boolean containsValue = map.containsValue(value);

 

// 获取集合

Set<KeyType> keySet = map.keySet();

Collection<ValueType> values = map.values();

Set<Map.Entry<KeyType, ValueType>> entrySet = map.entrySet();

 

// 遍历Map

for (Map.Entry<KeyType, ValueType> entry : map.entrySet()) {

    KeyType key = entry.getKey();

    ValueType value = entry.getValue();

    // ...

}

 

// 其他常用方法

int size = map.size();

boolean isEmpty = map.isEmpty();

map.clear(); // 清空HashMap

 

HashSet 常用方法

 

HashSet 是一个不允许出现重复元素的集合。它基于 HashMap 实现,因此不包含重复元素的特性是由 HashMap 的键的唯一性保证的。

 

java

复制

// 创建一个HashSet

HashSet<ElementType> set = new HashSet<>();

 

// 添加元素

set.add(element);

 

// 删除元素

set.remove(element);

 

// 判断元素是否存在

boolean contains = set.contains(element);

 

// 遍历HashSet

for (ElementType element : set) {

    // ...

}

 

// 其他常用方法

int size = set.size();

boolean isEmpty = set.isEmpty();

set.clear(); // 清空HashSet

 

Hashtable 常用方法(不推荐使用)

 

Hashtable 是一个同步的 Map 接口的实现,因此是线程安全的。然而,由于同步的开销,它通常比 HashMap 慢。在现代Java开发中,Hashtable 很少被使用,因为它已经被 ConcurrentHashMap 所取代,后者提供了更好的并发性能。

 

java

复制

// 创建一个Hashtable

Hashtable<KeyType, ValueType> table = new Hashtable<>();

 

// 大部分方法与HashMap相同,但由于Hashtable是同步的,

// 所以其方法调用可能会有额外的性能开销。

 

// 示例:添加元素

table.put(key, value);

 

// 示例:获取元素

ValueType value = table.get(key);

 

// ... 其余方法与HashMap类似

 

 

注意:

 

由于 Hashtable 是同步的,因此在多线程环境下,如果你不需要同步,使用 HashMap 会更加高效。如果你需要并发安全的 Map,建议使用 ConcurrentHashMap。

HashMap 和 HashSet 的迭代顺序并不是基于插入顺序的,而是基于哈希码的。如果需要有序的集合,请考虑使用 LinkedHashMap 或 LinkedHashSet。

在使用集合时,要注意 null 值的处理。HashMap 允许使用 null 键和 null 值,但 HashSet 不允许 null 元素(因为 null 键在 HashMap 中是允许的,但 HashSet 是基于 HashMap 的键集合实现的)。而 Hashtable 也不允许使用 null 键或 null 值。

 1. 同步性(Synchronization):

 • HashMap: 不是同步的,不保证线程安全。多个线程同时访问和修改 HashMap 可能导致不确定的行为。典型情景: 实现一个缓存机制,需要高效地存储键值对。

 • HashSet: 与 HashMap 一样,也不是同步的。 典型情景: 需要存储一组唯一的元素。HashSet 确保元素的唯一性,并且对于基本操作(如添加、删除和包含)具有常数时间性能。

 • HashTable: 是同步的,对其操作进行了同步处理,可以用于多线程环境。

但是现实生活中需要线程安全的情况下我们较多使用ConcurrentHashmap。

 

 2. Null 元素:

 • HashMap: 允许一个键为 null,允许多个值为 null。

 • HashSet: 允许一个元素为 null。

 • HashTable: 不允许键或值为 null。

 

 3. 继承关系:

 • HashMap: 继承自 AbstractMap 类,实现了 Map 接口。

 • HashSet: 实现了 Set 接口,底层通过 HashMap 实现。

 • HashTable: 继承自 Dictionary 类,实现了 Map 接口。

 

HashSet、LinkedHashSet 和 TreeSet 的区别:

 

 1. 顺序性:

 • HashSet: 不保证元素的顺序,可能会发生变化。

 • LinkedHashSet: 保持元素插入的顺序,迭代顺序与插入顺序一致。

 • TreeSet: 保持元素的自然顺序或者通过构造函数提供的 Comparator 进行排序。

 2. 底层数据结构:

 • HashSet: 基于 HashMap 实现,使用 HashMap 的键存储元素。

 • LinkedHashSet: 基于 LinkedHashMap 实现,使用 LinkedHashMap 的键存储元素。

 • TreeSet: 基于 TreeMap 实现,使用 TreeMap 的键存储元素

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/25423.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二分#背包#快排#LCS详解

二分#背包#快排#LCS详解 文章目录 二分#背包#快排#LCS详解1. 二分搜索2. 01背包问题3. 快速排序4. 最长公共子序列 1. 二分搜索 在处理大规模数据集时&#xff0c;查找操作的效率显得尤为重要。二分搜索是一种在有序数组中查找目标值的高效算法&#xff0c;其时间复杂度为O(lo…

集群与分片:深入理解及应用实践

目录 引言什么是集群&#xff1f; 集群的定义集群的类型 什么是分片&#xff1f; 分片的定义分片的类型 集群与分片的关系集群的应用场景 负载均衡高可用性 分片的应用场景 大数据处理数据库分片 集群与分片的架构设计 系统架构设计数据存储设计 案例分析 Hadoop 集群Elastics…

【python报错】关于 xlrd.biffh.XLRDError: Excel xlsx file; not supported 解决方法【已解决】

【Python报错】关于xlrd.biffh.XLRDError: Excel xlsx file; not supported解决方法【已解决】 在使用Python进行数据分析时&#xff0c;经常需要处理Excel文件。xlrd库是一个流行的用于读取Excel文件的库&#xff0c;但如果你在使用xlrd打开.xlsx文件时遇到了xlrd.biffh.XLRDE…

区块链(Blockchain)调查研究(一)

文章目录 1. 区块链是什么&#xff1f;2. 区块链分类和特点3. 区块链核心关键技术3.1 共识机制3.2 密码学技术3.4 分布式存储3.5 智能合约 4. 区块链未来发展趋势5. 区块链能做什么、不能做什么&#xff1f;5.1 第一部分5.2 第二部分5.3 第三部分&#xff08;结论&#xff09; …

新书推荐:2.3 消息机制

Windows程序的消息机制是指在Windows操作系统下&#xff0c;应用程序与操作系统之间的一种通信方式。通过消息机制&#xff0c;应用程序可以接收来自操作系统的各种事件和请求&#xff0c;以便做出相应的响应和处理。 在Windows程序中&#xff0c;消息机制的实现是基于消息队列…

用 Axios 封装一个双 token 无感刷新

为什么要用双Token无感刷新&#xff0c;它解决了什么问题&#xff1f; 为了保证安全性&#xff0c;后端设置的Token不可能长期有效&#xff0c;过了一段时间Token就会失效。而发送网络请求的过程又是需要携带Token的&#xff0c;一旦Token失效&#xff0c;用户就要重新登陆&…

前台怎么调用Oracle proc过程

前台调用Oracle PROC过程通常涉及几种不同的方法&#xff0c;具体取决于你的前台应用程序所使用的技术和框架。以下是一些常见的方法&#xff0c;以及如何在前台调用Oracle PROC过程的详细步骤&#xff1a; 1. 使用PL/SQL Developer或其他SQL工具 直接调用&#xff1a;在PL/S…

将操作与数据分离 - 面向数据编程 v1.1

面向数据编程 (DOP) 非常注重数据&#xff0c;此次讨论的原则涉及实现大多数域逻辑的方法&#xff0c;它建议将操作与数据分开。 1.示例场景 此次讨论面向数据编程 v1.1的将操作与数据分离原则的具体示例是以销售平台作为示例&#xff0c;该平台销售书籍、家具和电子设备&…

欢乐打地鼠小游戏html源码

这是一款简单的js欢乐打地鼠游戏&#xff0c;挺好玩的&#xff0c;老鼠出来用鼠标点击锤它&#xff0c;击中老鼠获得一积分。 欢乐打地鼠小游戏html源码

kopf,一个实用的 Python 库!

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个实用的 Python 库 - kopf。 Github地址&#xff1a;https://github.com/nolar/kopf 在 Kubernetes 中&#xff0c;Operator 是一种用于扩展 Kubernetes 功能的强大工具。Operator 可以自动化应…

MySQL之查询性能优化(十三)

查询性能优化 优化LIMIT分页 在系统中需要进行分页操作的时候&#xff0c;我们通常会使用LIMIT加上偏移量的办法实现&#xff0c;同时加上合适的ORDER BY子句。如果有对应的索引&#xff0c;通常效率会不错&#xff0c;否则&#xff0c;MySQL需要做大量的文件排序操作。一个非…

【Python】成功解决TypeError: ‘int’ object is not iterable

【Python】成功解决TypeError: ‘int’ object is not iterable &#x1f308; 欢迎莅临我的个人主页&#x1f448;这里是我深耕Python编程、机器学习和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;并乐于分享知识与经验的小天地&#xff01;&#x1f387; &#…

MySQL的group by与count(), *字段使用问题

文章目录 问题group by到底做了什么举个例子简单来说为什么select字段&#xff0c;count()不能和*共同使用总结 问题 这是一段摘抄自MySQL官网的文字。其大致意思是MySQL拓展了group by的使用&#xff0c;MySQL允许选择没有出现在group by中的字段。换句话说&#xff0c;标准SQ…

【Python】成功解决ZeroDivisionError: division by zero

【Python】成功解决ZeroDivisionError: division by zero &#x1f308; 欢迎莅临我的个人主页&#x1f448;这里是我深耕Python编程、机器学习和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;并乐于分享知识与经验的小天地&#xff01;&#x1f387; &#x1f393…

【QT5.14.2】编译MQTT库example的时候报No such file or directory

【QT5.14.2】编译MQTT库example的时候报No such file or directory 前几天导师让跑一下MQTT库&#xff0c;用的5.14.2版本的QT&#xff0c;于是就上网搜了一个教程&#xff1a;https://www.bilibili.com/video/BV1dH4y1e7hG/?spm_id_from333.337.search-card.all.click&v…

Fedora的远程桌面

要在 Fedora 40 上开启远程桌面功能。 首先&#xff0c;要确保已安装 gnome-remote-desktop 和 vino 包。 这些软件包通常默认安装在 Fedora 的 GNOME 桌面环境中。 可以按照以下步骤操作&#xff1a; 1、判断电脑是否安装了 gnome-remote-desktop 和 vino 包: tomfedora:…

第十三周 5.28 三个修饰符知识点

一、abstract[抽象的] 1.abstract可以修饰类: (1&#xff09;被abstract修饰的类称为抽象类 (2) 语法:abstract class 类名{} (3) 特点:抽象类只能声明引用&#xff0c;不能创建对象 (4) 抽象类中可以定义属性和成员方法、构造方法 2.abstr…

SpringSecurity提供了哪些核心功能?

Spring Security 是一个强大且高度可定制的身份验证和访问控制框架&#xff0c;它是为保护基于Spring的应用程序而设计的。Spring Security 提供了下列核心功能&#xff1a; 1. 全面的身份验证支持 Spring Security 支持广泛的身份验证机制&#xff0c;包括表单基础认证、HTT…

【Linux】匿名管道的应用场景 --- 进程池

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…

Tomcat中轻松部署Java Web项目

Tomcat 是一个广泛使用的 Java Servlet 容器和 Web 服务器&#xff0c;它允许你部署 Java Web 应用程序。以下是使用 Tomcat 部署 Java 项目的基本步骤&#xff1a; 1. 准备 Java 项目 确保你的 Java 项目是一个 Web 应用程序&#xff0c;即它包含了一个 WEB-INF 目录&#x…