Java基础知识(8)

Java基础知识(8)

(包括:双列集合,不可变集合,Collections工具类,Stream流)

目录

Java基础知识(8)

一.双列集合

1. 双列集合的特点

2.Map

【1】Map的常见API

【2】Map的遍历

(1)Map集合的第一种遍历方式

(2) Map集合的第二种遍历方式

(3) Map集合的第三种遍历方式

3. HashMap

【1】HashMap的特点

【2】注意:

4. LinkedHashMap

【1】特点

5. TreeMap

【1】特点

【2】代码书写两种排序规则(类似TreeSet,去看基础(7))

6.可变参数

7. Collections

【1】Collections简介

【2】Collections常用的API

8. 不可变集合

【1】创建不可变集合的应用场景

【2】创建不可变集合的书写格式

二. Stream流

1.Stream流的作用

2.Stream流的使用步骤:

(1)获得Stream流

(2)Stream流的中间方法

(3)Stream流的终结方法


一.双列集合

1. 双列集合的特点

(1)双列集合一次需要存一对数据,分别为键和值

(2)键不能重复,值可以重复

(3)键和值是一一对应的,每一个键只能找到自己对应的值

(4)键+值这个整体 我们称之为“键值对”或者“键值对对象”,在Java中叫做“Entry对象”

2.Map

【1】Map的常见API

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

(2)v put(K key,v value) 添加元素

//在添加数据的时候,如果键不存在,那么直接把键值对对象添加到map集合当中,方法返回nu11

//在添加数据的时候,如果键是存在的,那么会把原有的键值对对象覆盖,会把被覆盖的值进行返回。

(3)V remove(object key) 根据键删除键值对元素

(4)void clear() 移除所有的键值对元素

(5)boolean containsKey(Object key) 判断集合是否包含指定的键

(6)boolean containsValue(Object value) 判断集合是否包含指定的值

(7)boolean isEmpty() 判断集合是否为空

(8)int size() 集合的长度,也就是集合中键值对的个数

【2】Map的遍历
(1)Map集合的第一种遍历方式

//1.创建Map集合的对象

Map<String,string> map = new HashMap<>();

//2.添加元素

//3.通过键找值

//3.1获取所有的键,把这些键放到一个单列集合当中

set<string>keys = map.keyset();

//3.2遍历单列集合,得到每一个键

for(string key :keys){

System.out.println(key);

//3.3 利用map集合中的键获取对应的值get

String value = map.get(key);

System.out.println(key+"="+ value);

}

(2) Map集合的第二种遍历方式

//3.1 通过一个方法获取所有的键值对对象,返回一个set集合

Set<Map.Entry<String,string>>entries = map.entryset();

// 3.2 遍历entries这个集合,去得到里面的每一个键值对对象

for(Map.Entry<string,string>entry :entries){

//3.3 利用entry调用get方法获取键和值

String key = entry.getKey();

String value =entry.getValue();

System.out.println(key +"=”+ value);

}

(3) Map集合的第三种遍历方式

利用1ambda表达式进行遍历

map.forEach(new Biconsumer<String, string>(){

@override

public void accept(string key, string value){

System.out.println(key+"="+ value);

});

3. HashMap

【1】HashMap的特点

(1)HashMap是Map里面的一个实现类

(2)没有额外需要学习的特有方法,直接使用Map里面的方法就可以了

(3)特点都是由键决定的:无序、不重复、无索引

(4)HashMap跟Hashset底层原理是一模一样的,都是哈希表结构

【2】注意:

(1)依赖hashcode方法和equals方法保证键的唯一

(2)如果键存储的是自定义对象,需要重写hashcode和equals方法

如果值存储自定义对象,不需要重写hashcode和equals方法

4. LinkedHashMap

【1】特点

(1)由键决定:有序、不重复、无索引。

(2)这里的有序指的是保证存储和取出的元素顺序一致

(3)原理:底层数据结构是依然哈希表,只是每个键值对元素又额外的多了一个双链表的机制记录存储的顺序

5. TreeMap

【1】特点

(1)TreeMap跟Treeset底层原理一样,都是红黑树结构的。

(2)由键决定特性:不重复、无索引、可排序

(3)可排序:对键进行排序.

(4)注意:默认按照键的从小到大进行排序,也可以自己规定键的排序规则

【2】代码书写两种排序规则(类似TreeSet,去看基础(7))

(1)实现Comparable接口,指定比较规则。

(2)创建集合时传递Comparator比较器对象,指定比较规则。

6.可变参数

(1)可变参数本质上就是一个数组

(2)作用:在形参中接收多个数据

(3)格式:数据类型..参数名称

举例:int...a

(4)注意事项

1)形参列表中可变参数只能有一个

2)可变参数必须放在形参列表的最后面

7. Collections

【1】Collections简介

(1)java.util.Collections:是集合工具类

(2)作用:Collections不是集合,而是集合的工具类。

【2】Collections常用的API

(1)public static<T>boolean addAll(Collection<T>c,T... elements) 批量添加元素

(2)public static void shuffle(List<?> list) 打乱List集合元素的顺序

(3)public static<T>void sort(List<T> list) 排序

(4)public static<T>void sort(List<T>list,Comparator<T>c) 根据指定的规则进行排序

(5)public static <T>int binarysearch(List<T>list,T key) 以二分查找法查找元素

(6)public static<T>void copy(List<T>dest, List<T> src) 拷贝集合中的元素

(7)public static<T>int fill(List<T>list, T obj) 使用指定的元素填充集合

(8)public static<T>void max/min(collection<T>coll) 根据默认的自然排序获取最大/小值

(9)public static<T>void swap(List<?>list,int i,int j) 交换集合中指定位置的元素

8. 不可变集合

【1】创建不可变集合的应用场景

(1)如果某个数据不能被修改,把它防御性地拷贝到不可变集合中是个很好的实践.

(2)当集合对象被不可信的库调用时,不可变形式是安全的。

(3)简单理解:不想让别人修改集合中的内容

【2】创建不可变集合的书写格式

(1)在List、Set、Map接口中,都存在静态的of方法,可以获取一个不可变的集合。

(2)static <E> List<E> of(E...elements) 创建一个具有指定元素的List集合对象

(3)static <E> Set<E> of(E...elements) 创建一个具有指定元素的Set集合对象

(4)static<K,V> Map<K,V> of(E...elements) 创建一个具有指定元素的Map集合

(5)注意:

1)这个集合不能 添加,不能删除,不能修改。

2)当我们要获取一个不可变的set集合时,里面的参数一定要保证唯一性

3)创建Map的不可变集合时,键是不能重复的,Map里面的of方法,参数是有上限的,最多只能传递20个参数,10个键值对。

4)如果要建立大的Map,则可以:

①//获取到所有的键值对对象(Entry对象)

Set<Map.Entry<String,string>>entries = hm.entryset();

//把entries变成一个数组

Map.Entry[] arr1 = new Map.Entry[0];

//toArray方法在底层会比较集合的长度跟数组的长度两者的大小

//如果集合的长度 >数组的长度 : 数据在数组中放不下,此时会根据实际数据的个数,重新创建数组

//如果集合的长度<=数组的长度:数据在数组中放的下,此时不会创建新的数组,而是直接用

Map.Entry[] arr2 =entries.toArray(arr1);

//不可变的map集合

Map map = Map.ofEntries(arr2);

②Map<Object,Object>map = Map.ofEntries(hm.entrySet().toArray(new Map.Entry[0]));

③(在JDK10)Map<string,string>map=Map.copyOf(hm);

(6)如:List<String> list = List.of("张三","李叫","王五","赵六");

一旦创建完毕之后,是无法进行修改,只能进行查询操作

二. Stream流

1.Stream流的作用

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

2.Stream流的使用步骤:

① 先得到一条Stream流(流水线),并把数据放上去

② 利用Stream流中的API进行各种操作

过滤 转换   中间方法  方法调用完毕之后,还可以调用其他方法

统计 打印   终结方法  最后一步,调用完毕之后,不能调用其他方法

(1)获得Stream流

1)单列集合 default Stream<E>stream()   Collection中的默认方法

如:ArrayList<string>list = new ArrayList<>();

list.stream().forEach(s->System.out.println(s));

2)双列集合 无  无法直接使用stream流

间接:HashMap<string,Integer>hm= new HashMap<>();

hm.keyset().stream().forEach(s->System.out.printin(s));(打印键)

或:hm.enterset().stream().forEach(s->System.out.printin(s));

3)数组 public static <T>Stream<T>stream(Tl array)  Arrays工具类中的静态方法。

如:int[] arr ={1,2,3,4,5,6,7,8,9,10};

Arrays. Stream (arr).forEach(s->system.out.println(s));

4)一堆零散数据 public static<T> Stream<T> of(T... values)  Stream接口中的静态方法。

如:Stream.of(1,2,3,4,5).forEach(s-> system.out.println(s));

注意stream接口中静态方法of的细节:

//方法的形参是一个可变参数,可以传递一堆零散的数据,也可以传递数组

//但是数组必须是引用数据类型的,如果传递基本数据类型,是会把整个数组当做一个元素,放到stream当中。

(2)Stream流的中间方法

1)Stream<T>filter(Predicate<? super T> predicate) 过滤

2)Stream<T>limit(long maxSize) 获取前几个元素

3)Stream<T> skip(long n) 跳过前几个元素

4)Stream<T> distinct() 元素去重,依赖(hashcode和equals方法)

5)static <T>Stream<T>concat(Stream a, Stream b) 合并a和b两个流为一个流

6)Stream<R> map(Function<T,R> mapper) 转换流中的数据类型

7)注意

/1/中间方法,返回新的stream流,原来的stream流只能使用一次,建议使用链式编程

/2/修改stream流中的数据,不会影响原来集合或者数组中的数据

如:①list.stream()

.filter(s ->s.startswith("张”))

.filter(s->s.length()== 3)

.forEach(s ->system.out.println(s));

②//list.stream().limit(3).forEach(s -> system.out.println(s));

③Stream.conca(list1.stream(),list2.stream()).forEach ( s-> System.out.printin(s));

④//string->int

//第一个类型:流中原本的数据类型

//第二个类型:要转成之后的类型

//apply的形参s:依次表示流里面的每一个数据

//返回值:表示转换之后的数据

//当map方法执行完毕之后,流上的数据就变成了整数

//所以在下面forEach当中,s依次表示流里面的每一个数据,这个数据现在就是整数了

list.stream().map(new Function<String, Integer>(){

@override

public Integer apply(String s){

string[]arr = s.split( regex:"-");

string agestring = arr[1];

int age = Integer.parseInt(agestring);

return age;

}).forEach(s->System.out.println(s));

(3)Stream流的终结方法

1)void forEach(Consumer action) 遍历

2)long count() 统计

3)toArray() 收集流中的数据,放到数组中

4)collect(Collector collector) 收集流中的数据,放到集合中

5)eg:

①// toArray():收集流中的数据,放到数组中

//IntFunction的泛型:具体类型的数组

//apply的形参:流中数据的个数,要跟数组的长度保持一致

//app1y的返回值:具体类型的数组

//方法体:就是创建数组

String[]arr =list.stream().toArray(new IntFunction<String[]>(){

@override

public string[]apply(int value){

return new string[value];

});

②Set<String>newlist2=list.stream().collect(collectors.toset());

③toMap :参数一表示键的生成规则

参数二表示值的生成规则

参数一:

Function泛型一:表示流中每一个数据的类型

泛型二:表示Map集合中键的数据类型

方法apply形参:依次表示流里面的每一个数据

方法体:生成键的代码

返回值:已经生成的键

参数二:

Function泛型一:表示流中每一个数据的类型

泛型二:表示Map集合中值的数据类型

方法apply形参:依次表示流里面的每一个数据

方法体:生成值的代码

返回值:已经生成的值

collect(Collectors.toMap(new Function<string,string>(){

@0verride

public string apply(string s){

return null;

}

           },

new Function<String,Integer>(){

@override

public Integer apply(string s){

return null;

}));

     注意点:如果我们要收集到Map集合当中,键不能重复,否则会报错

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

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

相关文章

React - Input框绑定动态State和监听onChange事件,输入时失去焦点

React - Input框绑定动态State和监听onChange事件&#xff0c;输入时失去焦点 一. 案例复现二. 解决方案 一. 案例复现 案例代码如下&#xff1a; import React, { useState } from react; import { Table, Input } from antd; const Column Table.Column; const mockData …

5.2 Java全栈开发前端+后端(全栈工程师进阶之路)-服务端框架-Spring框架-相信我看这一篇足够

1.Spring框架 1.1.Spring框架简介 Spring是一个基于java的轻量级的、一站式框架。 虽然Spring是一个轻量级框架&#xff0c;但并不表示它的功能少。实际上&#xff0c;spring是一个庞然大物&#xff0c;包罗万象。 时至今日&#xff0c;Spring已经成为java世界中事实上的标准…

邻域注意力Transformer

邻域注意力&#xff08;NA&#xff09;&#xff0c;这是第一个高效且可扩展的视觉滑动窗口注意力机制&#xff0c;NA是一种逐像素操作&#xff0c;将自注意力&#xff08;SA&#xff09;定位到最近的相邻像素&#xff0c;因此与SA的二次复杂度相比&#xff0c;具有线性时间和空…

QT day5 作业

服务器头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> //服务器类 #include <QTcpSocket> //客户端类 #include <QList> //链表类 #include <QMessageBox> //消息对话框类 #include <QDebu…

Hadoop3:HDFS的架构组成

一、官方文档 我这里学习的是Hadoop3.1.3版本&#xff0c;所以&#xff0c;查看的也是3.1.3版本的文档 Architecture模块最下面 二、HDFS架构介绍 HDFS架构的主要组成部分&#xff0c;是一下四个部分 1、NameNode(NN) 就是Master节点&#xff0c;它是集群管理者。 1、管…

QT+MYSQL数据库处理

1、打印Qt支持的数据库驱动&#xff0c;看是否有MYSQL数据库驱动 qDebug() << QSqlDatabase::drivers(); 有打印结果可知&#xff0c;没有MYSQL数据库的驱动 2、下载MYSQL数据库驱动&#xff0c;查看下面的文章配置&#xff0c;亲测&#xff0c;可以成功 Qt6 配置MySQL…

【教程向】从零开始创建浏览器插件(二)深入理解 Chrome 扩展的 manifest.json 配置文件

第二步&#xff1a;深入理解 Chrome 扩展的 manifest.json 配置文件 上一次我们已经着手完成了一个自己的浏览器插件&#xff0c;链接在这里&#xff1a;我是链接 在本篇博客中&#xff0c;我们将更详细地探讨 Chrome 扩展中的 manifest.json 文件。这个文件是每个浏览器扩展…

UBOOT介绍

一、UBOOT简介 U-boot全称 Universal Boot Loader&#xff0c;是遵循GPL条款的开放源码项目&#xff0c;uboot 是一个裸机代码&#xff0c;可以看作是一个裸机综合例程&#xff0c;执行启动内核的功能。 补充&#xff1a;GPL条款&#xff08;GNU General Public License&…

在线教程|二次元的福音!一键部署APISR,动漫画质飞跃升级

从守护城市安全的「火眼金睛」&#xff0c;到探索人体奥秘的医学之窗&#xff0c;再到娱乐产业的视觉盛宴&#xff0c;乃至遥望宇宙的卫星视角&#xff0c;超分辨率技术重塑着我们观察世界的新维度&#xff0c;让每一寸画面绽放前所未有的清晰与真实。 近年来&#xff0c;越来…

PyQt6--Python桌面开发(5.QLabel标签控件)

一.PyQt6常用基本控件 QT Designer设计器中默认对控件进行了分组 二.文本类控件 三.QLabel标签控件 3.1设置标签文本 3.2设置标签文本的对齐方式 3.3设置文本换行显示 self.label.setWordWrap(True)3.4为标签设置超链接 self.label.setOpenExternalLinks(True)3.5为标签设置…

bean在java中什么意思?这篇文章带你详细了解

bean在java中什么意思&#xff1f;这篇文章带你详细了解 在Java的世界里&#xff0c;你可能会经常听到“Bean”这个词。它听起来像咖啡豆&#xff0c;但实际上与咖啡无关。那么&#xff0c;Java Bean到底是什么呢&#xff1f; 简单来说&#xff0c;Bean是一种特殊的Java类&…

如何使用Whisper音频合成模型

Whisper 是一个通用语音识别模型&#xff0c;由 OpenAI 开发。它可以识别多种语言的语音&#xff0c;并将其转换为文本。Whisper 模型采用了深度学习技术&#xff0c;具有高准确性和鲁棒性。 1、技术原理及架构 Whisper 的工作原理&#xff1a;音频被分割成 30 秒的片段&#…

【机器学习300问】84、AdaGrad算法是为了解决什么问题?

神经网络的学习的目的是找到使损失函数的值尽可能小的参数。这是寻找最优参数的问题&#xff0c;解决这个问题的过程称为最优化。因为参数空间非常复杂&#xff0c;无法轻易找到最优解&#xff0c;而且在深度神经网络中&#xff0c;参数的数量非常庞大&#xff0c;导致最优化问…

更新、简略高效的用git(Gitee篇)

前提&#xff1a;因为很多编译软件虽然可以连接git&#xff0c;但是操作起来还是比较懵&#xff0c;不同软件有不同的上传git的方式&#xff0c;而且有的连着GitHub有的是Gitee&#xff0c;那么使用Git Bash无疑是万无一失的方式 然后这一篇也仅针对上传Gitee&#xff0c;上传G…

自动化中遇到的问题归纳总结

1、动态元素定位不到 解决方法&#xff1a;尽量使用固定元素定位&#xff0c;如没有固定元素&#xff0c;则采用绝对路径进行定位&#xff0c;因为元素路径是唯一且不变的 2、自动化脚本执行速度较慢 尽量使用css方法定位元素&#xff0c;使用等待时&#xff0c;少用sleep方…

【双碳系列】碳中和、碳排放、温室气体、弹手指、碳储量、碳循环及leap、cge、dice、openLCA模型

气候变化是当前人类生存和发展所面临的共同挑战&#xff0c;受到世界各国人民和政府的高度关注 ①“双碳”目标下资源环境中的可计算一般均衡&#xff08;CGE&#xff09;模型实践技术应用 可计算一般均衡模型&#xff08;CGE模型&#xff09;由于其能够模拟宏观经济系统运行…

【机器学习】逻辑化讲清PCA主成分分析

碎碎念&#xff1a;小编去年数学建模比赛的时候真的理解不了主成分分析中的“主成分”的概念&#xff01;&#xff01;但是&#xff0c;时隔两年&#xff0c;在机器学习领域我又行了&#xff0c;终于搞明白了&#xff01;且看正文&#xff01;再分享一个今天听到的播客中非常触…

【网络安全入门】新手如何参加护网行动?一篇带你零基础入门到精通

前言 “没有网络安全就没有国家安全”。 当前&#xff0c;网络安全已被提升到国家战略的高度&#xff0c;成为影响国家安全、社会稳定至关重要的因素之一。 一、网络安全行业特点 行业发展空间大&#xff0c;岗位非常多 网络安全行业产业以来&#xff0c;随即新增加了几十个…

LaTeX公式学习笔记

\sqrt[3]{100} \frac{2}{3} \sum_{i0}^{n} x^{3} \log_{a}{b} \vec{a} \bar{a} \lim_{x \to \infty} \Delta A B C

自动驾驶系统中的端到端学习

资料下载-《自动驾驶系统中的端到端学习&#xff08;2020&#xff09;》https://mp.weixin.qq.com/s/ttNpsn7qyVWvDMZzluU_pA 近年来&#xff0c;卷积神经网络显著提高了视觉感知能力。实现这一成功的两个主要因素是将简单的模块组合成复杂的网络和端到端的优化。然而&#xf…