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.xdnf.cn/news/1553254.html

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

相关文章

Linux高级编程_27_系统调用

文章目录 系统调用函数分类系统编程概述系统调用概述**类UNIX系统的软件层次** 用户态和内核态系统调用与库函数的关系文件操作符概述文件磁盘权限 系统调用之文件操作open:打开文件close:关闭文件write:写入read:读取 文件状态fcntl 函数stat 函数 st_mode的值示例 1&#xff…

synchronized底层是怎么通过monitor进行加锁的?

一、monitor是什么 monitor叫做对象监视器、也叫作监视器锁&#xff0c;JVM规定了每一个java对象都有一个monitor对象与之对应&#xff0c;这monitor是JVM帮我们创建的&#xff0c;在底层使用C实现的。 ObjectMonitor() {_header;_count ; // 非常重要&#xff0c;表示锁计数…

【论文速看】DL最新进展20241002-自动驾驶、自监督学习、扩散模型、多模态与图像分割

目录 【自动驾驶】【自监督学习】【扩散模型】【多模态与图像分割】 【自动驾驶】 [轨迹预测] CASPFormer: Trajectory Prediction from BEV Images with Deformable Attention 论文链接&#xff1a;https://arxiv.org/pdf/2409.17790 代码链接&#xff1a;无 运动预测是自动…

基于深度学习的乳腺癌分类识别与诊断系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 乳腺癌是全球最常见的癌症之一&#xff0c;早期诊断对于治疗效果至关重要。近年来&#xff0c;深度学习技术在医学图像分析领域取得了显著进展&#xff0c;能够从大量的医学影像数据中自动学习和提…

[动态规划] 二叉树中的最大路径和##树形DP#DFS

标题&#xff1a;[动态规划] 二叉树中的最大路径和##树形DP#DFS 个人主页水墨不写bug &#xff08;图片来源于网络&#xff09; 目录 一 、什么是树形DP 二、题目描述&#xff08;点击题目转跳至题目&#xff09; NC6 二叉树中的最大路径和 算法思路&#xff1a; 讲解与参考代…

建筑业挂靠行为的防范建议

在建筑行业中&#xff0c;挂靠行为的普遍存在给许多企业带来了法律风险和信誉风险。为了防范这些风险&#xff0c;企业需要采取一系列有效的措施。 一、加强资质管理 企业应当通过合法途径获取和提升自身的资质等级&#xff0c;避免因资质不足而产生挂靠的需求。加强资质管理是…

Python从入门到高手4.2节-掌握循环控制语句

目录 4.2.1 理解循环控制 4.2.2 for循环结构 4.2.3 循环结构的else语句 4.2.4 while循环结构 4.2.5 循环结构可以嵌套 4.2.6 国庆节吃好玩好 4.2.1 理解循环控制 我们先来搞清楚循环的含义。以下内容引自汉语词典: 循环意指往复回旋&#xff0c;指事物周而复始地运动或变…

html+css+js实现Collapse 折叠面板

实现效果&#xff1a; HTML部分 <div class"collapse"><ul><li><div class"header"><h4>一致性 Consistency</h4><span class"iconfont icon-jiantou"></span></div><div class"…

Linux中的进程间通信之共享内存

共享内存 共享内存示意图 共享内存数据结构 struct shmid_ds {struct ipc_perm shm_perm; /* operation perms */int shm_segsz; /* size of segment (bytes) */__kernel_time_t shm_atime; /* last attach time */__kernel_time_t shm_dtime; /* last detach time */__kerne…

【Java】—— 集合框架:List接口常用方法与List接口的实现类

目录 4. Collection子接口1&#xff1a;List 4.1 List接口特点 4.2 List接口方法 4.3 List接口主要实现类&#xff1a;ArrayList 4.4 List的实现类之二&#xff1a;LinkedList 4.5 List的实现类之三&#xff1a;Vector 4.6 练习 4. Collection子接口1&#xff1a;List …

【Docker】docker的存储

介绍 docker存储主要是涉及到3个方面&#xff1a; 第一个是容器启动时需要的镜像 镜像文件都是基于图层存储驱动来实现的&#xff0c;镜像图层都是只读层&#xff0c; 第二个是&#xff1a; 容器读写层&#xff0c; 容器启动后&#xff0c;docker会基于容器镜像的读层&…

【python实操】python小程序之随机抽签以及for循环计算0-x的和

引言 python小程序之随机抽签以及for循环计算0-x的和 文章目录 引言一、随机抽签1.1 题目1.2 代码1.3 代码解释 二、for循环计算0-x的和2.1 题目2.2 代码2.3 代码解释 三、思考3.1 随机抽签3.2 for循环计算0-x的和 一、随机抽签 1.1 题目 使用input输入五个同学的名字随机抽取…

C++(Qt)软件调试---内存调试器Dr.Memory(21)

C(Qt)软件调试—内存调试器Dr. Memory&#xff08;21&#xff09; 文章目录 C(Qt)软件调试---内存调试器Dr. Memory&#xff08;21&#xff09;[toc]1、概述&#x1f41c;2、安装Dr.Memory&#x1fab2;3、命令行使用Dr.Memory&#x1f997;4、Qt Creator集成使用Dr.Memory&…

主流HR软件对比,五大系统功能与成本一览

五款主流HR系统包括ZohoPeople、金蝶人力云、用友人力云、红海eHR和SAPSuccessFactors&#xff0c;各具特色。ZohoPeople功能丰富&#xff0c;金蝶人力云云端部署&#xff0c;用友人力云多模块集成&#xff0c;红海eHR定制化服务&#xff0c;SAPSuccessFactors全球化视野。企业…

vite中sass警告JS API过期

1.问题 在Vite创建项目中引入Sass弹出The legacy JS API is deprecated and will be removed in Dart Sass 2.0.0 - vite中sass警告JS API过期 The legacy JS API is deprecated and will be removed in Dart Sass 2.0.0警告提示表明你当前正在使用的 Dart Sass 版本中&#…

VisionTS:基于时间序列的图形构建高性能时间序列预测模型,利用图像信息进行时间序列预测

构建预训练时间序列模型时面临的主要挑战是什么&#xff1f;获取高质量、多样化的时间序列数据。目前构建基础预测模型主要有两种方法&#xff1a; 迁移学习LLM&#xff1a;通过针对时间序列任务定制的微调或分词策略&#xff0c;重新利用预训练的大型语言模型&#xff08;LLM…

CertiK《Hack3d:2024年第三季度安全报告》(附报告全文链接)

CertiK《Hack3d&#xff1a;2024年第三季度Web3.0安全报告》现已发布&#xff0c;本次报告深入分析了2024年7月至9月的链上安全状况&#xff0c;本季度总损失金额为7.53亿美元&#xff0c;网络钓鱼和私钥泄露是本季度造成资产损失的主要原因。 ​ 关键数据 2024年第三季度&a…

用Python实现运筹学——Day 9: 线性规划的灵敏度分析

一、学习内容 1. 灵敏度分析的定义与作用 灵敏度分析&#xff08;Sensitivity Analysis&#xff09; 是在优化问题中&#xff0c;分析模型参数变化对最优解及目标函数值的影响。它帮助我们了解在线性规划模型中&#xff0c;当某些参数&#xff08;如资源供应量、成本系数等&a…

【C语言】数组(下)

6、二维数组的创建 6.1二维数组的概念 通过数组&#xff08;上&#xff09;介绍&#xff0c;我们学习了一维数组&#xff0c;数组的元素都是内置类型的&#xff0c;如果我们把一维数组作为数组的元素&#xff0c;这时就是二维数组&#xff0c;以此类推&#xff0c;如果把二维…

Mysql 索引底层数据结构和算法

索引数据结构 索引&#xff08;index&#xff09;是帮助MySQL高效获取数据的一种有序数据结构。索引是存储到表空间中&#xff0c;当我们的 sql 中的where条件用到索引的时候&#xff0c;会在存储层就过滤出数据来&#xff0c;如果不走索引&#xff0c;则需要在server层过滤。 …