Java[集合] Map 和 Set

news2025/1/20 6:00:53
哈喽,大家好~ 我是保护小周ღ,本期为大家带来的是 Java Map 和 Set 集合详细介绍了两个集合的概念及其常用方法,感兴趣的朋友可以来学习一下。更多精彩敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★* ‘

一、初识 Map 和 Set 集合

首先Map 和 Set 是Java内置的一种专门进行搜索的“容器”同时也是一种数据结构。

我们一般把搜索的数据称之为关键字 (key), 与关键字 key 对应的为值(value),这种模型统称为

“key -value 的键值对”。

Map 采用的是 key - Value 模型,例如:有一个字符串,统计其中每个字符出现的次数,

Set 是 key 模型

什么意思呢,通俗来讲就是只存储出现过的数据且相同数据只存储一个,就是去重,也可以快速判断,某个数据是否存在于Set 集合中。

整体集合框架:


二、如何使用Map

由上图可见,Map 没有继承于 Collection 接口。

Collection接口简介:

Collection抽象的接口,它主要有List和Set两个分支,List和Set也是接口List是一个有序的队列,List中可以有重复的元素;Set中不允许有重复元素存在。
Collection中有一个iterator()函数,它的作用是返回一个Iterator接口。通常,我们通过Iterator迭代器来遍历集合。ListIterator是List接口所特有的,在List接口中,通过ListIterator()返回一个ListIterator对象。
Collection包含了集合的基本操作:添加、删除、清空、遍历、是否为空、获取大小、是否保护某元素等等操作,极大的较少了代码的冗余。

Map 没有继承 Collection 接口,所以关于集合的基本操作Map 有自己的一套逻辑。

Map 是一个接口,不能直接实例化对象,只能是继承Map 接口的 TreeMap,HashMap,这两个实例化对象稍后再着重讲解。

2.1 Map的常用方法

get (Object key)

返回 key 对应的 value

getOrDefault(Object key, V defaultValue)

返回 key 对应的 value,key 不存在,返回默认值

put(K key, V value)

设置 key 对应的 value

remove(Object key)

删除 key 对应的映射关系

Set<K> keySet()

返回所有 key 的不重复集合

Collection<V> values()

返回所有 value 的可重复集合

Set<Map.Entry<K, V>> entrySet()

返回所有的 key-value 映射关系

boolean containsKey(Object key)

判断是否包含 key

boolean containsValue(Object value)

判断是否包含 value

Map中存放键值对的Key是唯一的,value是可以重复的, Map 在添加的过程中,如果遇到相同的Key值,只保留Value 值大的存储,例如: k = a , val = 2, 添加 k = a, val = 3 时, val 值将会被替换为 3

例如:字符串aabcddeb 怎样被Map 集合存储、使用我们将用这个例子给大家演示 Map的常用方法。

public class Test4 {
    public static void main(String[] args) {
        String str = "aabcddeb";
        //使用 Map 统计每个字符出现的次数
        Map<Character,Integer> map = new HashMap<>(); //这里使用 HashMap 来实例化
        for (int i = 0; i < str.length(); i++) { //遍历字符串的元素
            char ch = str.charAt(i);
            if(!map.containsKey(ch)) {//如果字符ch 不存在于map 集合中
                map.put(ch,1); //ch直接存放于集合中
            } else { //如果当前字符存在于集合中
                map.put(ch,map.get(ch) + 1); //使用 put 方法设置 key值对应的val 值
                //get方法是是返回key值对应的 value值 + 1 以此来实现字符个数的偷统计
            }
        }
    }
}

2.1.1 getOrDefault


2.1.2 Set<K> keySet()

Set 集合可以通过Iterator迭代器来遍历集合。

Map 中的Key 可以由键值对分离出来,存储到 Set 集合中,


2.1.3 Collection<V> values()

因为 Map 集合没有继承 Collection 集合,也就没有继承迭代器,所以这是Map 集合自己内置的迭代

Map中的value可以全部分离出来,存储在Collection集合 的任何一个子集合中,例如List, ArrayList……


2.2 Map方法的使用说明

Map.Entry<K, V> 是Map内部实现的用来存放<key, value>键值对映射关系的内部类,该内部类中主要提供了<key, value>的获取,value的设置以及Key的比较方式。

注意:Map.Entry<K,V>并没有提供设置Key的方法,无法单独对 Key 进行修改。

当我们使用Map 集合, 常用方法详解

  1. 当我们输入(key, value)键值对,key值不能为空,但是value 可以为空, key 值为空时会抛出空指针异常。

  1. 当我们输入(key, value)键值对,如果key 值已经存在, value 值会替代原先 key 值对应的 value 值, put(key,value) 方法返回更新前的 value 值。

  1. get(key) 方法返回 key 对应的 value 值,如果 key 值不存在,返回 null

  1. getOrDefault(Object key, V defaultValue), 返回 key 对应的 value,key 不存在,返回我们设置的默认值,例如 getOrDefault("张三", “学生”),如果map集合中张三不存在,返回我们设置的“学生”。

  1. containKey(key), 判断 key 值是否被包含在 Map 中,时间复杂度:O(logN), 底层是哈希表,哈希。该方法返回 boolean 类型,存在 true,不存在返回 false,

  1. containValue(value),判断 value 是否包含在Map 中,时间复杂度是 O(N),返回值是boolean。

  1. keySet() ,可以将 map 中所有的key 值,放置在 set 集合中,注意: map 返回的 key 值是不重复的,Set 集合的特点也是存储不重复的 value 值。

  1. values() ,可以将map 中所有的 value 值放在 Collect 的任意一个集合中返回,需要迭代。

  1. entrySet() 将Map 中的键值对放在 Set 中返回,什么意思呢,<key , value>作为一个整体放在 Set 集合中,二者之间具有关联性,就不会被单独修改了。


Map 是一个接口,不能直接实例化对象,只能是继承Map 接口的 TreeMap,HashMap,这两个实例化对象,那么 TreeMap 和 HashMap 有什么区别:

HashMap:

基于哈希表实现。使用HashMap要求添加的键类明确定义了hashCode()和equals()[可以重写hashCode()和equals()],为了优化HashMap空间的使用,可以调优初始容量和负载因子。

JDK1.6 后添加了红黑树的逻辑,默认是哈希表的长度达到 8 就转成红黑树,而当长度降到 6 就转换回去哈希表。

TreeMap:

基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态,红黑树的本质就是一棵二叉查找树

两种常规Map性能

  1. HashMap的底层是Array + 链表的结构,所以HashMap在添加,查找,删除等方法上面速度会非常快,hashmap 集合中的键值对是无序的,录入数据的顺序与 输出的顺序不保证是一样的,例如:录入,“张三”,1 , “李四”,1, 遍历 map 打印的结果可能是先 “李四”,1,“张三”,1 ,因为当 hashmap 扩容时,集合中所有的元素都需要重新哈希!

  1. TreeMap适用于按自然顺序或自定义顺序遍历键(key),底层想象成是一棵有序的二叉树,每插入一个数据或者删除一个数据,TreeMap 就需要重新调整二叉树。

两者各有千秋,在实际运用中按需创建。

Map<Character,Integer> hashMap = new HashMap<>();
Map<Character,Integer> treeMap = new TreeMap<>();

三、如何使用 Set

Set与Map主要的不同有两点:Set是继承自Collection的接口类,Set中只存储了Key。

3.1 Set 的常用方法


3.2 Set 的注意事项

  1. Set是继承自Collection的一个接口类,支持迭代遍历

  1. Set中只存储key 值,并且要求key一定要唯一(不重复),所以我们可以使用 Set 集合来去重

  1. Set中的Key不能修改,如果要修改,先将原来的删除掉,然后再重新插入

  1. Set中不能插入null的key

  1. 同一个 Set 集合对象只能存储 同一数据类型

Set 集合也是一个接口,Set的实现主要有以下结构

  • HashSet集合,底层是HashMap,哈希表+红黑树

  • TreeSet集合,底层是一个自平衡红黑树,保证元素的顺序

  • LinkedHashSet集合:底层是哈希表+双向链表组成

 Set<Character> hashSet = new HashSet<>();
 Set<Character> treeSet = new TreeSet<>();
 Set<Character> linkHaSet = new LinkedHashSet<>();

我们经常使用的是 hashSet 和 treeSet, 二者之间的区别,与 Map 集合 的 hashMap 和 treeMap 类似


3.3 Set 常用方法使用说明

add(key) 如果 key 值不存在与 set 集合中,则插入,返回 true, 重复则返回 false, 如果key 值为空,会抛出空指针异常 add(null),。

contains(key) 如果key 存在集合中 ,返回true, 否则返回 false。

remove(key) 如果key 值存在,删除成功返回 true, key 不存在 删除失败返回 false, key 为空抛出空指针异常。


到这里,关于Java Map 和 Set 集合的基本认识和使用已经讲完啦~,希望对大家有所帮助,如有不妥之处欢迎批评指正。

本期收录于博主的专栏——Java数据结构,适用于编程初学者,感兴趣的朋友们可以订阅,查看其它“数据结构知识”。

下期预告:Map 底层的哈希表

感谢每一个观看本篇文章的朋友,更多精彩敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★* ‘

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

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

相关文章

JVM知识汇总

1、JVM架构图 2、Java编译器 Java编译器做的事情很简单&#xff0c;其实就是就是将Java的源文件转换为字节码文件。 1. 源文件存储的是高级语言的命令&#xff0c;JVM只认识"机器码"&#xff1b; 2. 因此将源文件转换为字节码文件&#xff0c;即是JVM看得懂的"…

Node.js—Buffer(缓冲器)

文章目录 1、概念2.、特点3、创建Buffer3.1 Buffer.alloc3.2 Buffer.allocUnsafe3.3 Buffer.from 4、操作Buffer4.1 Buffer 与字符串的转化4.2 Buffer 的读写 参考 1、概念 Buffer 是一个类似于数组的对象 &#xff0c;用于表示固定长度的字节序列。Buffer 本质是一段内存空间…

视觉学习(四) --- 基于yolov5进行数据集制作和模型训练

环境信息 Jetson Xavier NX&#xff1a;Jetpack 4.4.1 Ubuntu&#xff1a;18.04 CUDA: 10.2.89 OpenCV: 4.5.1 cuDNN&#xff1a;8.0.0.180一.yolov5 项目代码整体架构介绍 1. yolov5官网下载地址&#xff1a; GitHub: https://github.com/ultralytics/yolov5/tree/v5.0 2. …

单元测试中的独立运行

单元测试中的独立运行 单元测试是针对代码单元的独立测试。要测试代码单元&#xff0c;首先要其使能够独立运行。项目中的代码具有依赖关系&#xff0c;例如&#xff0c;一个源文件可能直接或间接包含大量头文件&#xff0c;并调用众多其他源文件的代码&#xff0c;抽取其中的一…

论文阅读:Unsupervised Manifold Linearizing and Clustering

Author: Tianjiao Ding, Shengbang Tong, Kwan Ho Ryan Chan, Xili Dai, Yi Ma, Benjamin D. Haeffele Abstract 在本文中&#xff0c;我们建议同时执行聚类并通过最大编码率降低来学习子空间联合表示。 对合成和现实数据集的实验表明&#xff0c;所提出的方法实现了与最先进的…

limit、排序、分组单表查询(三)MySQL数据库(头歌实践教学平台)

文章目的初衷是希望学习笔记分享给更多的伙伴&#xff0c;并无盈利目的&#xff0c;尊重版权&#xff0c;如有侵犯&#xff0c;请官方工作人员联系博主谢谢。 目录 第1关&#xff1a;对查询结果进行排序 任务描述 相关知识 对查询结果排序 指定排序方向 编程要求 第2关&a…

浏览器架构和事件循环

浏览器架构 早期浏览器【单进程多线程】 Page Thread 页面渲染&#xff0c;负责执行js,plugin,drawNetWork Thread 网络请求其余线程 file, storage缺点&#xff1a;只要其中一个线程崩溃&#xff0c;页面就会崩溃。 现代浏览器架构 多进程的浏览器&#xff0c;浏览器的每一个…

几种常见的激活函数

文章目录 常见的激活函数介绍Sigmoid函数ReLU函数LeakyReLU函数Tanh函数Softmax函数总结 常见的激活函数介绍 激活函数是神经网络中的重要组成部分&#xff0c;它决定了神经元的输出。在神经网络的前向传播中&#xff0c;输入数据被传递给神经元&#xff0c;经过加权和和激活函…

Unity自动化打包(1)

一 安装Jenkins https://www.jenkins.io/download/ 官网 1&#xff09; 使用 brew 安装 2&#xff09; 安装完成后一般都会遇到问题 我用的是jenkins-lts 稳定版 解决办法 删除掉对应的文件夹 1 rm -rf /usr/local/Homebrew/Library/Taps/homebrew/homebrew-services 2…

kafka延时队列内部应用简介

kafka延时队列_悠然予夏的博客-CSDN博客 两个follower副本都已经拉取到了leader副本的最新位置&#xff0c;此时又向leader副本发送拉取请求&#xff0c;而leader副本并没有新的消息写入&#xff0c;那么此时leader副本该如何处理呢&#xff1f;可以直接返回空的拉取结…

[ 高并发]Java高并发编程系列第二篇--线程同步

并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求,而且也能怎么你在整个项目中的一个处理逻辑的能力体现.那么,你真的知道什么…

ThreadLocal 内存泄露的原因及处理方式

1、ThreadLocal 使用原理 ThreadLocal的主要用途是实现线程间变量的隔离&#xff0c;表面上他们使用的是同一个ThreadLocal&#xff0c; 但是实际上使用的值value却是自己独有的一份。用一图直接表示threadlocal 的使用方式。 从图中我们可以当线程使用threadlocal 时&#xf…

CRC校验原理及其使用

目录 何为CRC 为什么需要校验 为什么是CRC CRC的缺点 目录 何为CRC 为什么需要校验 为什么是CRC CRC的缺点 如何进行CRC校验 校验标准式是什么玩意&#xff1f; 常见的CRC校验 CRC校验计算过程 CRC校验代码参考 代码解读 生成CRC8校验表的代码 CRC检验网站 如何…

GEE:使用 VCT(Vegetation Change Tracker)算法森林进行时序变化检测分析

作者: _养乐多_ 本文将介绍一段 Google Earth Engine 的代码,该代码用于进行时序变化检测分析,即使用 VCT(Vegetation Change Tracker)算法对某一地区的多年影像进行分析,得出每一年的变化程度,并输出一个 VCT 矩阵,同时还可根据矩阵得到每一年的变化遥感图。可以分析…

时下热门话题:ChatGPT能否取代人类?

时下热门话题&#xff1a;ChatGPT能否取代人类&#xff1f; 2022年11月底&#xff0c;人工智能对话聊天机器人ChatGPT推出&#xff0c;迅速在社交媒体上走红&#xff0c;短短5天&#xff0c;注册用户数就超过100万。2023年1月末&#xff0c;ChatGPT的月活用户已突破1亿&#x…

迭代器设计模式(Iterator Design Pattern)[论点:概念、组成角色、相关图示、示例代码、框架中的运用、适用场景]

概念 迭代器设计模式&#xff08;Iterator Design Pattern&#xff09;是一种行为型设计模式&#xff0c;它提供了一种方法来顺序访问一个聚合对象&#xff08;如集合&#xff09;的元素&#xff0c;而不需要暴露该对象的底层表示。迭代器模式可以帮助我们在不关心底层数据结构…

红酒分类案例中使用分箱处理

红酒分类案例中使用分箱处理 描述 在建立分类模型时&#xff0c;通常需要对连续特征进行离散化(Discretization)处理 &#xff0c;特征离散化后&#xff0c;模型更加稳定&#xff0c;降低了过拟合风险。离散化也叫分箱(binning)&#xff0c;是指把连续的特征值划分为离散的特…

Binder Driver 初探从驱动层角度来看

1&#xff1a;驱动概述 1.1基本简介 Binder 驱动是 Android 专用的&#xff0c;但底层的驱动架构与Linux 驱动一样。binder 驱动在以 misc 设备进行注册&#xff0c;作为虚拟字符设备&#xff0c;没有直接操作硬件&#xff0c;只是对设备内存的处理。主要是驱动设备的初始化(b…

如何刻录光盘文件

常识补充刻录机简介光盘刻录机是一种数据写入设备&#xff0c;利用激光将数据写到空光盘上从而实现数据的储存。其写入过程可以看做普通光驱读取光盘的逆过程。基本原理刻入数据时&#xff0c;利用高功率的激光束反射到盘片&#xff0c;使盘片上发生变化&#xff0c;模拟出二进…

计算机网络常见协议

文章目录 计算机网络TCP/IP协议TCP协议的三次握手和四次挥手TCP连接建立过程TCP连接断开过程为什么要三次握手&#xff1f;为什么要四次挥手&#xff1f; UDP协议HTTP协议 计算机网络 学习计算机网络&#xff0c;来记录一下。 TCP/IP协议 TCP/IP协议是Internet最基本的协议、…