当前位置: 首页 > news >正文

多列集合---Map

目录

前言:

一、Map

1.1 特点

1.2 方法

1.3 实现类

二、实现类

2.1 HashMap

2.2 TreeSet

2.3 LinkedHashMap

三、集合的工具类

1.1 Collections

三、总结


前言:

本篇文章重点讨论多列集合(Map),以及多列集合用到的集合工具类。

感谢大家的观看。

什么是Map?

作为多列集合,它和单列集合Set有什么相同点和区别?

Map---用于存储键值对(key--value)

如大家所见,它可以存储一对元素。

那么一对元素有什么用呢?

首先,让我们回顾单列集合的知识,同时思考一个问题。

如果我要买菜,我应该如何让菜和价格联系起来?

在单列集合中,我们只能创建一个自定义类,将菜和价格强行放在一个类中,最后通过我们的单列集合展现出来。

这样固然可以,可是,如果我想要搜索菜就带出它的价格呢?

在单列集合中,菜和价格被固化成了一个整体,我们无法通过搜索菜而寻找它对应的价格。

或者说,不存在只知道菜不知道价格的情况。

这样的局限却往往是我们生活中最常见的。

所以,映射 键值对(key---value)便应运而生。

大家都学过映射吧!

就像这样的一个东西。

Map集合左边的key(键)是唯一的,一个键值只能对应一个值;

Map集合右边的value(值)是可以相同的,不同的键可以关联相同的值。

ok,在对Map集合有了一个简单的了解后,让我们正式开始这篇Map之旅。

一、Map

---存储键值对(key--value)

1.1 特点

存储元素:必须以键值对(key--value)的方式进行;

        --键key-----唯一--------一键一值;

        --值value--可重复-----不同键可以关联相同值

查找;高效---通过唯一的key可以快速查找到对应的value

1.2 方法

size();

put(K key,V value);----给指定的key赋value值

putAll();

containsKey();

containsValue();

keySet();----返回集合中所有的key值

1.3 实现类

---核心区别:排序方式--线性安全

Map有三种实现类:

--HashMap

--TreeMap

--LinkedHashMap

二、实现类

我们已经了解到Map有三种实现类,它们和Set的实现类长的十分相似。

接下来我将会用HashMap着重讨论方法,TreeMap来进行实战练习。

2.1 HashMap

特点;

--底层Hash表-->存储顺序不保证一致

--key唯一------->自定义类要重写hashCode()和equals()方法

--线程不安全

--Null?--->查询没有键值对应的value值为null--->key可以为null,但也只能唯一

代码演示:

public class Test {public static void main(String[] args) {//创建一个HashMap集合Map<Integer,String> map=new HashMap<>();//添加元素---给指定的key赋value值map.put(0, "hello");map.put(1, "hello");map.put(0, "hello1");//hello1会将hello覆盖----键Key值唯一的体现System.out.println(map.size());System.out.println(map);//使用map.put时,需要先判断int key=0;if(!map.containsKey(key)){map.put(key, "newValue");}//通过key查询valueSystem.out.println("0:"+map.get(0));System.out.println("1:"+map.get(1));System.out.println("2:"+map.get(2));//没有---null//删除map.remove(0);System.out.println(map.remove(1));//返回被删除的值---helloSystem.out.println(map.remove(2));//null//-----------------------------map.put(0, "123");map.put(1, "456");map.put(2, "789");//------------------------------//遍历 方法1Set<Integer> set=map.keySet();System.out.println(set);for(Integer i:set){System.out.println(map.get(i));}//遍历 方法2Collection<String> coll=map.values();for(String s:coll){System.out.println(s);}//遍历 方法3---entrySet--返回Set对象:Set<Map.Entry<K,V>>,内部包含了集合中所有的键值对---包含:多个Entry类型的对象//Set<Map.Entry<K,V>> entrySet;Set<Map.Entry<Integer,String>> entries=map.entrySet();System.out.println(entries);for(Entry<Integer,String>entry:entries){System.out.println(entry.getKey());System.out.print("---"+entry.getValue());System.out.println();//遍历的时候可以修改值entry.setValue("456");}}}

2.2 TreeSet

特点:

底层---红黑树;

实现接口--->SortedMap接口--->元素顺序自动排序

线程不安全--->可以通过其他方式解决线程安全问题

接下来,让我们通过一道题来简单的看一看TreeSet。

就像我们刚开始将的一样,多列集合的出现就是为了解决这样的问题。

key--->value

public class Test {public static void main(String[] args) {Map<String,Double> tree=new TreeMap<>();tree.put("香蕉", 5.6);tree.put("樱桃", 25.0);tree.put("桃子", 5.6);tree.put("苹果", 2.3);//(1)遍历该map集合,并且统计有多少种⽔果(key),⽤两种⽅式进⾏遍历 //key值唯一,所以统计水果数量只需要加一个计数器。int num1=0;//遍历一:Set<String> set=tree.keySet();for(String str:set){System.out.print(str+"="+tree.get(str)+"  ");num1++;}System.out.println();System.out.println("水果数量:"+num1);//遍历二://key值唯一,所以统计水果数量等同于长度Set<Map.Entry<String,Double>> entries=tree.entrySet();for(java.util.Map.Entry<String, Double> entry:entries){System.out.print(entry.getKey()+"="+entry.getValue()+"  ");num1++;}System.out.println();System.out.println("水果数量:"+tree.size());//(2)将“⾹蕉”的价格修改为10.9,并删除桃⼦这组数据,//修改,用put更新tree.put("香蕉", 10.9);//删除tree.remove("桃子");//(3)将修改后的map中所有key和value都输出到控制台//遍历Set<String> set1=tree.keySet();for(String str:set1){System.out.print(str+"="+tree.get(str)+"  ");}}
}

2.3 LinkedHashMap

---HashMap的子类----多了链表

特点:通过链表记录插入顺序,(存取顺序一致)

三、集合的工具类

---帮助我们操作集合对象,全是静态方法

与此相同的还有常用的数组工具类----Arrays

---同样:帮助我们操作数组,全是静态方法

1.1 Collections

---私有构造方法--不能实例化对象--没有继承,没有实现--父类提供静态方法供外部访问。

注意:

        Collections------集合的工具类

        Collection-------单列集合的根接口

功能:

---填充,排序,翻转等

     fill---填充---使用指定元素替换指定列表中的所有元素

     max----返回最大值---单参(自然)--双参(比较器)

     min----返回最小值---单参(自然)--双参(比较器)

     reverse()---返转集合中的元素

     sort()------自然排序

     shuffle()---列表置换

     addAll(list,1,3,5,7)---添加

三、总结

在面对不同的难题时,我们要如何选择Map实现类?

集合类型核心场景排序方式
HashMap一般键值对存储(无序、高效)无序
TreeMap需要按 key 排序的场景(如排行榜)自然排序 / 比较器排序
LinkedHashMap需要保留插入顺序的场景(如日志)插入顺序

关于集合的讨论:

集合学起来并不算困难,某种意义上说,它也只是一种存储方式罢了,同数组的学习难度差不多,我们需要的是多动手,多练习。

毕竟越简单的东西越高深。

我在这里留下一道题,明天将会在对集合进行讨论时着重讨论这道题,大家可以练习一下。

问题一:

好啦!今天就到这里。

http://www.dtcms.com/a/332087.html

相关文章:

  • 【无标题】设计文档
  • Cache的基本原理和缓存一致性
  • 基于大语言模型的爬虫数据清洗与结构化
  • 可信搜索中的多重签名
  • 系统日常巡检脚本
  • 将mysql数据库表结构导出成DBML格式
  • Qt---Qt函数库
  • ActionChains 鼠标操作笔记
  • # Vue 列表渲染详解
  • AI智能体|扣子(Coze)搭建【批量识别发票并录入飞书】Agent
  • FTP 服务详解:原理、配置与实践
  • 8月14日星期四今日早报简报微语报早读
  • [激光原理与应用-273]:理论 - 波动光学 - 光是电磁波,本身并没有颜色,可见光的颜色不过是人的主观感受
  • 时钟 中断 day54
  • close函数概念和使用案例
  • rustdesk 开源遥控软件
  • 云服务器运行持续强化学习COOM框架的问题
  • 低配硬件运行智谱GLM-4.5V视觉语言模型推理服务的方法
  • C#WPF实战出真汁01--项目介绍
  • linux设备驱动之USB驱动-USB主机、设备与Gadget驱动
  • 【Java|第十九篇】面向对象九——String类和枚举类
  • AI更换商品背景,智能融合,无痕修图
  • Java中加载语义模型
  • Windows bypassUAC 提权技法详解(一)
  • 洗浴中心泡池水过滤系统原理深度解析与工程实践
  • RocketMQ 4.9.3源码解读-客户端Consumer消费者组件启动流程分析
  • 具身智能Scaling Law缺失:机器人界的“摩尔定律“何时诞生?
  • Ansible企业级实战
  • centos部署chrome和chromedriver
  • C#WPF实战出真汁03--登录界面设计