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流

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

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

相关文章

【操作系统】体系结构

&#x1f339;&#x1f60a;&#x1f339;博客主页&#xff1a;【Hello_shuoCSDN博客】 ✨操作系统详见 【操作系统专项】 ✨C语言知识详见&#xff1a;【C语言专项】 目录 操作系统的内核 操作系统结构——分层结构 操作系统结构——模块化 操作系统结构——宏内核、微内核…

Unity各个操作功能+基本游戏物体创建与编辑+Unity场景概念及文件导入导出

各个操作功能 部分功能 几种操作游戏物体的方式&#xff1a; Center:有游戏物体父子关系的时候&#xff0c;中心点位置 Global/Local:世界坐标系方向/自身坐标系方向 &#xff1a;调试/暂停/下一帧 快捷键 1.Alt鼠标左键&#xff1a;可以实现巡游角度查看场景 2.鼠标滚轮…

Linux忘记root用户密码怎么重设密码

直接说步骤&#xff1a; 1.重启客户机 2.在选择内核页面快速按e键&#xff0c;进入编辑模式 进入后应该是这个样子 在这里只能按上下键切换行 找到Linux16这里 3.按右方向键切换到行尾&#xff0c;也就是UTF-8处&#xff0c;在后面添加一个空格&#xff0c;然后加上这段话 …

【回眸】Tessy 单元测试软件使用指南(四)常见报错及解决方案与批量初始化的经验

前言 分析时Tessy的报错 1.fatal error: Tricore/Compilers/Compilers.h: No such file or directory 2.error: #error "Compiler unsupported" 3.warning: invalid suffix on literal;C11 requires a space between literal and string macro 4.error: unknown…

C0004.Qt中QComboBox设置下拉列表样式后,下拉列表样式无效的解决办法

问题描述 我们平时在使用Qt Creator对控件QComboBox的样式进行设置后&#xff0c;在运行程序启动界面时&#xff0c;发现设置的样式无效&#xff0c;效果如下&#xff1a; /* 设置下拉菜单框的样式 */ QComboBox QAbstractItemView {border: 1px solid rgb(161,161,161); /* …

【D3.js in Action 3 精译_028】3.4 小节 DIY 实战:使用 Observable 在线绘制 D3 条形图

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可…

leetcode135:分发糖果

步骤1&#xff1a;计算问题性质的定义 我们需要解决的题目是一个典型的贪心算法问题&#xff0c;要求分发糖果的数量&#xff0c;满足特定条件。以下是问题的详细定义&#xff1a; 输入&#xff1a; ratings&#xff1a;长度为 n 的数组&#xff0c;表示每个孩子的评分&#x…

【51单片机】点亮LED之经典流水灯

开发环境 开发板&#xff1a;普中51-单核-A2单片机&#xff1a;STC89C52RC&#xff08;双列直插40引脚 DIP40&#xff09;Keil uVision5 v9.61 最新版破解方法自行百度&#xff0c;相关文档和视频资料很多&#xff0c;我自己将这一操作记录下来当做博客发布&#xff0c;CSDN以…

Pikachu-Unsafe FileUpload-客户端check

上传图片&#xff0c;点击查看页面的源码&#xff0c; 可以看到页面的文件名校验是放在前端的&#xff1b;而且也没有发起网络请求&#xff1b; 所以&#xff0c;可以通过直接修改前端代码&#xff0c;删除 checkFileExt(this.value) 这部分&#xff1b; 又或者先把文件名改成…

职业技术学校开设无人机培训技术详解

职业技术学校开设无人机培训技术&#xff0c;是一个涉及多个方面的综合性教学过程。以下是对该培训技术的详细解析&#xff1a; 一、培训目标 无人机培训技术的目标在于培养学员掌握无人机的基本原理、组装调试、飞行操作、安全规范及维修保养等技能&#xff0c;使其成为具备…

【Android】中级控件

其他布局 相对布局RelativeLayout RelativeLayout下级视图的位置是相对位置&#xff0c;得有具体的参照物才能确定最终位置。如果不设定下级视图的参照物&#xff0c;那么下级视图默认显示在RelativeLayout内部的左上角。用于确定视图位置的参照物分两种&#xff0c;一种是与…

Linux环境基础开发工具使用(2)

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Linux环境基础开发工具使用(2) 收录于专栏[Linux学习] 本专栏旨在分享学习Linux的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1. Li…

Qt Quick 3D 入门:QML 3D场景详解

随着 Qt 6 的发布&#xff0c;QtQuick3D 模块带来了新的 3D 渲染和交互能力&#xff0c;使得在 Qt 中创建 3D 场景变得更加简单和直观。本文将带您从一个简单的 QML 3D 应用开始&#xff0c;详细讲解各个相关领域的概念、代码实现以及功能特点。 什么是 Qt Quick 3D&#xff1…

git维护【.gitignore文件】

在工程下添加 .gitignore 文件【git忽略文件】 *.class .idea *.iml *.jar /*/target/

订阅ROS2中相机的相关话题并保存RGB、深度和点云图

系统&#xff1a;Ubuntu22.04 ROS2版本&#xff1a;ROS2 humble 1.订阅ROS2中相机的相关话题并保存RGB图、深度图和点云图 ros2 topic list/stellar_1/rgb/image_raw /camera/depth/image_raw /stellar_1/points2CMakeLists.txt cmake_minimum_required(VERSION 3.15) projec…

Docker安装人大金仓(kingbase)关系型数据库教程

人大金仓数据库(KingbaseES)是由中国人民大学金仓公司研发的一款自主知识产权的关系型数据库管理系统。 官网地址:https://www.kingbase.com.cn/ 本章教程,主要介绍如何用Docker安装启动人大金仓(kingbase)关系型数据库。 一、下载镜像 下载地址:https://www.kingbase.c…

螺蛳壳里做道场:老破机搭建的私人数据中心---Centos下Docker学习04(环境准备)

4 创建docker容器 4.1创建网络 [rootlocalhost wutool]# docker network create -d macvlan --subnet192.168.137.0/24 --gateway192.168.137.2 --ip-range192.168.137.0/24 -o parentens33 nat 52af11381bfd655d175e4168265b2a507793e8fe48f119db846949ffd4dd27de [rootlocal…

​IAR全面支持国科环宇AS32X系列RISC-V车规MCU

全球领先的嵌入式系统开发软件解决方案供应商IAR与北京国科环宇科技股份有限公司&#xff08;以下简称”国科环宇”&#xff09;联合宣布&#xff0c;最新版本IAR Embedded Workbench for RISC-V将全面支持国科环宇AS32X系列RISC-V MCU&#xff0c;双方将共同助力中国汽车行业开…

文件上传之%00截断(00截断)以及pikachu靶场

pikachu的文件上传和upload-lab的文件上传 目录 mime type类型 getimagesize 第12关%00截断&#xff0c; 第13关0x00截断 差不多了&#xff0c;今天先学文件上传白名单&#xff0c;在网上看了资料&#xff0c;差不多看懂了&#xff0c;但是还有几个地方需要实验一下&#…

自然语言处理问答系统技术

自然语言处理问答系统技术 随着人工智能的不断发展&#xff0c;自然语言处理&#xff08;NLP&#xff09;技术已成为推动智能问答系统发展的核心技术。问答系统是利用NLP来解析用户提出的问题&#xff0c;并从知识库中找到最相关的答案。在许多应用中&#xff0c;如智能客服、…