Map和Set

news2024/11/26 5:38:07

目录

1.搜索

1.1 概念

1.2 模型

2.Map的使用

2.1 Map说明

2.2 Map.Entry说明,v>

2.3 Map的常见方法

2.3.1 V put(K key, V value)

2.3.2 V get(Object key)

 2.3.3 V getOrDefault(Object key, V defaultValue)

2.3.4 Set keySet()   Collection values()

2.3.5 Set> entrySet()

3. Set的说明


1.搜索

1.1 概念

Map和Set是一种专门用于搜索的容器或者数据结构,搜索的效率与具体的实例化子类有关

常见的搜索方法

1.遍历,时间复杂度是O(N),元素较多时,搜索效率很低

2.二分查找,时间复杂度是O(\log_{2}N),但是要求搜索之前序列有序

这两种都是静态类型的查找,一般不会进行插入或者删除操作,如果在查找时进行一些插入和删除操作,那么这两种方式就不适合动态查找了.Map和Set是适合动态查找的集合容器

1.2 模型

一般情况下把搜索的关键字称为key,和关键字对应的值称为value.合起来称为key-value键值对

分为两种模型

1.纯key模型

<单词>

2.key-value模型

<单词,单词出现的次数>

Map中存储了key-value的键值对,Set中存储了key

2.Map的使用

2.1 Map说明

Map是一个接口类,该类没有继承自Collection,该类存储的是<K,V>结构的键值对,并且K是唯一的,不能重复

2.2 Map.Entry<K,V>说明

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

 

方法说明
K getKey()返回 entry 中的 key
V getValue()返回 entry 中的 value
V setValue(V value)将键值对中的value替换为指定value

2.3 Map的常见方法

我们使用TreeMap实例化Map

2.3.1 V put(K key, V value)

设置 key 对应的 value

public class Test {
    public static void main(String[] args) {
        Map<String,Integer> map = new TreeMap<>();
        map.put("world",2);
        map.put("hello",2);
        System.out.println(map);

    }
}

可以看到结果是按照字母排过序的.

我们看一下源码:

compare:

可以看到比较方式有两种 

在我们添加一个没有重写cmopareTo方法的对象后

 

类型转换异常,当TreeMap 创建时如果有传入 Comparator ,优先按照 Comparator 的规则来排序,如果没有传入 Comparator ,就按照key的 compareTo 方法来排序。如果没传,它会认为你实现了Comparable接口,将你向上强制转换为Comparable类,所以Student类由于没有实现Comparable接口就会转换错误

String类型是有比较器的,所以直接就比较,不会检查是否实现了compareTo方法

 实现了Comparable接口,重写compareTo方法后

 

因此,使用TreeMap时其key必须实现Comparable接口采用自定义的比较器,否则会抛出java.lang.ClassCastExption异常

两种方式区别不大,一个是key实现Comparable接口,重写compareTo()方法,另一个是在TreeMap的构造函数中创建new Comparator匿名内部类,重写compare 方法

2.3.2 V get(Object key)

返回 key 对应的 value

 

get方法返回值类型是V, 用int 型变量接收

 打印后

 2.3.3 V getOrDefault(Object key, V defaultValue)

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

当获取一个不存在的key时,会出现空指针异常

 是因为返回null后,int接收不了,可以用Integer接收

 使用getOrDefault()方法

 

key 不存在,返回默认值

2.3.4 Set<K> keySet()   Collection<V> values()

返回所有 key 的不重复集合

返回所有 value 的可重复集合

Set<String> set = map.keySet();
System.out.println(set);
Collection<Integer> collection = map.values();
System.out.println(collection);

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

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

Map.Entry<K,V>作为Set<>的类型

看一下Entry

Map.Entry<K,V>上文中介绍过,用来存放<key,value>键值对映射关系的内部类

 Set中的每一个元素都是Entry类型的

Set<Map.Entry<String,Integer>> entrySet = map.entrySet();
        for (Map.Entry<String,Integer> entry : entrySet) {
            System.out.println("key:"+entry.getKey()+" "+"value:"+entry.getValue());

        }

遍历得到 

 

因此该方法能获取到集合中的key,value,该方法提供了一种遍历map的方式,foreach不能遍历map

foreach遍历必须要实现Iterable接口,但是map没有实现这个接口,因此提供该方法能更好的遍历map,取到key和value

注意:

1.Map是一个接口,不能直接实例化,实例化其实现类(TreeMap或HashMap)

2.Map中存放键值对的key是唯一的,value是可重复的

3.Map中的key可以全部分离出来存到Set中来进行访问(key不能重复)

4.Map中的value可以全部分离出来,放到collection的任何一个子集合中(value可能重复)

5.Map中的值不能直接修改,value可以直接改,有setValue()方法,要修改key,那只能先删除,然后重新插入

3. Set的说明

Set与Map主要的不同有两点:

Set是继承自Collection的接口类

Set中只存储了Key

方法

方法说明
boolean add(E e)添加元素,重复的元素不会被添加成功
void clear()清空集合
boolean contains(Object o)判断o是否在集合中
Iterator<E> iterator()返回迭代器
boolean remove(Object o)删除集合中的o
int size()返回set中的元素的个数
boolean isEmpty()

检查Set是否为空,是返回true,否则返回false

Object[] toArray将Set中的元素转化为数组返回
boolean containsAll(Collection<?> c)查看集合c中的元素是否都在set中,是返回true,否返回false
boolean addAll(Collection<? extends E> c)将集合c中的元素添加到set中,可以达到去重的效果

 注意

1.Set是一个接口类,继承自Collection

 

2.Set中只存储了key,并且key一定要唯一

Set<String> set1 = new TreeSet<>();
        set1.add("hello3");
        set1.add("hello3");
        System.out.println(set1);

这时还是只打印一个,重复的key存不进去 

3.Set底层是Map实现的,其使用key与Object的一个默认对象作为键值对插入到Map中的

TreeSet<String> set1 = new TreeSet<>();
        set1.add("hello3");

 PRESENT就是这里的Object的默认对象,因此在TreeSet中存储值,实际上是存在了TreeMap中,只是value是一个默认值

 因为底层是Map实现的,所以,使用Map和Set的时候,传入的Key必须是可比较的,否则就会出现类型转换异常

4. Set最大的功能就是对集合中的元素进行去重

我们生成十个随机数,然后对它进行去重并输出

public static void main(String[] args) {
        int[] arr = new int[10];
        Random r = new Random();
        for (int i = 0; i < 10; i++) {
            arr[i] = r.nextInt(5);
        }
        System.out.println(Arrays.toString(arr));
        fun(arr);
    }
    public static void fun(int[] array){
        TreeSet<Integer> treeSet = new TreeSet<>();
        for (int i = 0; i < array.length; i++) {
            treeSet.add(array[i]);
        }
        System.out.println(treeSet);
    }

 

5. 实现Set接口的常用类有TreeSet和HashSet,还有一个LinkedHashSet,LinkedHashSet是在HashSet的基础 上维护了一个双向链表来记录元素的插入次序

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

7.Set不能插入null的key,TreeMap也不能插入null的key

TreeSet不能有key为null的元素,会报NullPointerException
public void testTreeSet(){
        TreeSet<String> set = new TreeSet<>();
        set.add(null); //Error NullPointException
    }

TreeMap的put方法会调用compareTo方法,对象为null时,会报空指针错
public void testTreeMap(){
        TreeMap<String,String> map = new TreeMap<>();
        map.put(null,null);
        Assert.assertEquals(1,map.size()); //Error NullPointException
        
    }

 

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

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

相关文章

JavaWeb语法二:Thread类的基本使用

目录 1.创建线程 1.2&#xff1a;run()和start()方法 1.3&#xff1a;Thread的几个常见属性 2.线程的有关操作 2.1&#xff1a;启动一个线程&#xff1a;start() 2.2&#xff1a;中断一个线程 2.2.1&#xff1a;使用自定义的变量来作为标志位 2.2.2&#xff1a;使用Thr…

高校校园网络

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a;开发工具IDEA-2020.1,数据库mysql55.527,SSM框架&#xff0c;jdk版本"1.8.0_74"&#xff0c;java语言。 管理员…

小白年薪26万,为什么Python岗位的薪资越来越高?问题解析

人工智能和大数据概念的兴起&#xff0c;带动了Python的快速增长——Python语言逻辑简洁、入门简单、生态丰富&#xff0c;几乎成为几个新兴领域的不二选择。而除了这两个领域&#xff0c;Python还有更多的适用领域&#xff1a;爬虫、web、自动化运维等领域都非常适合Python发挥…

大二学生HTML期末作业、个人主页网页制作作业

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

代码随想录第八天

专题&#xff1a;字符串 题目&#xff1a; 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。你可以假设数组中的所…

CleanMyMacX4.15好用吗?CleanMyMac X2023安全吗?

CleanMyMac x4.15已经正式发布&#xff0c;作为最新的系统清理和应用管理软件&#xff0c;可以让用户一键智能化清理Mac电脑&#xff0c;自动扫描Mac上的所有文件&#xff0c;包括&#xff1a;Mac系统清理、邮件应用程序清理、大和旧型文件清理、itunes文件清理、废纸篓清理、应…

【总结】少信那些个包发论文的营销文案,7场直播讲解如何锻炼基础的学术研究能力...

对于广大研究生甚至本科生来说&#xff0c;发表满足学校或者实验室要求的公开学术论文是毕业要求&#xff0c;多少都会具有一定的压力&#xff0c;尤其是一些学校实验室要求比较高。作为过来人&#xff0c;其中焦虑有三也是懂的&#xff0c;研究生期间为此焦虑过一两年。正应如…

安科瑞ARB5弧光保护装置非电量保护装置故障告警可选配GOOSE

安科瑞 王晶淼/刘芳 一、ARB5系列弧光保护装置概述 ARB5系列弧光保护装置外观时尚、大屏幕液晶显示&#xff0c;图形化多语言菜单&#xff0c;操作快捷方便&#xff1b;具有强大的功能集成&#xff1a;集保护、测量、控制、监测、通讯、故障录波、事件记录等多种功能于一体,准…

时间序列-预测(Forcasting):时间序列预测算法总结

一、背景介绍 绝大部分行业场景,尤其是互联网、量化行业,每天都会产生大量的数据。金融领域股票价格随时间的走势;电商行业每日的销售额;旅游行业随着节假日周期变化的机票酒店价格等; 我们称这种不同时间收到的,描述一个或多种特征随着时间发生变化的数据,为时间序列…

如何完全的卸载ArcGIS?

打开控制面板&#xff0c;找到“卸载程序” 选择卸载程序&#xff0c;在新界面中找到与ArcGIS有关的程序。 右键单击要卸载的内容&#xff0c;并选择“卸载/更改”。按照此方法&#xff0c;把要卸载的软件一个个的卸载掉。 通过以上步骤&#xff0c;我们就把ArcGIS软件从电脑中…

酷早报:12月14日全球Web3加密行业重大资讯大汇总

2022年12月14日 星期三 【数据指标】 加密货币总市值&#xff1a;$0.88万亿 BTC市值占比&#xff1a;39.15% 恐慌贪婪指数&#xff1a;30 恐慌【今日快讯】 1、【政讯】 1.1、拜登&#xff1a;通胀正在下降&#xff0c;一切都在朝着正确的方向发展 1.2.1、贝莱德&#xff1a;11…

ChatGPT:探索RLHF与GPT的完美结合

前言 ChatGPT已经发布一周了热度依旧不减&#xff0c;ChatGPT也各种大显神通&#xff0c;为各大网友“出谋划策”&#xff0c;有写周报的&#xff0c;有写绩效的甚至还有写论文的&#xff0c;作为一个NLP从业者&#xff0c;除了好好体验下其中的乐趣&#xff0c;其背后的原理当…

基于Java实现(APP)智能停车场管理系统【100010044】

移动应用开发系统设计说明书 服务集成流程详细设计 实现功能 序号功能点描述1新增用户2注册用户3修改场地信息4列出场地信息5新增认证车辆6列出认证车辆7删除认证车辆8车辆进入信息录入9停车记录列表展示10出停车场信息录入 参数说明 User 用户信息实体参数 字段名称字段类…

壳聚糖-三聚磷酸钠(CTS-STPP)|SN-117M标记甘露糖偶联葡聚糖胺

壳聚糖-三聚磷酸钠(CTS-STPP)|SN-117M标记甘露糖偶联葡聚糖胺 中文名称&#xff1a;壳聚糖-三聚磷酸钠 英文名称&#xff1a;CTS-STPP 纯度&#xff1a;95% 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 外观:固体或粘性液体 包装&#xff1a;瓶装/袋装…

实战 | 基于OpenCV的停车场空余车位实时监测系统(详细步骤 + 源码)

导 读 本文主要介绍如何使用Python和OpenCV实现一个停车场空余车位实时监测系统&#xff0c;并包含详细步骤和源码。 背景介绍 介绍实现步骤之前&#xff0c;先来看看测试视频(小型停车场实时监控画面)&#xff1a; &#xff0c;时长00:28 我们的目标是实时检测停车场剩余空位…

DAMA-CDGA/CDGP数据治理工程师证书含金量杠杠滴

DAMA-CDGA/CDGP数据治理工程师证书含金量杠杠滴 DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&a…

Linux常用操作 | 权限网络进程主机... | 系统性学习 | 无知的我费曼笔记

无知的我正在复盘Linux。。。 下面是我总结的 Linux 知识的初阶版思维导图&#xff0c;后续会不断补充 文章目录Linux常用操作软件安装systemctl软链接日期时区ntpip地址主机名配置VMware固定IPps命令kill命令nmap命令netstat命令ping命令wget命令curl命令top命令df命令iosta…

Ubuntu 建立 http server

1.執行 sudo apt install apache2 2.檢查Apache sudo systemctl status apache2 看到active說明運行正常 3.調整UFW防火牆 允許Apache遠端連接 查看 sudo ufw app list 允許HTTP/HTTPs傳輸 sudo ufw allow in "Appach Full" 4.測試 在網頁上打開 http://{你的…

汇编伪指令

目录 段的定义&#xff08;重点&#xff09; 定位方式 汇编地址计数器 $ ORG 例题 段寄存器的设定&#xff08;重点&#xff09; 源程序的结束&#xff08;重点&#xff09; 过程的定义&#xff08;了解&#xff09; 掌握 过程定义伪指令 PROC&#xff0c; ENDP 段定…

QT—常用容器 QStringList,QVector,QMap,QHash,QVariant

QStringList 元素添加 可以直接添加元素&#xff0c;也可也使用append( )方法在末尾追加元素 QStringList weekList<<"星期一"<<"星期二"<<"星期三"; weekList.append("星期四"); qDebug()<<weekList; 元素…