JAVA进阶 —— 集合进阶

news2025/7/18 12:00:35

目录

一、 双列集合

二、 Map

1. Map的常见API

2. Map的遍历方式

2.1 第一种遍历方式:键找值

2.2 第二种遍历方式:键值对

2.3 第三种遍历方式:Lambda表达式

三、 Map的三种实现类

1.  HashMap

 2.  LinkedHashMap

3. TreeMap

3.1 练习: TreeMap基本应用

3.2 练习:统计个数

四、 可变参数

五、Collections


一、 双列集合

我们通过单列集合和双列集合的对比进行学习:

  • 单列集合:每次只能添加一个元素
  • 双列集合:每次可以添加一对元素

双列集合特点:

  1. 双列集合一次需要存入一对数据,分别为
  2. 不能重复可以重复
  3. 键和值是一 一对应的,每一个键只能找到自己对应的值。
  4. 键 + 值这个整体 我们称之为“键值对” 或者 “键值对对象”,在Java中叫做Entry对象“”。

二、 Map

Map是双列集合的顶层接口,它的功能是全部双列集合都可以继承使用的。

1. Map的常见API

方法名称说明
 V put(K key,V value)添加 / 覆盖元素
V remove(Object key)根据键删除键值对元素
void clear()移除所有的键值对元素
boolean containsKey(Object key)判断集合是否包含指定的键
boolean containsvalue(Object value)判断集合是否包含指定的值
boolean isEmpty()判断集合是否为空
int size()集合的长度,也就是集合中键值对的个数
public class MapTest {
	public static void main(String[] args) {
		// 1.创建map集合对象
		Map<String, String> m = new HashMap<>();

		// 2.添加元素

		// 在添加数据时,如果键不存在,则直接将键值对对象添加到map集合中
		// 如果键存在,则会将原有键值对对象覆盖,并且被覆盖的值会进行返回

		String value1 = m.put("郭靖", "黄蓉"); // null
		System.out.println(value1);
		m.put("韦小宝", "沐剑屏");
		m.put("尹志平", "小龙女");

		String value2 = m.put("韦小宝", "双儿");
		System.out.println(value2); // 沐剑屏

		// 打印集合
		System.out.println(m); // {韦小宝=双儿, 尹志平=小龙女, 郭靖=黄蓉}

		// 3.删除元素
		String result = m.remove("郭靖");
		System.out.println(result); // 黄蓉

		// 4.判断是否包含
		boolean keyResult = m.containsKey("郭靖");
		System.out.println(keyResult); // false
		boolean valueResult = m.containsValue("小龙女");
		System.out.println(valueResult); // true

		// 5.判断集合是否为空
		boolean result1 = m.isEmpty();
		System.out.println(result1); // false

		// 7.求集合长度
		int size = m.size();
		System.out.println(size); // 2

		// 8.清空
		m.clear(); // 没有返回值
	}
}

2. Map的遍历方式

  1. 键找值
  2. 键值对
  3. Lambda表达式

2.1 第一种遍历方式:键找值

  • 通过keySet()方法将所有的键都放在一个单列集合当中。
  • 遍历单列集合依次得到每一个键。
  • 再通过get方法获取每一个键所对应的值。
public class MapTest {
	public static void main(String[] args) {
		// 1.创建map集合对象
		Map<String, String> m = new HashMap<>();

		// 2.添加元素
		m.put("郭靖", "穆念慈");
		m.put("欧阳克", "黄蓉");
		m.put("尹志平", "小龙女");

		//3.通过键找值
		
		//3.1 获取所有的键:把这些键放到一个单列集合当中
		Set<String> keys = m.keySet();
		//3.2 遍历单列集合得到所有的键
		for (String key : keys) {
			//3.3 通过map集合当中键获取值 get
			String value = m.get(key);
			System.out.println(key + " = " + value);
		}
	}
}

2.2 第二种遍历方式:键值对

  • 通过entrySet()方法依次获取每一个键值对对象
  • 再通过getKey() getValue()方法分别获取键和值
public class MapTest {
	public static void main(String[] args) {
		// 1.创建map集合对象
		Map<String, String> m = new HashMap<>();

		// 2.添加元素
		// 键: 人物外号
		// 值: 人物姓名
		m.put("标枪选手", "马超");
		m.put("人物挂件", "明世隐");
		m.put("御龙骑士", "花木兰");

		// 3.键值对
		// 3.1 获取所有的键值对对象 ,返回一个Set对象
		Set<Entry<String, String>> entries = m.entrySet();
		for (Entry<String, String> entry : entries) {
			// 3.2 遍历集合,获取每一个键值对对象
			String key = entry.getKey();
			String value = entry.getValue();
			System.out.println(key + " = " + value);
		}
	}
}

2.3 第三种遍历方式:Lambda表达式

方法名称说明
default void forEach(BiConsumer<? super K , ? super V> action)结合lambda遍历Map集合
public class MapTest {
	public static void main(String[] args) {
		// 1.创建map集合对象
		Map<String, String> m = new HashMap<>();

		// 2.添加元素
		//键: 人物名字
		//值: 名人名言
		m.put("鲁迅", "这句话是我说的");
		m.put("曹操", "不可能绝对不可能");
		m.put("刘备", "接着奏乐接着舞");
		m.put("柯镇恶", "看我眼色行事");

		// 3.lambda表达式
		
		//forEach底层:
		//利用第二种遍历方式进行遍历,依次得到每一个键和值
		//再利用accept方法
		
		m.forEach(new BiConsumer<String,String>() {
			@Override
			public void accept(String key,String value) {
				System.out.println(key + " = " + value);
			}
		});
		System.out.println("=====================");
		//最简lambda表达式
		m.forEach((key,value)->System.out.println(key + " = " + value));
	}
}

三、 Map的三种实现类

1.  HashMap

HashMap的特点:

  • HashMap是Map里面的一个实现类。
  • 没有额外需要学习的特有方法,直接使用Map里面的方法就可以。
  • 特点是由决定的: 无序、不重复、无索引
  • HashMap和HashSet底层逻辑是一样的,都是哈希表结构
  1.  依赖hashCode方法和equals方法保证键的唯一
  2. 如果存储的是自定义对象,需要重写hashCode和equals方法。
  3. 如果存储的是自定义对象,不需要重写hashCode和equals方法。

 练习: Map集合案例: 统计投票人数

需求:
某个班级80名学生,现在需要组成秋游活动,班长提供了四个景点依次是(A、B、C、D) ,每个学生只能选择一个景点,请统计出最终哪个景点想去的人数最多。

public class hashMapTest {
	public static void main(String[] args) {
		// 1.定义数组存储景点
		String[] arr = { "A", "B", "C", "D" };

		// 2.利用随机数模拟80为同学投票
		// 并将投票结果存储起来
		ArrayList<String> list = new ArrayList<>();
		Random r = new Random();
		for (int i = 0; i < 80; i++) {
			int index = r.nextInt(arr.length);
			list.add(arr[index]);
		}

		// 3.如果统计数据多 不建议使用计数器思想
		// 我们定义map集合 利用集合进行统计
		HashMap<String, Integer> map = new HashMap<>();
		for (String name : list) {
			// 判断当前的景点在map集合当中是否存在
			if (map.containsKey(name)) {
				// 存在
				// 获取当前景点已经被投票次数
				int count = map.get(name);
				count++;
				map.put(name, count);
			} else {
				map.put(name, 1);
			}
		}
		System.out.println(map);

		// 4.求最大值
		int max = 0;
		Set<Map.Entry<String, Integer>> entries = map.entrySet();
		for (Map.Entry<String, Integer> entry : entries) {
			int count = entry.getValue();
			if (count > max) {
				max = count;
			}
		}
		System.out.println(max);

		// 5. 判断哪个景点与最大值一样
		for (Map.Entry<String, Integer> entry : entries) {
			int count = entry.getValue();
			if (count == max) {
				System.out.println(entry.getKey());
			}
		}
	}
}

 2.  LinkedHashMap

  • 由键决定 有序、不重复、无索引。
  •  这里的有序指的是保证存储和取出的顺序一致
  • 原理:底层数据结构依然是哈希表,只是每个键值对元素又额外的多加了一个双链表的机制记录存储的顺序。
public class LinkedHashMapTest {
	public static void main(String[] args) {
		// 1.创建集合
		LinkedHashMap<String, Integer> lhm = new LinkedHashMap<>();

		// 2.添加元素
		lhm.put("a", 123);
		// lhm.put("a",123 );
		lhm.put("a", 111);
		lhm.put("b", 456);
		lhm.put("d", 789);

		// 3.打印集合
		System.out.println(lhm); // {a=123, b=456, d=789}
		System.out.println(lhm); // {a=111, b=456, d=789}
	}
}

3. TreeMap

  • TreeMap跟TreeSet底层原理一样,都是红黑树结构的。
  • 由键决定特性:不重复、无索引、可排序
  • 可排序:对键进行排序
  • 注意:默认按照键的从大到小进行排序,也可以自己规定键的排序规则。

代码书写的两种排序规则:

  • 实现Comparable接口,指定比较规则。
  • 创建集合时传递Comparator比较器对象,指定比较规则。

3.1 练习: TreeMap基本应用

需求:

        键:整数表示id
        值:字符串表示商品名称
        要求:按照id的升序排列、按照id的降序排列

public class TreeMapTest {
	public static void main(String[] args) {
		// 1.创建集合对象

		// Integer Double 默认情况按升序排列
		// String 按字母在ASCII 表对应数字升序排列

		TreeMap<Integer, String> tm = new TreeMap<>(new Comparator<Integer>() {
			@Override
			public int compare(Integer i1, Integer i2) {
				// i1:当前要添加的元素
				// i2:表示已经在红黑树中存在的元素
				return i2 - i1;
			}
		});

		// 2.添加商品
		tm.put(2, "康师傅");
		tm.put(1, "粤里粤");
		tm.put(3, "九个核桃");
		tm.put(5, "可恰可乐");
		tm.put(4, "雷碧");

		// 3.打印集合
		// 默认按键升序排列
		System.out.println(tm);
	}
}

3.2 练习:统计个数

需求:字符串 “aababcabcdabcde"
请统计字符串中每一个字符出现的次数,并按照以下格式输出

输出结果:
        a (5) b (4) c (3) d (2) e ( 1)

public class TreeMapTest {
	public static void main(String[] args) {
		// 1.定义字符串
		String str = "aababcabcdabcde";

		// 2.创建集合
		TreeMap<Character, Integer> tm = new TreeMap<>();

		// 2.遍历字符串得到每一个字符
		for (int i = 0; i < str.length(); i++) {
			char c = str.charAt(i);
			// System.out.println(c);
			// 将c去集合中判断是否存在
			if (tm.containsKey(c)) {
				int count = tm.get(c);
				count++;
				tm.put(c, count);
			} else {
				tm.put(c, 1);
			}
		}
		// 打印集合
		System.out.println(tm);
		// 遍历集合按照指定格式进行拼接
		StringBuilder sb = new StringBuilder();
		tm.forEach((key, value) -> sb.append(key).append("(").append(value).append(")"));
		System.out.println(sb);
		
		StringJoiner sj = new StringJoiner("","","");
		tm.forEach((key,value) -> sj.add(key + "").add("(").add(value + "").add(")"));
		System.out.println(sj);
	}
}

四、 可变参数

  1. 可变参数本质上就是一个数组
  2. 作用:在形参中接收多个数据
  3. 格式:数据类型 ... 参数名称    举例: int ... a
  4. 注意事项:
  • 形参列表中可变参数只能有一个
  • 可变参数必须放在形参列表的最后面

 案例: 可变数组的练习

假如需要定义一个方法求和,该方法可以灵活的完成如下需求:

计算2个数据的和
计算3个数据的和

计算4个数据的和

计算n个数据的和

public class Test {
	public static void main(String[] args) {
		// JDK5
		// 可变参数:方法形参个数是可变的
		// 格式: 数据类型 ... 名字

		System.out.println(getSum(1, 2, 3)); // 6
		System.out.println(getSum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)); // 55
	}

	// 底层:
	// 可变参数底层就是一个数组
	// 只不过不需要我们去创建,java会自动帮我们创建好
	public static int getSum(int... args) {
		// System.out.println(args); //[I@7852e922
		int sum = 0;
		for (int i : args) {
			sum = sum + i;
		}
		return sum;
	}
}

五、Collections

  • java.util.Collections : 是集合工具类
  • 作用:Collections不是集合,而是集合的工具类。

 Collections的常用API:

方法名称说明
public static <T> boolean addAll(Collection<T> c , T... elements)批量添加元素
public static void shuffle(List<?> list)打乱List集合当中元素的顺序
public static <T> void sort(List<T> list)排序
public static <T> void sort(List<T> list,comparator<T> c)根据指定的规则进行排序
public static <T> int binarysearch (List<T> list,T key)以二分查找法查找元素
public static <T> void copy( List<T> dest,List<T> src)拷贝集合中的元素
public static <T> int fill (List<T> list,T obj)使用指定的元素填充集合
public static <T> void max/min(Collection<T> col1)根据默认的自然排序获取最大/小值
public static <T> void swap(List<?> list,int i, int j)交换集合中指定位置的元素
public class CollectionsTest {
	public static void main(String[] args) {
		// 1.创建集合对象
		ArrayList<String> list = new ArrayList<>();

		// 2.addAll 批量添加
		Collections.addAll(list, "abc", "bcd", "dwer", "df", "zxcv", "1234");
		System.out.println(list); // [abc, bcd, dwer, df, zxcv, 1234]

		// 3.shuffe 打乱顺序
		Collections.shuffle(list);
		System.out.println(list); // [zxcv, abc, 1234, bcd, df, dwer]
	}
}

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

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

相关文章

python智慧校园线上考试在线比赛答题系统平台源码redis

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;python考试 获取完整源码源文件说明文档配置教程等 在虚拟环境下输入命令“python manage.py runserver”启动项目&#xff0c;然后&#xff0c;访问“http://127.0.0.1:8000”进入网站首页&#xff0c;如图1所示。 注册用…

jvm之堆解读

堆&#xff08;Heap&#xff09;的核心概述 堆针对一个JVM进程来说是唯一的&#xff0c;也就是一个进程只有一个JVM&#xff0c;但是进程包含多个线程&#xff0c;他们是共享同一堆空间的。 一个JVM实例只存在一个堆内存&#xff0c;堆也是Java内存管理的核心区域。 Java堆区…

我把物流装备用到了轨道交通接驳货物上,RGV,输送线,提升机,WCS……

导语大家好&#xff0c;我是智能仓储物流技术研习社的社长&#xff0c;你的老朋友&#xff0c;老K。新书上市《智能物流系统构成与技术实践》2023年度-厂商宣传合作位--->点击详情作者&#xff1a;马洪旭“智能制造”、“智慧物流”、“绿色物流”等高频词汇已成为物流行业的…

作物杂交(spfa()算法)

蓝桥杯集训每日一题acwing3305 作物杂交是作物栽培中重要的一步。 已知有 N 种作物 (编号 1 至 N)&#xff0c;第 i 种作物从播种到成熟的时间为 Ti。 作物之间两两可以进行杂交&#xff0c;杂交时间取两种中时间较长的一方。 如作物 A 种植时间为 5 天&#xff0c;作物 B …

NTLM协议原理分析

LM Hash 和 NTLM Hashwindows用户的密码以哈希的形式保存在SAM文件中“%SystemRoot%\system32\config\SAM”。域用户的密码以哈希的形式保存在域控的 NTDS.dit 文件中。 密码的哈希值格式如下用域名:uid:LM哈希:NTLM哈希:::由于LM Hash 有安全缺陷&#xff0c;所以Windows Vist…

88. 合并两个有序数组

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。注意&#xff1a;最终&#xff0c;合并后数组不应…

【Linux】实现简易的Shell命令行解释器

大家好我是沐曦希&#x1f495; 文章目录一、前言二、准备工作1.输出提示符2.输入和获取命令3.shell运行原理4.内建命令5.替换三、整体代码一、前言 前面学到了进程创建&#xff0c;进程终止&#xff0c;进程等待&#xff0c;进程替换&#xff0c;那么通过这些来制作一个简易的…

Python每日一练(20230308)

目录 1. Excel表列名称 ★ 2. 同构字符串 ★★ 3. 分割回文串 II ★★★ &#x1f31f; 每日一练刷题专栏 C/C 每日一练 ​专栏 Python 每日一练 专栏 1. Excel表列名称 给你一个整数 columnNumber &#xff0c;返回它在 Excel 表中相对应的列名称。 例如&#xff1…

在 k8S 中搭建 SonarQube 9-community 版本(使用 PostgreSQL 数据库)

本文搭建的 SonarQube 版本是 7.4.9-community&#xff0c;由于在官方文档中声明 7.9 版本之后就不再支持使用 MySQL 数据库。所以此次搭建使用的数据库是 PostgreSQL 11.4 版本。 一、部署 PostgreSQL 服务 1. 创建命名空间 将 PostgreSQL 和 SonarQube 放在同一个命名空间…

02从零开始学Java之Java到底是个啥?

博主简介我是壹壹哥(孙玉昌)&#xff0c;十年软件开发授课经验&#xff0c;CSDN博客专家、阿里云专家博主、掘金优秀创作者、infoQ专家博主&#xff1b;关注壹壹哥(孙玉昌)&#xff0c;带你玩转Java&#xff0c;轻松实现从入门到放弃&#xff0c;哦不&#xff0c;到熟悉&#x…

【基于STM32的多功能台灯控制】

基于STM32的多功能台灯控制 在之前一篇博文中已出过智能台灯相关的介绍&#xff0c;在这里对之前的模块以及功能上进行了优化和功能上的改进&#xff0c;需源码或实物可私【创作不易-拒绝白嫖】 功能说明 1、按键模式多功能台灯在设计上使用了4个按键分别做为 按键1模式的切换…

2.5 Strassen矩阵乘法

矩阵乘法是线性代数中最常见的问题之一&#xff0c;在数值计算中有广泛的应用。设4和B是两个nxn矩阵&#xff0c;它们的乘积 AB 同样是一个nxn矩阵。A和B的乘积矩阵 C中元素C定义为C 2anw6o1若依此定义来计算4 和B的乘积短阵C&#xff0c;则每计算 C的一个元素C&#xff0c;需要…

如何提高爬虫工作效率

单进程单线程爬取目标网站太过缓慢&#xff0c;这个只是针对新手来说非常友好&#xff0c;只适合爬取小规模项目&#xff0c;如果遇到大型项目就不得不考虑多线程、线程池、进程池以及协程等问题。那么我们该如何提升工作效率降低成本&#xff1f; 学习之前首先要对线程&#…

windows下一键启动vue项目,后台运行cmd命令

1、写好启动vue的bat echo off E: cd E:\project-html\study\vue-demo npm run serve 2、准备vbs脚本&#xff0c;指向bat Set hd CreateObject("Wscript.Shell")hd.run "cmd /c C:\Users\xxh\Desktop\vue-demo.bat",vbhide 3、双击vbs脚本就可以启动了…

java八股系列——SpringMVC从接受请求到完成响应的过程

Spring的MVC框架是围绕一个DispatcherServlet来设计的&#xff0c;这个Servlet会把请求分发给各个处理器&#xff0c;并支持可配置的处理器映射、视图渲染、本地化、时区与主题渲染等&#xff0c;甚至还能支持文件上传。 流程大致如下&#xff1a; 用户发起请求&#xff1a;用…

一般用哪些工具做大数据可视化分析?

做数据分析这些年来&#xff0c;从刚开始的死磕excel&#xff0c;到现在成为数据分析行业的偷懒大户&#xff0c;使用过的工具还真不少&#xff01; 这篇分享一些我在可视化工具上的使用心得&#xff0c;由简单到复杂&#xff0c;按照可视化类型一共分为纯统计图表类、GIS地图…

C/C++每日一练(20230308)

目录 1. 最大间距 ★★★ 2. 被围绕的区域 ★★ 3. 天际线问题 ★★★ &#x1f31f; 每日一练刷题专栏 C/C 每日一练 ​专栏 Python 每日一练 ​专栏 1. 最大间距 给定一个无序的数组&#xff0c;找出数组在排序之后&#xff0c;相邻元素之间最大的差值。 如果数组…

Windows环境下nacos的下载与安装

一、nacos的下载地址&#xff1a;Releases alibaba/nacos GitHub根据自己项目配置的版本&#xff0c;下载对应的nacos客户端。windows下载上面的tar.gz的安装包&#xff0c;linux下载下面的zip包二、下载解压成功后&#xff0c;修改配置文件D:\nacos\bin下面的startup.cmd。把…

基于JavaEE社区物业管理系统开发与实现(附源码资料)

文章目录1. 适用人群2. 你将收获3.项目简介4.技术栈5.测试账号6.部分功能模块展示6.1.管理员6.2.业主1. 适用人群 本课程主要是针对计算机专业相关正在做毕业设计或者是需要实战项目的Java开发学习者。 2. 你将收获 提供&#xff1a;项目源码、项目文档、数据库脚本、软件工…

sealos 神奇功能 serverless kubernetes 之 cloud terminal

何为 serverless kubernetes 顾名思义&#xff0c;就是不需要安装直接打开网页就可以直接使用的 kubernetes&#xff0c;是一个多租户共享 kubernetes 的租户模型&#xff0c;这样做的好处是对于用户的使用成本极低&#xff0c;而且无需安装 kubernetes, 且天生对多租户的隔离…