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 的键存储元素
相关文章:
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…...

CPP初级:模板的运用!
目录 一.泛型编程 二.函数模板 1.函数模板概念 2.函数模板格式 3.函数模板的原理 三.函数模板的实例化 1.隐式实例化 2.显式实例化 3.模板参数的匹配原则 四.类模板 1.类模板的定义格式 2.类模板的实例化 一.泛型编程 泛型编程:编写与类型无关的通用代码…...
排序---基数排序
前言 个人小记 一、简介 基数排序是一种非比较排序,所以排序速度较快,当为32位int整数排序时,可以将数分为个位十位分别为2^16,使得拷贝只需要两轮,从而达到2*n,然后给一个偏移量,使得可以对负数排序。以…...

“新高考”下分班怎么分?
来自安徽的张女士告诉我:上一年孩子升入了高中,但没想到才高一,孩子就面临了一个困难的挑选:312”分班! 什么是312”分班呢?许多人或许不明白,便是要求学生在高一入学时,针对于3门必…...
二叉树的层序遍历-力扣
本题是二叉树的层序遍历,通过一个队列来控制遍历的节点,二叉树每层的节点和上一层入队的节点个数是相同的,根据这一点编写循环条件。 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* …...

N32G45XVL-STB之移植LVGL(lvgl-8.2.0)
目录 概述 1 软硬件介绍 1.1 软件版本信息 1.2 ST7796-LCD 1.3 MCU IO与LCD PIN对应关系 2 认识LVGL 2.1 LVGL官网 2.2 LVGL库文件下载 3 移植LVGL 3.1 准备移植文件 3.2 添加lvgl库文件到项目 3.2.1 src下的文件 3.2.2 examples下的文件 3.2.3 配置文件路径 3.2…...
【设计模式】创建型设计模式之 原型模式
介绍 原型模式是一种创建型设计模式,主要用于创建重复的对象,而无需重新初始化它们,从而提高效率并简化对象的创建过程。此模式的核心思想是利用已存在的对象实例,通过复制(克隆)的方式来生成新的对象&…...

【类型商店】字符字符串(下)
啊,哈喽,小伙伴们大家好。我是#Y清墨,今天呐,我要介绍的是字符与字符串。 导语 前两期,我们已经懂得了概念,今天来看些函数。 正题 一.增加或连接 (1) 后面增加() string s1,s2; //定义 s…...

『 Linux 』内存管理与文件系统
文章目录 交换分区页与页框(页帧)交换分区与内存之间的交换操作系统如何管理内存物理地址转换页号与页内偏移量 内存管理,文件系统与文件管理之间的联系 交换分区 在Linux的安装过程中,用户将会被提示创建一个交换分区; 这是一个特殊的分区,其大小可以由用户根据系统内存需求和…...

线性代数|机器学习-P8矩阵低秩近似eckart-young
文章目录 1. SVD奇异值分解2. Eckart-Young2.1 范数 3. Q A Q U Σ V T QAQU\Sigma V^T QAQUΣVT4. 主成分分析图像表示 1. SVD奇异值分解 我们知道,对于任意矩阵A来说,我们可以将其通过SVD奇异值分解得到 A U Σ V T AU\Sigma V^T AUΣVT࿰…...

平面设计神器CorelDRAW2021精简版,你值得拥有!
亲爱的设计师小伙伴们,今天我要为大家种草一款神奇的软件——CorelDRAW平面设计软件2021精简版!🤩✨作为一名专业的图形设计师,我深知一个好工具对于我们的工作有多么重要。而这款软件简直就是我们设计师的救星!&#…...
kafka是什么?
Kafka是一个由Apache软件基金会开发的开源流处理平台,最初由LinkedIn公司开发,使用Scala和Java编写。它是一个高吞吐量的分布式发布订阅消息系统,可以处理消费者在网站中的所有动作流数据,如网页浏览、搜索和其他用户行为等。Kafk…...
ABC351
C 栈的应用 #include<bits/stdc.h>using namespace std;stack<int>stk;int main() {int n;cin>>n;for(int i1;i<n;i){int a;cin>>a;while(!stk.empty()&&astk.top()){stk.pop();a;}stk.push(a);}cout<<stk.size()<<endl;retur…...
base上海,数据科学,数据挖掘,数据分析等岗位求收留
裁员了,base上海,数据科学,数据挖掘,数据分析等岗位,期望30k~40k,求推荐求收留 1,6年数据算法工作,做过指标体系搭建,用户画像,货品定价,社区分析…...

IC元器件
1.电阻: 电阻的作用: 1.与负载串联:做限流分压 2.电阻并联:将小功率电阻并联成大功率,防烧毁 2.电容: 电容就是两块金属板+中间的介质(相当于两个人坐在一起加上中间的空气…...

SQL159 每个创作者每月的涨粉率及截止当前的总粉丝量
描述 用户-视频互动表tb_user_video_log iduidvideo_idstart_timeend_timeif_followif_likeif_retweetcomment_id110120012021-09-01 10:00:002021-09-01 10:00:20011NULL210520022021-09-10 11:00:002021-09-10 11:00:30101NULL310120012021-10-01 10:00:002021-10-01 10:00…...

Linux安装MySQL教程【带图文命令巨详细】
巨详细Linux安装MySQL 1、查看是否有自带数据库或残留数据库信息1.1检查残留mysql1.2检查并删除残留mysql依赖1.3检查是否自带mariadb库 2、下载所需MySQL版本,上传至系统指定位置2.1创建目录2.2下载MySQL压缩包 3、安装MySQL3.1创建目录3.2解压mysql压缩包3.3安装解…...

外部排序快速入门详解:基本原理,败者树,置换-选择排序,最佳归并树
文章目录 外部排序1.最基本的外部排序原理2.外部排序的优化2.1 败者树优化方法2.2 置换-选择排序优化方法2.3 最佳归并树 外部排序 为什么要学习外部排序? 答: 在处理数据的过程中,我们需要把磁盘(外存)中存储的数据拿到内存中处理…...

人工智能和物联网如何结合
欢迎来到 Papicatch的博客 目录 🍉引言 🍉AI与IoT的结合方式 🍈数据处理和分析 🍍实例 🍈边缘计算 🍍实例 🍈自动化和自主操作 🍍实例 🍈安全和隐私保护 &…...

【JAVASE】JAVA应用案例(下)
一:抢红包 一个大V直播时,发起了抢红包活动,分别有9,666,188,520,99999五个红包。请模拟粉丝来抽奖,按照先来先得,随机抽取,抽完即止,注意:一个红包只能被抽一次,先抽或…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...

短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...

springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...

MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...

C++--string的模拟实现
一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现,其目的是加强对string的底层了解,以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量,…...

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡
何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践,很多人以为AI已经强大到不需要程序员了,其实不是,AI更加需要程序员,普通人…...