详细说明Java中Map和Set接口的使用方法

news2025/1/16 2:53:54

Map与Set的基本概念与场景

Map和set是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关。以前常见的搜索方式有:

1. 直接遍历,时间复杂度为O(N),元素如果比较多效率会非常慢。
2. 二分查找,时间复杂度为O(\log _{2}^{N}),但搜索前必须要求序列是有序的。

上述排序比较适合静态类型的查找,即一般不会对区间进行插入和删除操作了,而现实中的查找比如:

1. 根据姓名查询考试成绩
2. 通讯录,即根据姓名查询联系方式
3. 不重复集合,即需要先搜索关键字是否已经在集合中

可能在查找时进行一些插入和删除的操作,即动态查找,那上述两种方式就不太适合了,本节介绍的Map和Set是一种适合动态查找的集合容器。

模型概念

一般把搜索的数据称为关键字(Key),和关键字对应的称为值(Value),将其称之为Key-value的键值对,所以模型会有两种:

  1. 纯 key 模型,例如:
  • 有一个英文词典,快速查找一个单词是否在词典中
  • 快速查找某个名字在不在通讯录中
  1. Key-Value 模型,例如:
  • 统计文件中每个单词出现的次数,统计结果是每个单词都有与其对应的次数:<单词,单词出现的次数>
  • 梁山好汉的江湖绰号:每个好汉都有自己的江湖绰号

Map接口的性质

在Java中,Map接口是一个用于存储键值对(key-value pairs)的对象,它属于Java Collections Framework的一部分。Map接口的主要特点包括:

  1. 键值对存储Map存储的数据是以键值对的形式组织的,每个键(key)唯一对应一个值(value)。可以通过键来快速获取对应的值。

  2. 无序性:大多数实现类(如HashMap)不会保证元素的顺序,除非使用特定的实现(如LinkedHashMap,它可以保持插入顺序,或者TreeMap,它会按照键的自然顺序或指定的比较器进行排序)。

  3. 键的唯一性:在同一个Map中,不能有重复的键。如果试图将一个新的值与已有的键关联,原有的值将被新值替换。

  4. 实现类:Java提供了多种Map接口的实现,例如:

    • HashMap:基于哈希表的实现,允许null值和null键,查找速度快。
    • TreeMap:基于红黑树的实现,支持排序的键,查找速度相对较慢。
    • LinkedHashMap:结合了HashMap的哈希表和链表特性,维护插入顺序。
  5. 常用方法Map接口提供了一系列的方法,例如:

    • put(K key, V value):将指定的值与指定的键关联。
    • get(Object key):返回指定键所映射的值。
    • remove(Object key):移除指定键的键值对。
    • containsKey(Object key):检查是否存在指定的键。
    • keySet():返回Map中所有键的集合。
    • values():返回Map中所有值的集合。

总之,Map接口是Java中重要的数据结构之一,方便有效地进行数据的存储和检索,广泛应用于各种场景中。

Map接口的使用方法

put(K key, V value):将指定的值与指定的键关联。

public class Main {
    public static void main(String[] args) {
        Map<String,Integer> map = new TreeMap<>();
        map.put("one",1);
        map.put("two",2);
        map.put("three",3);
        map.put("four",4);
    }
}

get(Object key):返回指定键所映射的值。

public class Main {
    public static void main(String[] args) {
        Map<String,Integer> map = new TreeMap<>();
        map.put("one",1);
        map.put("two",2);
        map.put("three",3);
        map.put("four",4);
        System.out.println(map.get("two"));
    }
}

V getOrDefault(Object key, V defaultValue) :返回 key 对应的 value,key 不存在,返回默认值 

public class Main {
    public static void main(String[] args) {
        Map<String,Integer> map = new TreeMap<>();
        map.put("one",1);
        map.put("two",2);
        map.put("three",3);
        map.put("four",4);
        System.out.println(map.getOrDefault("five",-1));
    }
}

 Set<K> keySet() :返回所有 key 的不重复集合,用 Set 容器接收

public class Main {
    public static void main(String[] args) {
        Map<String,Integer> map = new TreeMap<>();
        map.put("one",1);
        map.put("two",2);
        map.put("three",3);
        map.put("four",4);
        Set<String> strings = map.keySet();
        
    }
}

 

Collection<V> values() :返回所有 value 的可重复集合 ,用 Collection 容器接收

public class Main {
    public static void main(String[] args) {
        Map<String,Integer> map = new TreeMap<>();
        map.put("one",1);
        map.put("two",2);
        map.put("three",3);
        map.put("four",4);
        Collection<Integer> values = map.values();
        System.out.println("==");
    }
}

Set<Map.Entry<K, V>> entrySet() :返回所有的 key-value 映射关系 

public class Main {
    public static void main(String[] args) {
        Map<String,Integer> map = new TreeMap<>();
        map.put("one",1);
        map.put("two",2);
        map.put("three",3);
        map.put("four",4);
        Set<Map.Entry<String, Integer>> entries = map.entrySet();
        for (Map.Entry<String, Integer> entry : entries) {
            System.out.println("Key = "+entry.getKey()+" Val = "+entry.getValue());
        }
    }
}

注意: 

  1. Map是一个接口,不能直接实例化对象,如果要实例化对象只能实例化其实现类TreeMap或者HashMap
  2. Map中存放键值对的Key是唯一的,value是可以重复的
  3. 在TreeMap中插入键值对时,key不能为空,否则就会抛NullPointerException异常,value可以为空。但是HashMap的key和value都可以为空。
  4. Map中的Key可以全部分离出来,存储到Set中来进行访问(因为Key不能重复)。
  5.  Map中的value可以全部分离出来,存储在Collection的任何一个子集合中(value可能有重复)。
  6. Map中键值对的Key不能直接修改,value可以修改,如果要修改key,只能先将该key删除掉,然后再来进行重新插入。

Set接口的性质

在Java中,Set接口是一个用于存储唯一元素的集合,它也是Java Collections Framework的一部分。Set接口的主要特点包括:

  1. 唯一性Set中不允许重复的元素,这意味着集合中的每个元素都是唯一的。如果试图添加重复元素,操作将被拒绝,集合的状态不会改变。

  2. 无序性Set通常不保证元素的顺序。尤其是使用HashSet时,元素的存储顺序是随机的。而LinkedHashSet可以维护元素的插入顺序,TreeSet则会按自然顺序或自定义的比较器进行排序。

  3. 实现类:Java提供了多种Set接口的实现,包括:

    • HashSet:基于哈希表的实现,允许null元素,查找速度快,但不保证元素的顺序。
    • LinkedHashSet:结合了哈希表和链表的特性,保持元素的插入顺序。
    • TreeSet:基于红黑树的实现,按升序排序元素,不允许null值。
  4. 常用方法Set接口提供了一系列的方法,例如:

    • add(E e):向集合中添加元素,如果元素已存在,则返回false。
    • remove(Object o):移除指定元素。
    • contains(Object o):检查集合中是否包含指定元素。
    • size():返回集合中元素的数量。
    • clear():移除集合中的所有元素。
    • iterator():返回一个迭代器,用于遍历集合中的元素。
  5. 应用场景Set常用于需要存储不重复元素的场景,比如去重、集合运算(如交集、并集和差集)等。

总之,Set接口是Java中重要的数据结构,适合用于处理唯一性要求的数据集合,具有高效的存储和检索特性。

Set接口的使用方法

set 接口中的方法和 Map 接口中的常见方法大差不差,就不一 一介绍了。

import java.util.TreeSet;
import java.util.Iterator;
import java.util.Set;
public static void TestSet(){
   Set<String> s = new TreeSet<>();
   // add(key): 如果key不存在,则插入,返回ture
   // 如果key存在,返回false
   boolean isIn = s.add("apple");
   s.add("orange");
   s.add("peach");
   s.add("banana");
   System.out.println(s.size());
   System.out.println(s);
isIn = s.add("apple");
   // add(key): key如果是空,抛出空指针异常
   //s.add(null);
   // contains(key): 如果key存在,返回true,否则返回false
   System.out.println(s.contains("apple"));
   System.out.println(s.contains("watermelen"));
   // remove(key): key存在,删除成功返回true
   //             key不存在,删除失败返回false
   //             key为空,抛出空指针异常
   s.remove("apple");
   System.out.println(s);
   s.remove("watermelen");
   System.out.println(s);
   Iterator<String> it = s.iterator();
   while(it.hasNext()){
       System.out.print(it.next() + " ");
  }
   System.out.println();
}

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

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

相关文章

PSINS工具箱函数介绍——insinit

insinit是初始化INS系统的函数 函数需要用到PSINS工具箱&#xff0c;关于工具箱的一些入门知识&#xff0c;参考这篇文章&#xff0c;是关于工具箱的讲解&#xff1a; PSINS初学指导&#xff1a;https://blog.csdn.net/callmeup/article/details/137087932 函数使用方法 正…

vulhub:Apache解析漏洞apache_parsing

在Apache1.x/2.x中Apache 解析文件的规则是从右到左开始判断解析&#xff0c;如果后缀名为不可识别文件解析&#xff0c;就再往左判断。如 1.php.xxxxx 漏洞原理 Apache HTTPD 支持一个文件拥有多个后缀&#xff0c;并为不同后缀执行不同的指令。比如如下配置文件 AddType te…

蓝牙网关北京厂家_蓝牙网关型号价格介绍

蓝牙网关北京厂家介绍&#xff1a;北京桂花网科技有限公司成立于2015年&#xff0c;开发了远距离蓝牙网关&#xff0c;重新定义了蓝牙&#xff0c;拓展了蓝牙的应用范围&#xff0c;在2016年1月的拉斯维加斯世界消费电子CES展会上一举夺得Best of CES创新大奖。随后&#xff0c…

操作系统_内存管理学习心得

1. 操作系统结构 1.1 内核 计算机是由各种外部硬件设备组成的,比如内存、cpu、 硬盘等,如果每个应用都要和这些硬件设备对接通信协议&#xff0c;那这样太累了&#xff0c;所以这个中间人就由内核来负责,让内核作为应用连接硬件设备的桥梁,应用程序只需关心与内核交写&#x…

day19Tomcat

1. Tomcat启动服务 1. 使用命令&#xff1a; /usr/local/tomcat/bin/startup.sh 启动Tomcat服务。 2. 使用命令&#xff1a; netstat -lnput|grep java 查看端口状态&#xff0c;可以看到8080和8005两个端口。 3. 使用命令&#xff1a; /usr/local/tomcat/bin/shutdown.sh 停止…

用18讲必看:宇哥亲划重点内容+核心题总结

25考研结束之后&#xff0c;张宇老师的风评可能会两极分化 其中一波把张宇老师奉为考研数学之神&#xff0c;吹捧「三向解题法」天下无敌。 另外一波对张宇老师的评价负面&#xff0c;在网上黑张宇老师&#xff01; 为什么会这么说&#xff0c;因为张宇老师的新版36讲争议太…

【八股文】并发编程相关考点

1.线程和进程和协程的区别 进程是操作系统中资源分配和调度的基本单位&#xff0c;是程序的一次执行过程&#xff0c;因此是动态的&#xff0c;即一个进程从创建到运行再到消亡。每个进程都有独立的内存空间&#xff0c;一位置一个进程的变量修改不会影响到其他经常。进程之间的…

大数据HBase图文简介

往期推荐 数据仓库及数仓架构概述-CSDN博客 数仓常见名词解析和名词之间的关系-CSDN博客 引言 要想明白为什么产生 HBase&#xff0c;就需要先了解一下 Hadoop 存在的限制&#xff1a;Hadoop 可以通过 HDFS 来存 储结构化、半结构甚至非结构化的数据&#xff0c;是传统数据库的…

LeetCode 965.单值二叉树 C写法

LeetCode 965.单值二叉树 C写法 思路&#x1f9d0;&#xff1a; 用前序遍历的方式&#xff0c;如果左结点或右结点不为空且值不相等就直接返回false&#xff0c;如果走完一颗子树&#xff0c;结点为空了就返回true到上一层递归&#xff0c;直到左右子树全部走完&#xff0c;全为…

深入理解PreparedStatement

预处理 Overridepublic boolean login(String username, String userpwd) {Connection con DBUtils.getConnection();try {if(con ! null){PreparedStatement pstmt con.prepareStatement("select username,userpwd from " " users where username? and us…

【靶场实操】sql-labs通关详解----第一节:基础注入方式(Less-1~Less-10)

目录 一、注入方式简要概括 1.1 SQL常见注入方式 1.2 爆破函数 二、靶场实操 2.1 Less-1 2.1.1 判断类型 2.1.2 联合注入查询 2.2 Less-2 2.2.1 判断类型 2.2.2 注入攻击 2.2.3 字符型与数字型漏洞对比 2.3 Less-3 2.3.1 判断 2.3.2 注入 2.4 Less-4 2.4.1 判断…

论文阅读-《Cross-Sentence N-ary Relation Extraction with Graph LSTMs》

这篇论文提出了一种基于图LSTM的跨句子n元关系提取框架&#xff0c;具有很好的创新性。图LSTM能够有效地处理长距离依赖和跨句信息&#xff0c;并且能够方便地整合丰富的语言分析。此外&#xff0c;论文还探索了多任务学习&#xff0c;将n元关系与其子关系进行联合学习&#xf…

WebFlux集成MongoDB

目录 前言 1.简单集成MongoDB 2. yml配置 3.创建用户实体类 4.创建用户CRUD数据访问接口类 5.Controller层 6.postman测试访问 7.代码附在本博文绑定资源 前言 MongoDB广泛应用于非关系型数据库的存储&#xff0c;其主要存储的数据类型有字符串&#xff0c;整数、浮点数…

NAS 软件大盘点:瞧瞧哪个被你遗漏了

很多人都听说过NAS&#xff0c;也有很多人正在使用NAS&#xff0c;而NAS用户通常需要安装一些软件来扩展其功能&#xff0c;毕竟NAS的功能实在是太多了&#xff0c;光是部署与调试就要耗费大量的时间&#xff0c; 小宝集合了NAS相关实用工具&#xff0c;无论是群晖、威联通还是…

3、从0搭建企业门户网站——JDK下载、安装与环境变量配置

目录 ​编辑 正文 1、JDK下载 2、JDK安装 2.1 建立存放目录 2.2 上传文件 2.3 解压 3、JDK环境变量配置 4、检查JDK版本 正文 在CentOs7.5上,安装JDK是必要的,因为我们的网站软件是Java语言开发。下面我们以安装JDK 17为例,介绍整个JDK安装过程。 1、JDK下载 JDK…

Vitis通过TCF远程调试ZYNQ Linux

昨天已经在矿渣板上把petalinux跑起来了&#xff0c;今天准备尝试一下vitis通过TCF远程调试ZYNQ Linux代码&#xff0c;官方和第三方的各种教程满天飞&#xff0c;但还是有几个坑的&#xff0c;教程没说清楚。 1.打开vitis&#xff0c;用vivado导出的xsa文件新建一个platform工…

ChinaJoy 2024,VERYCLOUD睿鸿股份与你相聚

&#x1f3ae;2024 ChinaJoy于26日正式开幕 &#x1f557;7月26-28日 &#x1f310;VERYCLOUD睿鸿股份在BTOB商务洽谈馆 &#x1f31f;W4-B785展位 &#x1f387;展台交流好礼相送 与多行业好友现场相聚、畅谈&#x1f9d0; 现场游戏企业云集 专业观众、玩家纷至沓来 与游戏/短…

新一代分割一切大模型SAM2(Segment Anything Model 2)介绍,可轻松分割图片与视频

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

KylinOS V10系统上安装yashan数据库单机版

一、服务器准备 这里安装的KylinOS V10桌面版本。 二、依赖项准备 安装桌面版的依赖包都安装好了。 https://doc.yashandb.com/yashandb/23.2/zh/%E5%AE%89%E8%A3%85%E5%92%8C%E5%8D%87%E7%BA%A7/%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2/%E5%AE%89%E8%A3%85%E5%89%8D%E5%87%86…

net start mysql; 服务名无效。 请键入 NET HELPMSG 2185 以获得更多的帮助。 也许你只是写错了名字!!!!!

看样子不知道问题出在哪里,看了别人的文章也不行。 打开服务&#xff08;命令行输入services.msc&#xff09;&#xff01;&#xff01; 人家叫mysql80 成了~ 就很无语