JAVA基础语法 Day11
一、Set集合
Set特点:无序(添加数据的顺序和获取出的数据顺序不一致),不重复,无索引
public class demo1 {public static void main(String[] args) {//1.创建一个集合//HashSet特点:无序,不重复,无索引//LinkedSet:有序的,根据谁先加入,输出顺序就是谁先输出Set<String> s = new LinkedHashSet<>();s.add("java");s.add("python");s.add("javascript");s.add("java");System.out.println(s);//创建一个TreeSet:它是排序的(默认一定会排,升序排列),不重复,无索引Set<Double> s2 = new TreeSet<>();s2.add(7.0);s2.add(2.5);s2.add(3.7);System.out.println(s2);}
}
1.1HashSet
底层:基于哈希表(数组+链表+红黑树)实现的
HashSet集合元素的去重操作:需求:创建一个储存学生对象的集合,当学生对象成员变量值相同时,我们认为是同一个对象,要求只保留一个。
@Override// s3.equals(s1) 方法的逻辑如下//重写后的equals方法,保证了两个对象的内容一样,结果equals返回的一定是truepublic boolean equals(Object o) {//如果自己和自己比,直接return trueif (this == o) return true;//如果o为空或者o不是学生类型,返回falseif (o == null || getClass() != o.getClass()) return false;//比较两个对象的内容是否一样:Student student = (Student) o;return age == student.age && gender == student.gender && Objects.equals(name, student.name);}@Overridepublic int hashCode() {//重写后的方法保证了,如果对象内容一样,返回的哈希值也一样return Objects.hash(name, age, gender);}@Overridepublic String toString() {return "Student{" +"name='" + this.name + '\'' +", age=" + this.age +", gender=" + this.gender +'}' + "\n";}
//掌握HashSet集合去重操作
public class demo2 {public static void main(String[] args) {Student s1 = new Student("john",15,'女');Student s2 = new Student("Bob",24,'男');Student s3 = new Student("Bob",24,'男');Set<Student> s = new HashSet<>();s.add(s1);s.add(s2);s.add(s3);System.out.println(s);/*[Student{name='Bob', age=24, gender=男}, Student{name='john', age=15, gender=女}, Student{name='Bob', age=24, gender=男}] 发现并没有去重,因为两个Bob的地址不一样,Hash值算出来也不一样!*///如果希望Set集合认为两个内容一样的对象是重复的,必须重写对象的hashCode和equals方法!//同样,右键-generate直接帮我们生成}
1.2LinkedHashSet
有序(先加的在前面,后加的在后面),不重复,无索引
底层原理:基于哈希表(数组+链表+红黑树)实现。但是,它的每个元素都额外多了一个双链表的机制来记录他前后元素的位置,从头指针读到尾指针
1.3TreeSet
特点:不重复,无索引,可排序(默认升序排序,按照元素大小,从小到大排)
底层:基于红黑树实现
注意:
对于数值类型(Integer , Double),默认按照数值本身大小升序排列
对于字符串类型,默认按照首字符的编号升序排序
对于自定义类型,如Student对象,TreeSet无法直接排序,需要自定义排序规则
方案一:这个类去实现Comparable接口
public class Teacher implements Comparable<Teacher> {
public class Demo3_TreeSet {public static void main(String[] args) {Teacher t1 = new Teacher("alice",15,'女');Teacher t2 = new Teacher("Bob" , 28 , '男');Teacher t3 = new Teacher("张三" , 22 , '男');TreeSet<Teacher> s = new TreeSet<>();s.add(t1);s.add(t2);s.add(t3);System.out.println(s);//报错,因为自定义对象无法直接排序,因为不知道大小比较的规则//两种解决方法:1.让对象所属类去实现一个Comparable比较接口,重写compare方法,指定大小比较规则//2.public TreeSet自带比较器Comparator对象,指定比较规则}
}
//t2.compareTo(t1)//t2 == this 方法中,this代表主调//t2 == o;//龟腚:如果你认为左边大于右边,返回一个正整数;反之,负整数@Overridepublic int compareTo(Teacher o){//按照年龄升序if(this.age > o.age) return 1;else if(this.age < o.age) return -1;else return 0;}
重写后,可以按找年龄大小排序了
方案二:TreeSet自带Comparator,我们调用它,可以排序。(优先使用comparator的规则)
//方案2:TreeSet<Teacher> s2 = new TreeSet<>(new Comparator<Teacher>() {@Overridepublic int compare(Teacher o1, Teacher o2) {return o2.getAge() - o1.getAge(); // 降序排列//注意,这里集合中方法重写是降序排列,Teacher类定义的是升序排列//调用时优先采用集合的降序,如果集合提供了Comparator的话}});
小结:Arraylist和HashSet更常用
二、Map集合
2.1Map的特点
Map又叫键值对集合,建不能重复,值无所谓,一个键对应一个值。
public class hashMap {public static void main(String[] args) {Map<String,Integer> m = new HashMap<>(); // 这是一行经典代码m.put("trump", 34);m.put("john", 50);m.put("ronnie", 50);m.put(null, null);System.out.println(m);//特点:无序,不重复,无索引。}
}
2.2 Map的常用方法
Map集合是所有Map集合的父类,学完他的方法,它的子类也继承了这些方法。
2.3Map的遍历方式
1.键找值
先获取Map集合的全部键,在通过遍历键来找值
public Set<k> key set() 获取所有键的集合public V get(object key) 根据键获取其对应的键
public class MapTraversal {public static void main(String[] args) {Map<String,Integer> m = new HashMap<>(); // 这是一行经典代码m.put("trump", 34);m.put("john", 50);m.put("ronnie", 51);m.put(null, null);//{null=null, ronnie=50, trump=34, john=50}//1.提取map集合的全部键,用一个Set集合装Set<String> keys = m.keySet();System.out.println(keys);//2.遍历set集合的每个键,去找值for(String key : keys){System.out.println("key" + "=" + m.get(key));}}
2.键值对
把键值对看作一个整体进行遍历。(难度较大)
使用map提供的entrySet方法,获取所有键值对
Set<Map.Entry<K,V>>entrySet()
entryset是一个实现类对象,用来封装键值对,作为一个整体。
//1.把map集合转化成set集合,里面的元素是键值对类型(map.entryset<K键的类型 V值得类型>)Set<Map.Entry<String,Integer>> entries = m.entrySet();for(Map.Entry<String , Integer> entry : entries) {System.out.println(entry);}
3.lambda
JDK8之后的新技术,非常的简单,需要用到Map的方法
default void forEach(BiConsumer<? super K , ? super V> action)
结合lambda遍历map集合
这个方法需要提供一个匿名内部类对象,可以直接简化成lambda表达式。
public class MapTraversal3_lambda {public static void main(String[] args) {Map<String,Integer> m = new HashMap<>(); // 这是一行经典代码m.put("trump", 34);m.put("john", 50);m.put("ronnie", 51);m.put("david", 23);m.put(null, null);//{null=null, ronnie=50, trump=34, john=50}System.out.println(m);//直接调用map集合的forEach方法完成遍历
// m.forEach(new BiConsumer<String, Integer>() {
// @Override
// public void accept(String key, Integer value) {
// System.out.println(key + ":" + value);
// }
// });//上述代码可以简化m.forEach((k,v)->System.out.println(k + "->" + v));
2.4Map集合的实现类——由键决定特点
1.HashMap(用的最多)
无序,不重,无索引!
事实上,原来的Set系列集合的底层就是基于Map实现的,只是Set集合中的元素只要键数据,不要值数据而已。
2.LinkedHashMap
有序,不重,无索引
事实上,原来的LinkedHashSet底层就是LinkedHashMap。它们都是基于哈希表实现的,只是每个键值对额外多加了一个双向链表。
3.TreeMap
按照大小默认升序排列,不重复,无索引。
TreeMap跟TreeSet底层一样,都是基于红黑树实现。
三、Stream流
3.1认识stream流
stream流是JDK8的新增的api,可以用于操作集合或数组的数据。
为什么要用Stream流?
结合了大量的lambda风格的语法,功能强大,性能高效,代码简洁,可读性好。
public class test1 {public static void main(String[] args) {List<String> ls = new ArrayList<String>();ls.add("张无忌");ls.add("周芷若");ls.add("周传雄");ls.add("张学友");ls.add("张敬轩");System.out.println(ls); //需求:把集合中所有以张开头,且是三个字的元素存到一个新的集合//传统方法完成需求
// List<String> new_ls = new ArrayList<>();
// for(String s : ls){
// if(s.startsWith("张") && s.length() == 3){
// new_ls.add(s);
// }
// }
// System.out.println(new_ls);//使用Stream流,调用stream方法,把它想象成一个传送带,集合中的元素被扔到这个传送带上了List<String> ls2 = ls.stream().filter(s ->s.startsWith("张")).filter(s -> s.length()==3).collect(Collectors.toList());System.out.println(ls2);
stream的使用步骤:
1.提供数据源(集合、数组。。)
2.获取数据流,stream流代表一条流水线,并能与数据源简例连接
3.调用流水线的各种方法
4.获取处理的结果,遍历统计收集到一个新集合中返回。
3.2获取stream流
public class demo2 {public static void main(String[] args) {//1.获取集合的stream流:调用集合的stream方法Collection<String> list = new ArrayList<String>();Stream<String> s1 = list.stream();//2.Map集合,如何获取?Map<String, Integer> map = new HashMap<String, Integer>();//获取键流,先调用map的keySet方法,在调用.stream方法。龟腚动作Stream<String> stream = map.keySet().stream();//获取值流:先调用map的values方法,在调用.stream方法。龟腚动作Stream<Integer> stream1 = map.values().stream();//也可以获取键值对流,先调用map的entrySet方法,在调用.stream方法。龟腚动作Stream<Map.Entry<String, Integer>> stream2 = map.entrySet().stream();//3.获取数组的stream流:两种方法Arrays.stream()或者Stream.of()String[] names = {"jhon" , "ronnie" ,"jack"};Stream<String> stream3 = Arrays.stream(names);Stream<String> stream4 = Stream.of(names);//Stream.of()里面接的是可变参数,事实上可以直接这么写Stream<String> stream5 = Stream.of("david","jay");System.out.println(stream5.count());
3.3stream流的常用操作(中间方法)
中间方法指的是调用完成后会返回新的stream流,可以继续使用,支持链式编程。
//掌握stream流提供的常用中间方法,对流上的数据进行处理,返回新的流
public class demo3 {public static void main(String[] args) {List<String> ls = new ArrayList<String>();ls.add("张无忌");ls.add("周芷若");ls.add("周传雄");ls.add("张学友");ls.add("张敬轩");System.out.println(ls);//1.过滤方法ls.stream().filter(s ->s.startsWith("张")).forEach(System.out::println);//2.排序方法,默认升序,若想要降序,使用它重载的方法List<Double> scores = new ArrayList<Double>();scores.add(1.0);scores.add(6.0);scores.add(3.14);scores.add(1.0);System.out.println(scores);//scores.stream().sorted().forEach(System.out::println);scores.stream().sorted((s1 , s2) ->Double.compare(s2,s1)).forEach(System.out::println);//降序//去重System.out.println("=============");scores.stream().distinct().forEach(System.out::println);//如果需要实现自定义对象的去重,需要重写hasCode和equals方法System.out.println("==============================");//加工方法(映射方法):把流上原来的数据拿出来加工,变成新数据,又放上去scores.stream().map(s->"加十分后:" + (s + 10)).forEach(System.out::println);//合并流:假设有s1 s2两个流,使用stream.concat()方法,合并之//Stram<Object> s3 = Stream.concat(s1,s2)}
}
3.4终结方法、收集结果
终结方法是指,调用完之后,不会返回新的stream流了,无法继续使用。
//掌握stream流的终结操作
public class demo4_stream_final {public static void main(String[] args) {List<Teacher> teachers = new ArrayList<Teacher>();teachers.add(new Teacher("张三",50,'男'));teachers.add(new Teacher("John",30,'男'));teachers.add(new Teacher("Alice",35,'女'));teachers.stream().filter(t-> t.getGender()=='男').forEach(System.out::println);System.out.println("===============");System.out.println(teachers.stream().filter(t -> t.getAge() > 31).count());System.out.println("===============");Optional<Teacher> max = teachers.stream().max((t1, t2) -> Double.compare(t1.getAge(), t2.getAge()));Teacher teacher = max.get();//获取年龄最大的老师对象System.out.println(teacher);}
收集stream流
相关文章:

JAVA基础语法 Day11
一、Set集合 Set特点:无序(添加数据的顺序和获取出的数据顺序不一致),不重复,无索引 public class demo1 {public static void main(String[] args) {//1.创建一个集合//HashSet特点:无序,不重…...

知识图谱入门——7:阶段案例:使用 Protégé、Jupyter Notebook 中的 spaCy 和 Neo4j Desktop 搭建知识图谱
在 Windows 环境中结合使用 Protg、Jupyter Notebook 中的 spaCy 和 Neo4j Desktop,可以高效地实现从自然语言处理(NLP)到知识图谱构建的全过程。本案例将详细论述环境配置、步骤实现以及一些扩展和不足之处。 文章目录 1. 环境准备1.1 Neo4j…...

【AIGC】VoiceControl for ChatGPT指南:轻松开启ChatGPT语音对话模式
博客主页: [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯安装VoiceControl for ChatGPT插件💯如何使用VoiceControl for ChatGPT进行语音输入VoiceControl for ChatGPT快捷键注意点 💯VoiceControl for C…...

基于SpringCloud的微服务架构下安全开发运维准则
为什么要进行安全设计 微服务架构进行安全设计的原因主要包括以下几点: 提高数据保护:微服务架构中,服务间通信频繁,涉及到大量敏感数据的交换。安全设计可以确保数据在传输和存储过程中的安全性,防止数据泄露和篡改。…...

vue的图片显示
通过参数 调用方法 进行显示图片 方法一: 方法二:...
深度学习06:线性回归模型
线性回归:从理论到实现 1. 什么是线性回归? 线性回归是一种用于预测因变量(目标值)和自变量(特征值)之间关系的基本模型。它假设目标值(y)是特征值(x)的线性…...
Angular ng-state script 元素的生成机制介绍
ng-state 的生成过程是在 Angular SSR 中非常关键的部分。为了让客户端能够接管服务器渲染的页面状态,Angular 在服务器端需要将应用的当前状态保存下来,并将其嵌入到返回的 HTML 中。这样,客户端在接管时就可以直接使用这些状态,…...

小程序-全局数据共享
目录 1.什么是全局数据共享 2. 小程序中的全局数据共享方案 MboX 1. 安装 MobX 相关的包 2. 创建 MobX 的 Store 实例 3. 将 Store 中的成员绑定到页面中 4. 在页面上使用 Store 中的成员 5. 将 Store 中的成员绑定到组件中 6. 在组件中使用 Store 中的成员 1.什么是全…...

vSAN01:vSAN简介、安装、磁盘组、内部架构与调用关系
目录 传统的共享存储vSAN存储OSA的系统要求vSAN安装vSAN集群vSAN skyline healthvSAN与HA磁盘组混合磁盘架构全闪磁盘架构 vSAN对象vSAN内部架构 传统的共享存储 通过隔离的存储网络使得不同的ESXi主机访问独立的存储设备。需要前期投入较高的资金单独采购存储、网络可以单独规…...
Apache NiFi最全面试题及参考答案
目录 解释什么是Apache NiFi以及它的主要用途。 NiFi 的数据处理流程是怎样的? NiFi 的架构包括哪些组件? 解释 NiFi 的 “FlowFile” 概念及其组成部分。 NiFi 的 “Processor” 是什么?有哪些类型? 如何在 NiFi 中创建一个新的数据流? NiFi 的 “Connection” 有…...
基于Docker部署最新版本SkyWalking【10.1.0版本】
文章目录 前言前置条件一、创建Docker 网络二、部署 SkyWalking OAP 服务器三 部署 SkyWalking UI四 查看日志4.1. 查看 SkyWalking OAP 日志4.2. 查看 SkyWalking UI 日志 五 停止并删除容器结论 前言 由于本地的 JDK 版本与 SkyWalking 对应的 JDK 版本不一致,为…...
如何在 Ubuntu 18.04 上使用 LEMP 安装 WordPress
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 简介 WordPress 是互联网上最流行的 CMS(内容管理系统)。它允许您在 MySQL 后端和 PHP 处理的基础上轻松设置灵…...
shadcn-vue 快速入门(2)
components.json 关于项目配置 components.json 文件保存了项目的配置信息。 我们使用该文件了解项目的基本设定,并生成定制化的组件以适应项目需求。 注意:components.json 文件是可选的,仅在使用 CLI 向项目添加组件时才需要。如果使用复…...

Oracle数据恢复—异常断电导致Oracle数据库报错的数据恢复案例
Oracle数据库故障: 机房异常断电后,Oracle数据库启库报错:“system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。数据库没有备份,归档日志不连续。用户方提供了Oracle数据库的在线文件,需要恢复zxf…...

数据结构-4.1.特殊矩阵的压缩存储
一.一维数组的存储结构: 1.知道一维数组的起始地址,就可以求出任意下标对应的元素所在的地址; 2.注:如果数组下标从1开始,上述公式的i就要改为i-1; 3.数组里的元素类型相同,因此所占空间也相同…...
Hive数仓操作(十四)
一、Hive的DDL语句 在 Hive 中,DDL(数据定义语言)语句用于数据库和表的创建、修改、删除等操作。以下是一些重要的 DDL 语句: 1. 创建数据库和表 创建数据库 CREATE DATABASE IF NOT EXISTS database_name;创建表 CREATE TABLE …...
SpringBoot技术:实现古典舞在线交流平台的秘诀
摘 要 随着互联网技术的发展,各类网站应运而生,网站具有新颖、展现全面的特点。因此,为了满足用户古典舞在线交流的需求,特开发了本古典舞在线交流平台。 本古典舞在线交流平台应用Java技术,MYSQL数据库存储数据&#…...

自动驾驶系列—全面解析自动驾驶线控制动技术:智能驾驶的关键执行器
🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…...

YOLO11改进|卷积篇|引入可变核卷积AKConv
目录 一、AKConv卷积1.1AKConv卷积介绍1.2AKConv核心代码 五、添加MLCA注意力机制5.1STEP15.2STEP25.3STEP35.4STEP4 六、yaml文件与运行6.1yaml文件6.2运行成功截图 一、AKConv卷积 1.1AKConv卷积介绍 AKConv允许卷积参数的数量以线性方式增加或减少,而不是传统的…...

推荐 uniapp 相对好用的海报生成插件
插件地址:自定义canvas样式海报 - DCloud 插件市场 兼容性也是不错的:...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...

wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...