【Java学习笔记】33.Java HashSet及HashMap
创始人
2025-05-30 19:53:34

前言

本章介绍Java的HashSet及HashMap。

Java HashSet

HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。

HashSet 允许有 null 值。

HashSet 是无序的,即不会记录插入的顺序。

HashSet 不是线程安全的, 如果多个线程尝试同时修改 HashSet,则最终结果是不确定的。 您必须在多线程访问时显式同步对 HashSet 的并发访问。

HashSet 实现了 Set 接口。
在这里插入图片描述

HashSet 中的元素实际上是对象,一些常见的基本类型可以使用它的包装类。

基本类型对应的包装类表如下:

基本类型引用类型
booleanBoolean
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter

HashSet 类位于 java.util 包中,使用前需要引入它,语法格式如下:

import java.util.HashSet; // 引入 HashSet 类

以下实例我们创建一个 HashSet 对象 sites,用于保存字符串元素:

HashSet sites = new HashSet();

添加元素

HashSet 类提供了很多有用的方法,添加元素可以使用 add() 方法:

实例

// 引入 HashSet 类      
import java.util.HashSet;public class csdnTest {public static void main(String[] args) {HashSet sites = new HashSet();sites.add("Google");sites.add("csdn");sites.add("Taobao");sites.add("Zhihu");sites.add("csdn");  // 重复的元素不会被添加System.out.println(sites);}
}

执行以上代码,输出结果如下:

[Google, csdn, Zhihu, Taobao]

在上面的实例中,csdn 被添加了两次,它在集合中也只会出现一次,因为集合中的每个元素都必须是唯一的。

判断元素是否存在

我们可以使用 contains() 方法来判断元素是否存在于集合当中:

实例

// 引入 HashSet 类      
import java.util.HashSet;public class csdnTest {public static void main(String[] args) {HashSet sites = new HashSet();sites.add("Google");sites.add("csdn");sites.add("Taobao");sites.add("Zhihu");sites.add("csdn");  // 重复的元素不会被添加System.out.println(sites.contains("Taobao"));}
}

执行以上代码,输出结果如下:

true

删除元素

我们可以使用 remove() 方法来删除集合中的元素:

实例

// 引入 HashSet 类      
import java.util.HashSet;public class csdnTest {public static void main(String[] args) {HashSet sites = new HashSet();sites.add("Google");sites.add("csdn");sites.add("Taobao");sites.add("Zhihu");sites.add("csdn");     // 重复的元素不会被添加sites.remove("Taobao");  // 删除元素,删除成功返回 true,否则为 falseSystem.out.println(sites);}
}

执行以上代码,输出结果如下:

[Google, csdn, Zhihu]

删除集合中所有元素可以使用 clear 方法:

实例

// 引入 HashSet 类      
import java.util.HashSet;public class csdnTest {public static void main(String[] args) {HashSet sites = new HashSet();sites.add("Google");sites.add("csdn");sites.add("Taobao");sites.add("Zhihu");sites.add("csdn");     // 重复的元素不会被添加sites.clear();  System.out.println(sites);}
}

执行以上代码,输出结果如下:

[]

计算大小

如果要计算 HashSet 中的元素数量可以使用 size() 方法:

实例

// 引入 HashSet 类      
import java.util.HashSet;public class csdnTest {public static void main(String[] args) {HashSet sites = new HashSet();sites.add("Google");sites.add("csdn");sites.add("Taobao");sites.add("Zhihu");sites.add("csdn");     // 重复的元素不会被添加System.out.println(sites.size());  }
}

执行以上代码,输出结果如下:

4

迭代 HashSet

可以使用 for-each 来迭代 HashSet 中的元素。

实例

// 引入 HashSet 类      
import java.util.HashSet;public class csdnTest {public static void main(String[] args) {HashSet sites = new HashSet();sites.add("Google");sites.add("csdn");sites.add("Taobao");sites.add("Zhihu");sites.add("csdn");     // 重复的元素不会被添加for (String i : sites) {System.out.println(i);}}
}

执行以上代码,输出结果如下:

Google
csdn
Zhihu
Taobao

Java HashMap

HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。

HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 null,不支持线程同步。

HashMap 是无序的,即不会记录插入的顺序。

HashMap 继承于AbstractMap,实现了 Map、Cloneable、java.io.Serializable 接口。
在这里插入图片描述

HashMap 的 key 与 value 类型可以相同也可以不同,可以是字符串(String)类型的 key 和 value,也可以是整型(Integer)的 key 和字符串(String)类型的 value。

HashMap 中的元素实际上是对象,一些常见的基本类型可以使用它的包装类。

基本类型对应的包装类表如下:

基本类型引用类型
booleanBoolean
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter

HashMap 类位于 java.util 包中,使用前需要引入它,语法格式如下:

import java.util.HashMap; // 引入 HashMap 类

以下实例我们创建一个 HashMap 对象 Sites, 整型(Integer)的 key 和字符串(String)类型的 value:

HashMap Sites = new HashMap();

添加元素

HashMap 类提供了很多有用的方法,添加键值对(key-value)可以使用 put() 方法:

实例

// 引入 HashMap 类      
import java.util.HashMap;public class csdnTest {public static void main(String[] args) {// 创建 HashMap 对象 SitesHashMap Sites = new HashMap();// 添加键值对Sites.put(1, "Google");Sites.put(2, "csdn");Sites.put(3, "Taobao");Sites.put(4, "Zhihu");System.out.println(Sites);}
}

执行以上代码,输出结果如下:

{1=Google, 2=csdn, 3=Taobao, 4=Zhihu}

以下实例创建一个字符串(String)类型的 key 和字符串(String)类型的 value:

实例

// 引入 HashMap 类      
import java.util.HashMap;public class csdnTest {public static void main(String[] args) {// 创建 HashMap 对象 SitesHashMap Sites = new HashMap();// 添加键值对Sites.put("one", "Google");Sites.put("two", "csdn");Sites.put("three", "Taobao");Sites.put("four", "Zhihu");System.out.println(Sites);}
}

执行以上代码,输出结果如下:

{four=Zhihu, one=Google, two=csdn, three=Taobao}

访问元素

我们可以使用 get(key) 方法来获取 key 对应的 value:

实例

// 引入 HashMap 类      
import java.util.HashMap;public class csdnTest {public static void main(String[] args) {// 创建 HashMap 对象 SitesHashMap Sites = new HashMap();// 添加键值对Sites.put(1, "Google");Sites.put(2, "csdn");Sites.put(3, "Taobao");Sites.put(4, "Zhihu");System.out.println(Sites.get(3));}
}

执行以上代码,输出结果如下:

Taobao

删除元素

我们可以使用 remove(key) 方法来删除 key 对应的键值对(key-value):

实例

// 引入 HashMap 类      
import java.util.HashMap;public class csdnTest {public static void main(String[] args) {// 创建 HashMap 对象 SitesHashMap Sites = new HashMap();// 添加键值对Sites.put(1, "Google");Sites.put(2, "csdn");Sites.put(3, "Taobao");Sites.put(4, "Zhihu");Sites.remove(4);System.out.println(Sites);}
}

执行以上代码,输出结果如下:

{1=Google, 2=csdn, 3=Taobao}

删除所有键值对(key-value)可以使用 clear 方法:

实例

// 引入 HashMap 类      
import java.util.HashMap;public class csdnTest {public static void main(String[] args) {// 创建 HashMap 对象 SitesHashMap Sites = new HashMap();// 添加键值对Sites.put(1, "Google");Sites.put(2, "csdn");Sites.put(3, "Taobao");Sites.put(4, "Zhihu");Sites.clear();System.out.println(Sites);}
}

执行以上代码,输出结果如下:

{}

计算大小

如果要计算 HashMap 中的元素数量可以使用 size() 方法:

实例

// 引入 HashMap 类      
import java.util.HashMap;public class csdnTest {public static void main(String[] args) {// 创建 HashMap 对象 SitesHashMap Sites = new HashMap();// 添加键值对Sites.put(1, "Google");Sites.put(2, "csdn");Sites.put(3, "Taobao");Sites.put(4, "Zhihu");System.out.println(Sites.size());}
}

执行以上代码,输出结果如下:

4

迭代 HashMap

可以使用 for-each 来迭代 HashMap 中的元素。

如果你只想获取 key,可以使用 keySet() 方法,然后可以通过 get(key) 获取对应的 value,如果你只想获取 value,可以使用 values() 方法。

实例

// 引入 HashMap 类      
import java.util.HashMap;public class csdnTest {public static void main(String[] args) {// 创建 HashMap 对象 SitesHashMap Sites = new HashMap();// 添加键值对Sites.put(1, "Google");Sites.put(2, "csdn");Sites.put(3, "Taobao");Sites.put(4, "Zhihu");// 输出 key 和 valuefor (Integer i : Sites.keySet()) {System.out.println("key: " + i + " value: " + Sites.get(i));}// 返回所有 value 值for(String value: Sites.values()) {// 输出每一个valueSystem.out.print(value + ", ");}}
}

执行以上代码,输出结果如下:

key: 1 value: Google
key: 2 value: csdn
key: 3 value: Taobao
key: 4 value: Zhihu
Google, csdn, Taobao, Zhihu,

Java HashMap 方法

hashmap
Java HashMap 常用方法列表如下:

方法描述
clear()删除 hashMap 中的所有键/值对
clone()复制一份 hashMap
isEmpty()判断 hashMap 是否为空
size()计算 hashMap 中键/值对的数量
put()将键/值对添加到 hashMap 中
putAll()将所有键/值对添加到 hashMap 中
putIfAbsent()如果 hashMap 中不存在指定的键,则将指定的键/值对插入到 hashMap 中。
remove()删除 hashMap 中指定键 key 的映射关系
containsKey()检查 hashMap 中是否存在指定的 key 对应的映射关系。
containsValue()检查 hashMap 中是否存在指定的 value 对应的映射关系。
replace()替换 hashMap 中是指定的 key 对应的 value。
replaceAll()将 hashMap 中的所有映射关系替换成给定的函数所执行的结果。
get()获取指定 key 对应对 value
getOrDefault()获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值
forEach()对 hashMap 中的每个映射执行指定的操作。
entrySet()返回 hashMap 中所有映射项的集合集合视图。
keySet()返回 hashMap 中所有 key 组成的集合视图。
values()返回 hashMap 中存在的所有 value 值。
merge()添加键值对到 hashMap 中
compute()对 hashMap 中指定 key 的值进行重新计算
computeIfAbsent()对 hashMap 中指定 key 的值进行重新计算,如果不存在这个 key,则添加到 hasMap 中
computeIfPresent()对 hashMap 中指定 key 的值进行重新计算,前提是该 key 存在于 hashMap 中。

相关内容

热门资讯

数据结构---队列 专栏:数据结构 个人主页:HaiFan. 专栏简介:这里是...
数字操作方法 系列文章目录 前端系列文章——传送门 JavaScript系列文章——传送门 文章目录系列文章目录...
Cartesi 2023 年 ... 查看 Cartesi Machine、Cartesi Rollups 和 Noether 的更新正在...
JavaWeb——jsp概述入... JSP定义:  在如下一个jsp文件里面有如下的代码  <%@ page content...
一切喜怒哀乐都来自于你的认知 01 有个学子,准备出国,父母请来清华的教授宁向东。请问教授࿱...
JAVA并发编程——synch... 引言         Java语言为了解决并发编程中存在的原子性、可见性和有序性问题,...
git学习----3.21 未... 文章目录前言Git :一个分布式版本控制工具目标一、概述1.1 开发中的实际场景1.2...
Qt优秀开源项目之十七:QtP... QtPromise是Promises/A+规范的Qt/C++实现。该规范的译...
【前端八股文】JavaScri... 文章目录Set概念与arr的比较属性和方法并集、交集、差集Map概念属性和方法String用索引值和...
海康硬盘录像机接入RTSP/o... EasyNVR安防视频云服务平台可支持设备通过RTSP/Onvif协议接入平台,能提供...
在混合劳动力时代如何避免网络安... 在混合劳动力时代如何避免安全网络风险 三年多来,混合工作一直是工作生活中不可或缺的一...
2023还不懂Jmeter接口... 这里介绍的Jmeter接口测试的的实战,如果文章内容没遇看懂的话,我这边...
基于4G/5G弱网聚合的多链路... 基于4G/5G多卡聚合(弱网聚合)的智能融合通信设备技术亮点 增强带宽提供可靠连接 通过将多个有线和...
如何使用Synplify综合v... 文章目录使用Synplify综合的好处synplify的教程方法1(无效)...
2023年全国最新高校辅导员精... 百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等ÿ...
2022年18个值得期待的Le... 有数百个独特的LearnDash附加组件,您可能很难选择您的LearnDash LMS...
【java基础】Stream流... 文章目录基本介绍流的创建流的各种常见操作forEach方法filter方法map方法peek方法fl...
javaweb高校行政办公自动... 本课题基于我国高校管理信息化建设现状,结合在实际工作中所遇到的问题和收获,...
一款专门为自动化测试打造的集成... 你好,我是不二。 随着行业内卷越来越严重,自动化测试已成为测试工程师的...
【go-zero】golang... 一、casbin 概览 1、casbin基本了解 casbin的GitHub:https://git...
现在开发低代码平台算晚吗? 现在开发低代码平台算晚吗?作为低代码的亲戚——零代码厂商,这篇就以“厂商...
【JavaWeb】书城项目(2... 222.书城项目-第三阶段:修改所有html页面为jsp页面 改成jsp页面之后&#x...
基于jeecgboot的大屏设...      通过前面设计好数据源后,就要进行数据集的设计了。      一、还是在onl...
Linux命令小技巧:显示文件... 工作中会有很多千奇百怪的需求,比如:如何在 Linux 命令行中快速找到...
【找工作】-- 大数据工程师找... 目录 1.前言 2.找工作的理论知识 2.1 分析个人特征 2.1.1 你自身优势是什么?
C++基础算法④——排序算法(... 排序算法 1.插入排序 2.桶排序 1.插入排序 基本思想:将初始数据分为有序部分和...
nginx快速入门.跟学B站n... nginx快速入门.跟学B站nginx一小时精讲课程笔记nginx简介及环境准备nginx简介环境准...
ORACLE存过互相调用之间事... 今天在问答区看到一个问题是 假如有procedureA、procedureB和procedureC&...
基于java中Springbo... 基于java中Springboot框影视影院订票选座管理系统 开发语言:Java 框...
CVE-2018-18086 最近闲来无事,看到青少年CTF平台,感觉对新手还是比较友好的࿰...