06 MapStream递归

Collections(集合工具类)

可变参数

就是一种特殊形参,定义在方法、构造器的形参列表里,定义格式是:方法名(数据类型… 形参名称){ }

可变参数的特点和好处

**特点:**可以不传数据给它;可以传一个或者同时传多个数据给它;也可以传一个数组给它。
**好处:**常常用来灵活的接收数据。

可变参数的注意事项

  • 可变参数在方法内部就是一个数组
  • 一个形参列表中可变参数只能有一个
  • 可变参数必须放在形参列表的最后面

Collections

  • java.utils.Collections:是集合工具类
  • 作用: Collections并不属于集合,是用来操作集合的工具类。

Collections常用的API

方法名称说明
public static boolean addAll(Collection<? super T> c, T… elements)给集合对象批量添加元素
public static void shuffle(List<?> list)打乱List集合元素的顺序

Collections排序相关API

  • 使用范围:只能对于List集合的排序。

排序方式1:

方法名称说明
public static void sort(List list)将集合中元素按照默认规则排序

注意:本方式不可以直接对自定义类型的List集合排序,除非自定义类型实现了比较规则Comparable接口。

排序方式2:

方法名称说明
public static void sort(List list,Comparator<? super T> c)将集合中元素按照指定规则排序

Map集合

概述

  • Map集合称为双列集合,一次需要存一对数据做为一个元素, 格式:{key1=value1 , key2=value2 , key3=value3 , …}
  • Map集合的每个元素分为两部分:key和value,key称为键,value称为值,整体叫键值对,因此Map也叫“键值对集合”
  • Map集合的所有键是不允许重复的,但值可以重复,键和值是一一对应的,每一个键只能找到自己对应的值

Map集合是什么, 使用场景?

  • Map集合是键值对集合

  • Map集合非常适合做类购物车这样的业务场景。

特点

  • HashMap: 无序、不重复(用的最多)

  • LinkedHashMap :有序、不重复 无索引

  • TreeMap: 按照大小默认升序排序、不重复 无索引

常用方法

  • 为什么使用Map集合
  • Map是双列集合的祖宗接口,它的功能是全部双列集合都可以继承使用的。
  • Map API如下:
方法名称说明
public V put(K key,V value)添加/修改元素
public int size()获取集合的大小
public void clear()清空集合
public boolean isEmpty()判断集合是否为空
public V get(Object key)根据键获取对应值
public V remove(Object key)根据键删除整个元素
public boolean containsKey(Object key)判断是否包含某个键
public boolean containsValue(Object value)判断是否包含某个值
public Set keySet()获取全部键的集合
public Collection values()获取Map集合的全部值

遍历方式(三种)

Map集合的遍历方式一

先获取Map集合全部的键,再通过遍历键来找值

方法名称说明
public Set keySet()获取所有键的集合
public V get(Object key)根据键获取其对应的值
Map集合的遍历方式二

把“键值对”看成一个整体进行遍历

Map提供的方法说明
Set<Map.Entry<K, V>> entrySet()获取所有“键值对”的集合
Map.Entry提供的方法说明
K getKey()获取键
V getValue()获取值
image-20240413202404586
Map集合的遍历方式三

需要用到Map的如下方法

方法名称说明
default void forEach(BiConsumer<? super K, ? super V> action)结合lambda遍历Map集合

image-20240413202546989

HashMap

Map集合体系

image-20240413204841829
底层原理

HashMap跟HashSet的底层原理是一模一样的,都是基于哈希表实现的。

实际上:原来学的Set系列集合的底层就是基于Map实现的,只是Set集合中的元素只要键数据,不要值数据而已。

public HashSet() {  map = new HashMap<>(); }

哈希表

  • JDK8之前,哈希表 = 数组+链表
  • JDK8开始,哈希表 = 数组+链表+红黑树
  • 哈希表是一种增删改查数据,性能都较好的数据结构。

HashMap底层是基于哈希表实现的

  • HashMap集合是一种增删改查数据,性能都较好的集合
  • 但是它是无序,不能重复,没有索引支持的(由键决定特点)
  • HashMap的键依赖hashCode方法和equals方法保证键的唯一
  • 如果键存储的是自定义类型的对象,可以通过重写hashCode和equals方法,这样可以保证多个对象内容一样时,HashMap集合就能认为是重复的。
总结

HashMap如何实现键的唯一性的?

  • 依赖hashCode方法和equals方法保证键的唯一。
  • 如果键要存储的是自定义对象,需要重写hashCode和equals方法。

HashMap的特点

  • HashMap是Map里面的一个实现类。特点都是由键决定的:无序、不重复、无索引
  • 没有额外需要学习的特有方法,直接使用Map里面的方法就可以了。
  • HashMap跟HashSet底层原理是一模一样的,都是哈希表结构,只是HashMap的每个元素包含两个值而已。

实际上:Set系列集合的底层就是Map实现的,只是Set集合中的元素只要键数据,不要值数据而已。

LinkedHashMap

原理

底层数据结构依然是基于哈希表实现的,只是每个键值对元素又额外的多了一个双链表的机制记录元素顺序(保证有序)。

由键决定: 有序 不重复 无索引

image-20240413210908828

TreeMap

TreeMap集合的特点是怎么样的?

  • 根据键可排序、不重复、无索引
  • 底层基于红黑树实现排序,增删改查性能较好

TreeMap集合自定义排序规则有几种方式

  • 2种。
  • 类实现Comparable接口,重写比较规则。
  • 集合自定义Comparator比较器对象,重写比较规则。

集合嵌套

指的是集合中的元素又是一个集合

案例: Map集合案例-省和市

需求
要求在程序中记住如下省份和其对应的城市信息,记录成功后,要求可以查询出湖北省的城市信息。

江苏省 = 南京市,扬州市,苏州市,无锡市,常州市
湖北省 = 武汉市,孝感市,十堰市,宜昌市,鄂州市
河北省 = 石家庄市,唐山市,邢台市,保定市,张家口市

分析

  • 定义一个Map集合,键用表示省份名称,值表示城市名称,注意:城市会有多个。Map<String,List>
  • 根据“湖北省”这个键获取对应的值展示即可。
public static void main(String[] args) {HashMap<Object, List<String>> map = new HashMap<>();map.put("江苏省", Arrays.asList("南京市", "扬州市", "苏州市", "无锡市", "常州市"));map.put("湖北省", Arrays.asList("武汉市", "孝感市", "十堰市", "宜昌市", "鄂州市"));ArrayList<String> arrayList = new ArrayList<>();Collections.addAll(arrayList, "石家庄市", "唐山市", "邢台市", "保定市", "张家口市");map.put("河北省", arrayList);List<String> list = map.get("湖北省");for (String s : list) {System.out.println(s);}}

Stream流

什么是Stream?

  • 也叫Stream流,是Jdk8开始新增的一套API (java.util.stream.*),可以用于操作集合或者数组的数据。
  • 优势: Stream流大量的结合了Lambda的语法风格来编程,提供了一种更加强大,更加简单的方式操作集合或者数组中的数据,代码更简洁,可读性更好。

Stream流的作用是什么,结合了什么技术?

  • 简化集合、数组操作的API。结合了Lambda表达式。

Stream流的思想和使用步骤

  • 先得到集合或者数组的Stream流(就是一根传送带)。
  • 然后调用Stream流的方法对数据进行处理(操作)
  • 获取处理的结果(终结)
image-20240413213421371

常用方法

集合获取Stream流的方式

可以使用Collection接口中的默认方法stream()生成流

名称说明
default Stream stream()获取当前集合对象的Stream流

数组获取Stream流的方式

名称说明
public static Stream stream(T[] array)获取当前数组的Stream流
public static Stream of(T… values)获取当前数组/可变数据的Stream流

Stream流的常用API(中间操作方法)

Stream提供的常用中间方法说明
Stream filter(Predicate<? super T> predicate)用于对流中的数据进行过滤
Stream sorted()对元素进行升序排序
Stream sorted(Comparator<? super T> comparator)按照指定规则排序
Stream limit(long maxSize)获取前几个元素
Stream skip(long n)跳过前几个元素
Stream distinct()去除流中重复的元素。
Stream map(Function<? super T,? extends R> mapper)对元素进行加工,并返回对应的新流
static Stream concat(Stream a, Stream b)合并a和b两个流为一个流

注意:

  • 中间方法也称为非终结方法,调用完成后返回新的Stream流可以继续使用,支持链式编程。
  • 在Stream流中无法直接修改集合、数组中的数据。

Stream流的常见终结操作方法

Stream提供的常用终结方法说明
void forEach(Consumer action)对此流运算后的元素执行遍历
long count()统计此流运算后的元素个数
Optional max(Comparator<? super T> comparator)获取此流运算后的最大值元素
Optional min(Comparator<? super T> comparator)获取此流运算后的最小值元素

终结方法指的是调用完成后,不会返回新Stream了,没法继续使用流了。

它的作用是对流中的数据进行筛选(遍历、最大、最小、统计个数)

Stream流的收集方法

收集方法就是把Stream流操作后的结果转回到集合或者数组中去返回。

名称说明
R collect(Collector collector)开始收集Stream流,指定收集器

Collectors工具类提供了具体的收集方式

名称说明
public static Collector toList()把元素收集到List集合中
public static Collector toSet()把元素收集到Set集合中
public static Collector toMap(Function keyMapper , Function valueMapper)把元素收集到Map集合中
  • 收集Stream流的作用 ?
    • Stream流是操作集合/数组的手段
    • 操作的结果数据最终要恢复到集合或者数组中去。

递归

认识递归

什么是递归?

  • 递归是一种算法,在程序设计语言中广泛应用。
  • 从形式上说:方法调用自身的形式称为方法递归( recursion)。

递归的形式

  • 直接递归:方法自己调用自己。
  • 间接递归:方法调用其他方法,其他方法又回调方法自己。

使用方法递归时需要注意的问题:

  • 递归如果没有控制好终止,会出现递归死循环,导致栈内存溢出错误。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Edge 浏览器使用方法和经验技巧

目前我已经将主力浏览器从火狐更换到Edge&#xff0c;本文将会根据我自己的使用经验来不断更新完善&#xff0c;内容包括下载、常用插件、使用技巧和常见问题等 下载安装 Edge是win10内置的浏览器&#xff0c;因此多数人不需要下载&#xff0c;如果你的电脑并没有安装&#x…

LearnOpenGL(二)之三角形

一、重要概念 顶点数组对象&#xff1a;Vertex Array Object&#xff0c;VAO顶点缓冲对象&#xff1a;Vertex Buffer Object&#xff0c;VBO元素缓冲对象&#xff1a;Element Buffer Object&#xff0c;EBO 或 索引缓冲对象 Index Buffer Object&#xff0c;IBO 以数组的形式…

《2024最新Java面试题及答案(带完整目录)》

2024最新Java面试题及答案有史以来见过的最全面试题 获取链接&#xff1a;《2024最新Java面试题及答案&#xff08;带完整目录&#xff09;》 更多技术书籍&#xff1a;技术书籍分享&#xff0c;前端、后端、大数据、AI、人工智能... ​ ​ ​ 4.1.9.8. 可重入锁&#xff…

【KMP】优质模板推荐+解读

KMP – y神模板 引言&#xff1a;由于本人与4月20日前周五的一节数据结构课中偶然听到了老师讲kmp这个算法的概念并且发现老师讲的听不懂一点儿导致异常难受&#xff0c;于是花了两天左右自行弄懂了kmp算法的逻辑&#xff0c;并写下本文以便以后复习&#xff0c;并作留念。 声明…

数据结构10:堆和堆排序

文章目录 树的概念及结构树的概念树的相关概念树的表示树在实际中的应用表示文件系统的目录树结构 二叉树概念及结构概念特殊的二叉树二叉树的性质二叉树的存储结构顺序存储链式存储 二叉树的顺序结构及实现二叉树的顺序结构堆的概念及结构 堆的实现堆的插入堆的删除堆的创建向…

8.1 二叉排序树 —— C语言实现

系列文章目录 参考船说系列——数据结构与算法中的第八章内容。 二叉排序树AVL树红黑树B-树 文章目录 系列文章目录前言一、二叉排序树基础二、二叉排序树的操作2.1 插入2.2 删除 三、代码演示总结参考文献 前言 数据结构 结构定义 结构操作 结构操作是用来维护结构性质的…

spring高级篇(二)

1、Aware和InitializingBean Aware和InitializingBean都与Bean的生命周期管理相关。 Aware接口: 概念: Aware接口是Spring框架中的一个标记接口&#xff0c;它表示一个类能够感知到&#xff08;aware of&#xff09;Spring容器的存在及其特定的环境。Spring框架提供了多个Awar…

自然语言处理基础面试

文章目录 TF-IDFbag-of-wordsBert 讲道理肯定还得有Transformer&#xff0c;我这边先放着&#xff0c;以后再加吧。 TF-IDF TF&#xff08;全称TermFrequency&#xff09;&#xff0c;中文含义词频&#xff0c;简单理解就是关键词出现在网页当中的频次。 IDF&#xff08;全称…

【Pytorch】PytorchCPU版或GPU报错异常处理(10X~4090D)

Pytorch为CPU版或GPU使用报错异常处理 文章目录 Pytorch为CPU版或GPU使用报错异常处理0.检查阶段1. 在conda虚拟环境中安装了torch2.卸载cpuonly3.从tsinghua清华源安装不完善误为cpu版本4.用tsinghua清华源安装成cpu错误版本5.conda中torch/vision/cudatoolkit版本与本机cuda版…

Python基础学习之**kwargs

在Python编程中&#xff0c;**kwargs 是一个强大的工具&#xff0c;它允许我们在函数定义中接受任意数量的关键字参数。kwargs 是 "keyword arguments" 的缩写&#xff0c;实际上是一个字典&#xff0c;其中包含了传递给函数的所有关键字参数。本文将详细介绍 **kwar…

文本美学:text-image打造视觉吸引力

当我最近浏览 GitHub 时&#xff0c;偶然发现了一个项目&#xff0c;它能够将文字、图片和视频转化为文本&#xff0c;我觉得非常有趣。于是我就花了一些时间了解了一下&#xff0c;发现它的使用也非常简单方便。今天我打算和家人们分享这个发现。 项目介绍 话不多说&#xf…

用或非门构成的基本触发器

用或非门构成的基本触发器 电路组成 & 逻辑符号 注意&#xff1a;与用与非门构成的基本触发器相比&#xff0c;不仅 R 、 S R、S R、S 的几何位置不同&#xff0c;而且其上无反号&#xff0c;即高电平有效&#xff0c; Q Q Q 和 Q ‾ \overline{Q} Q​ 仍表示触发器的状…