数据结构————map,set详解

今天带来map和set的详解,保证大家分清楚

一,概念

map和set是一种专门用来搜索的容器或数据结构

map能存储两个数据类型,我们称之为<key-value>模型

set只能存储一个数据类型,我们称之为纯<key>模型

它们的效率都非常非常高,我们来一个一个了解。

二,详解map

1,map的说明

map是一个接口,所以我们不能直接创建map对象,我们可以使用Treemap和HashMap,我们先不讲treemap和Hashmap底层是怎么实现的,我们先只需要了解他们怎么使用就行(后期还是要学),treeMap的底层是使用红黑树来实现的,而Hashmap底层是哈希表,哈希表由一系列哈希桶组层,也很难,后期要掌握。

2,map中的具体方法

V put(K key, V value)  设置 key 对应的 value

开头V的意思是返回value的类型。

这个方法是添加元素,注意,实现的对象在treemap的时候k是不可以存null的,而Hashset是可以存null的,因为treemap底层的红黑树涉及比较,而Hashset主要是根据哈希函数查找,

key值如果相同的话,后添加的会把map中已经存在的key值对应的value覆盖掉,而不同key值间的value是可以相同的。


        Map<String,Integer> map = new HashMap<>();
        map.put("ujm",12321);
        map.put("abs",12321);
        map.put("tdh",12321);
        map.put("yre",12321);

 我们来向map中添加键值对,来调试

成功添加了键值对。

V remove(Object key)   删除 key 对应的映射关系 

map中的删除方法,map中的key值是不可以修改的,只能进行删除操作,之后再重新修改。

        map.remove("ujm");
        map.remove("abs");
        map.remove("tdh");
        map.remove("yre");
      

我们看到了map中不含任何元素了。

V get(Object key)   返回 key 对应的 value

我们使用get方法来获取key———对应的value值,就是我们的查找了。

我们查找刚才添加元素的abs.

int a = map.get("abs");
        System.out.println(a);

 

我们成功找到了abs字符串

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

但是我们这次如果没有找到对应的key,就返回我们设定的值

int a = map.getOrDefault("bswr",1000);
        System.out.println(a);

 

Set keySet()返回所有 key 的不重复集合

我们用keySet()方法来获得map中的所有key

Map<String,Integer> map = new HashMap<>();
        map.put("ujm",12321);
        map.put("abs",12321);
        map.put("tdh",12321);
        map.put("yre",12321);
        Set<String> set = map.keySet();

 

那么value呢 

Collection values()返回所有 value 的可重复集合  

我们用这个方法来获得所有的value

Map<String,Integer> map = new HashMap<>();
        map.put("ujm",12321);
        map.put("abs",12321);
        map.put("tdh",12321);
        map.put("yre",12321);
        Collection<Integer> collection = map.values();

 

Map.Entry<k,v>

这是map中提供的一个获取键值对的类,我们可以通过这个类来获得k,v的值,我们还可以将v替换成其他的v值,我们经常使用这个类来遍历的打印键值对。

这个类中有三个方法,

K getKey()  返回 entry 中的 key

V getValue()  返回 entry 中的 value 

V setValue(V value) 将键值对中的value替换为指定value

这里先不介绍。

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

我们创建一个set类型,Set类型的具体数据类型是我们的键值对类型,我们对map进行.entry Set() 传给我们的set类型,我们就得到我们所有的键值对关系,这个是最重要的。

 Map<String,Integer> map = new HashMap<>();
        map.put("ujm",4647);
        map.put("abs",123);
        map.put("tdh",1351);
        map.put("yre",6856);
        Set<Map.Entry<String,Integer>> set = map.entrySet();
        for (Map.Entry<String,Integer> entry1 : set){
            System.out.println(entry1);
        }

 我们使用for each遍历,

成功打印所以的键值对。

boolean containsKey(Object key) 判断是否包含 key

在map中找key,找到返回true,没有返回false

   boolean a = map.containsKey("abs");
        System.out.println(a);
        a = map.containsKey("scawcw");
        System.out.println(a);

 

boolean containsValue(Object value)判断是否包含 value 

在map中找value,找到返回true,没有返回false

 boolean b = map.containsValue(123);
        System.out.println(b);
        b = map.containsValue(213124);
        System.out.println(b);

 

 

Map底层结构TreeMapHashMap
底层结构红黑树哈希桶
插入/删除/查找时间 复杂度O(log2n)O(1)
是否有序关于key有序无序
线程安全不安全不安全
插入/删除/查找区别需要进行元素比较需要哈希函数计算地址
比较与覆写不可以放null会抛异常需要覆写HashCode和equals函数
应用场景key有序最好不关心,开辟大量内存换取时间

 三,详解set

1.set的说明

Set也是一个接口,我们要想创建对象就要使用TreeSet,HashSet,Set是纯key模型,不能重复,我们常常使用Set来去重。

2.set中的具体方法

boolean add(E e) 添加元素,但重复元素不会被添加成功

向set中添加元素,set中的key不能重复

Set<Integer> set = new HashSet<>();
        set.add(13);
        set.add(46);
        set.add(768);

 

我们看到set中成功添加了三个元素

void clear()   清空集合

set.add(13);
        set.add(46);
        set.add(768);
        set.add(2);
        set.clear();

 

boolean contains(Object o)   判断 o 是否在集合中 

        Set<Integer> set = new HashSet<>();
        set.add(13);
        set.add(46);
        set.add(768);
        set.add(2);
        boolean a = set.contains(12);
        boolean b = set.contains(2);
        System.out.println(a + "   " + b);

boolean remove(Object o)

set.remove(13);

移除13。

Iterator iterator() 返回迭代器

这个方法我们主要用来遍历打印我们的Set,因为set实现了我们的Iterator接口

Iterator<Integer> iterator = set.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }

 

其他方法

 

 

Set底层结构TreeSetHashSet
底层结构红黑树哈希桶
插入/删除/查找时间 复杂度O(log2n)O(1)
是否有序关于key有序无序
线程安全不安全不安全
插入/删除/查找区别需要进行元素比较需要哈希函数计算地址
比较与覆写不可以放null会抛异常需要覆写HashCode和equals函数
应用场景key有序最好不关心,开辟大量内存换取时间

四,练题

好了,终于讲完我们的基础了,我们来三道小练习题

1给一组元素,统计元素出现的次数
2给定一组元素去重
3找到一组数据中第一个重复的数据

1, 给一组元素,统计元素出现的次数

        int[] arr = new int[]{23,352,46,47,84,1,44,6,1,23};
        Map<Integer,Integer> map = new HashMap<>();
        for (int i = 0; i < arr.length; i++) {
            if(map.get(arr[i])==null){
                map.put(arr[i],1);
            }
            else {
                map.put(arr[i], map.get(arr[i])+1);
            }
        }

        Set<Map.Entry<Integer,Integer>> set = map.entrySet();
        for (Map.Entry<Integer,Integer> entry: set){
            System.out.println(entry);
        }

2,给定一组元素去重

int[] arr = new int[]{23,352,46,47,84,1,44,6,1,23};
        Set<Integer> set = new HashSet<>();
        for (int i = 0; i < arr.length; i++) {
            set.add(arr[i]);
        }

        Iterator<Integer> iterator = set.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }

 3,找到一组数据中第一个重复的数据

int[] arr = new int[]{23,352,46,47,84,1,44,6,1,23};
        Set<Integer> set = new HashSet<>();
        for (int i = 0; i < arr.length; i++) {
            if (!set.contains(arr[i])){
                set.add(arr[i]);
            }
            else {
                System.out.println(arr[i]);
                return;
            }
        }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue.js(2): 组件与路由基础指南

这一路上可能会有艰辛、困难、疑惑、付出、泪水、失败&#xff0c;但是一定要享受这个过程&#xff0c;因为所有的失败都是为了下一刻的成功 文章目录 组件什么是组件组件化开发的好处组件底层是什么全局注册组件局部注册组件组件嵌套组件命名规则组件传值 SPAvue-router路由动…

[c++高阶]二叉搜索树深度剖析

1.前言 从二叉搜索树开始&#xff0c;后面慢慢学的AVL树&#xff0c;红黑树&#xff0c;map,set&#xff0c;哈希表等等都会慢慢的变得更难了&#xff0c;也更加难以理解了。希望大家能够坚持下去&#xff0c;只要坚持&#xff0c;就是胜利。 本章重点 着重讲解什么是二叉搜索…

【力扣刷题实战】单值二叉树

大家好&#xff0c;我是小卡皮巴拉 文章目录 目录 力扣题目&#xff1a; 单值二叉树 题目描述 示例 1&#xff1a; 示例 2&#xff1a; 解题思路 题目理解 算法选择 具体思路 解题要点 完整代码&#xff08;C语言&#xff09; 兄弟们共勉 &#xff01;&#xff01;…

MySQL数据库MHA高可用

目录 一、MHA简述 二、MHA 的组成 三、MHA 的特点 四、MHA工作原理 五、MHA部署步骤 六、搭建 MySQL MHA MHA一主两从高可用集群示意图 实验环境 1. Master、Slave1、Slave2 节点上安装 mysql5.7 2. 关闭防火墙 3. 修改 Master、Slave1、Slave2 节点的主机名 4. 修…

国内短剧源码短剧系统搭建小程序部署H5、APP打造短剧平台

​在当今的互联网时代&#xff0c;短剧作为一种新兴的娱乐形式&#xff0c;受到了越来越多用户的喜爱。为了提供更好的用户体验和满足用户需求&#xff0c;一个好的短剧系统需要具备多元化的功能和优质的界面设计。 本文将介绍国内短剧源码短剧系统搭建小程序部署H5、APP所需的…

【传知代码】图像处理解决种子计数方法

文章目录 一、背景及意义介绍研究背景农业考种需求传统计数方法的局限性人工计数仪器设备计数 研究意义提高育种效率提高计数准确性广泛的适用性数据存档与分析便利 二、概述三、材料与数据准备以及方法介绍整体流程图像采集图像预处理形态学操作腐蚀运算开运算 图像二值化种子…

Typora一款极简Markdown文档编辑器和阅读器,实时预览,序列号生成!免费!最新可用!

文章目录 一、Typora下载和安装二、Typora序列号生成 Typora是一款Markdown编辑器和阅读器&#xff0c;风格极简&#xff0c;实时预览&#xff0c;所见即所得&#xff0c;支持MacOS、Windows、Linux操作系统&#xff0c;有图片和文字、代码块、数学公式、图表、目录大纲、文件管…

C/C++(八)C++11

目录 一、C11的简介 二、万能引用与完美转发 1、万能引用&#xff1a;模板中的 && 引用 2、完美转发&#xff1a;保持万能引用左右值属性的解决方案 三、可变参数模板 1、可变参数模板的基本使用 2、push 系列和 emplace 系列的区别 四、lambda表达式&#xf…

海亮科技亮相第84届中国教装展 尽显生于校园 长于校园教育基因

10月25日&#xff0c;第84届中国教育装备展示会&#xff08;以下简称“教装展”&#xff09;在昆明滇池国际会展中心开幕。作为国内教育装备领域规模最大、影响最广的专业展会&#xff0c;本届教装展以“数字赋能教育&#xff0c;创新引领未来”为主题&#xff0c;为教育领域新…

MYSQL期中复习

MYSQL [语句不要拼错&#xff0c;表名、列名不要写错&#xff0c;语句难记要记住] 创建表 模版 create table 表名(列名1 数据类型 [约束], 列明2 数据类型 [约束], [表级约束]); 约束 单一主码约束 primary key 联合主码约束 primary key(列名1,列名2) [要在列名12定义后…

结合Intel RealSense深度相机和OpenCV来实现语义SLAM系统

结合Intel RealSense深度相机和OpenCV来实现语义SLAM系统是一个非常强大的组合。以下是一个详细的步骤指南&#xff0c;帮助你构建这样一个系统。 硬件准备 Intel RealSense深度相机&#xff1a;例如D415、D435或L515。计算平台&#xff1a;一台具有足够计算能力的计算机&…

无人机之多源信息融合算法篇

一、概述 多源信息融合算法在无人机导航领域中扮演着越来越重要的角色。该算法通过整合来自不同传感器&#xff08;如全球定位系统GPS、惯性导航系统INS、磁力计、气压高度计、视觉传感器等&#xff09;的数据&#xff0c;利用先进的数据融合算法处理这些多源信息&#xff0c;以…

【Spring Boot】元注解

元注解 1.元注解1.1 Target1.2 Retention1.3 Inherited1.4 Documented1.5 interface 2.自定义注解2.1 创建自定义注解类2.2 实现业务逻辑2.3 使用自定义注解 1.元注解 元注解就是定义注解的注解&#xff0c;是 Java 提供的用于定义注解的基本注解。 注解 说明 Retention是注解…

索尔德 APON无线工业轨道机车定位测距仪介绍

索尔德APON无线定位测距仪&#xff0c;简称APON&#xff0c;采用先进的应答式微波测距技术&#xff0c;为车辆赋予了一双敏锐的“智慧之眼”&#xff0c;能够精确捕捉到有轨移动车辆的绝对位置&#xff0c;无论是快速穿梭还是缓慢移动&#xff0c;确保它们能够准确无误地抵达预…

企业如何选择适合自己的智能扭矩系统Torque?_SunTorque

【大家好&#xff0c;我是唐Sun&#xff0c;唐Sun的唐&#xff0c;唐Sun的Sun。一站式数智工厂解决方案服务商】 一、选择适合自己企业的智能扭矩系统时&#xff0c;可以考虑以下几个关键因素&#xff1a; 扭矩精度要求 首先要明确企业生产过程中对扭矩精度的具体要求。如果产…

全面解析:轻松掌握多模态技术精髓

多模态检索 多模态检索是指利用多种数据模态&#xff08;如文本、图像、视频、音频等&#xff09;进行信息检索的技术。它旨在通过整合不同形式的数据&#xff0c;提供更全面、精确和丰富的检索结果&#xff0c;以满足用户多样化的查询需求。 接下来分三部分&#xff1a; 单模…

net 获取本地ip地址,net mvc + net core 两种

net mvc public static string GetIP(HttpRequestBase request){// 尝试获取 X-Forwarded-For 头string result request.Headers["X-Forwarded-For"]?.Split(,).FirstOrDefault()?.Trim();if (string.IsNullOrEmpty(result)){// 获取用户的 IP 地址result reques…

云存储的费用是多少?2024年最新价格表

云存储的费用是多少最新&#xff1f;云存储的费用通常基于多个因素确定&#xff0c;包括存储容量、访问流量、请求次数、服务类型&#xff08;如对象存储、文件存储、块存储等&#xff09;、计费方式&#xff08;按量计费或包年包月&#xff09;以及可能的附加功能&#xff08;…

linux 原子操作

首先是为什么要有 原子操作 网上的截图&#xff1a; 不能从C语言来看&#xff0c;要从汇编来看 但是实际的情况有可能是这样。 A进程没有得到想要的结果。 然后是 原子操作的 底层实现 最终会是这段代码&#xff0c;当然只是一个 加一的操作。 static inline void atomic_a…

从0到1构建 UniApp + Vue3 + TypeScript 移动端跨平台开源脚手架

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f343; vue-uniapp-template &#x1f33a; 仓库主页&#xff1a; GitCode&#x1f4ab; Gitee &#x1f…