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.mzph.cn/bicheng/55564.shtml

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

相关文章

算法笔记(七)——哈希表

文章目录 两数之和判定是否互为字符重排存在重复元素存在重复元素 II字母异位词分组 哈希表&#xff1a;一种存储数据的容器&#xff1b; 可以快速查找某个元素&#xff0c;时间复杂度O(1)&#xff1b; 当频繁查找某一个数时&#xff0c;我们可以使用哈希表 创建一个容器&#…

SpringBoot使用EasyPoi根据模板导出word or pdf

1、导出效果 1.1 wrod 1.2 pdf 2、依赖 <!--word--><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.3.0</version></dependency><dependency><groupId>cn.…

ESP32 Bluedroid 篇(1)—— ibeacon 广播

前言 前面我们已经了解了 ESP32 的 BLE 整体架构&#xff0c;现在我们开始实际学习一下Bluedroid 从机篇的广播和扫描。本文将会以 ble_ibeacon demo 为例子进行讲解&#xff0c;需要注意的一点是。ibeacon 分为两个部分&#xff0c;一个是作为广播者&#xff0c;一个是作为观…

C++(string类的实现)

1. 迭代器、返回capacity、返回size、判空、c_str、重载[]和clear的实现 string类的迭代器的功能就类似于一个指针&#xff0c;所以我们可以直接使用一个指针来实现迭代器&#xff0c;但如下图可见迭代器有两个&#xff0c;一个是指向的内容可以被修改&#xff0c;另一个则是指…

Swagger配置且添加小锁(asp.net)(笔记)

此博客是基于 asp.net core web api(.net core3.1)框架进行操作的。 一、安装Swagger包 在 NuGet程序包管理中安装下面的两个包&#xff1a; swagger包&#xff1a;Swashbuckle.AspNetCore swagger包过滤器&#xff1a;Swashbuckle.AspNetCore.Filters 二、swagger注册 在…

php与python建站的区别有哪些

php与Python建站的区别&#xff1a; 1、语言层面Python的特性比php好&#xff0c;更加规范。 2、Python的性能比php高。 3、有只需要启动服务的时候执行一次的代码&#xff0c;在php里每个请求都会被执行一次&#xff0c;Python不需要。虽然php可以通过缓存缩短这方面的差距…

使用CSS实现酷炫加载

使用CSS实现酷炫加载 效果展示 整体页面布局 <div class"container"></div>使用JavaScript添加loading加载动画的元素 document.addEventListener("DOMContentLoaded", () > {let container document.querySelector(".container&q…

在线css像素px到Em的转换器

具体请前往&#xff1a;在线Px转Em工具--将绝对像素(px)长度单位转换为相对长度em

热补丁反调试API Hook—上跳/下跳

以 IsDebuggerPresent 函数为例&#xff0c;可以看到可以上跳&#xff08;简单&#xff09;&#xff0c;也可以下跳&#xff08;复杂&#xff09;。 上跳&#xff1a; BYTE NewCodes[2] { 0xEB,0xF9 }; BYTE JmpCode[5] { 0xE9,0 }; BYTE oldCodes[2] { 0 };BOOL Mydebug() …

63.5 注意力提示_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录注意力提示生物学中的注意力提示查询、键和值注意力的可视化使用 show_heatmaps 显示注意力权重代码示例 代码解析结果 小结练习 注意力提示 &#x1f3f7;sec_attention-cues 感谢读者对本书的关注&#xff0c;因为读者的注意力是一种稀缺…

动手学深度学习(李沐)PyTorch 第 7 章 现代卷积神经网络

7.1 深度卷积神经网络&#xff08;AlexNet&#xff09; 在计算机视觉中&#xff0c;直接将神经网络与其他机器学习方法进行比较也许不公平。这是因为&#xff0c;卷积神经网络的输入是由原始像素值或是经过简单预处理&#xff08;例如居中、缩放&#xff09;的像素值组成的。但…

深圳楼市国庆“狂欢”:从“冷清”到“火爆”,谁导演了这场大戏

你知道吗&#xff1f;深圳那楼市&#xff0c;前面冷清得跟个大森林似的&#xff0c;楼里的灯都像是寂寞的眼睛&#xff0c;眨巴眨巴的&#xff0c;没人搭理。比如八月份那会儿&#xff0c;售楼中心冷清得能听见针掉地上的声音&#xff0c;工作人员闲得跟啥似的&#xff0c;大眼…

【VUE】案例:商场会员管理系统

编写vuedfr实现对会员进行基本增删改查 1. drf项目初始化 请求&#xff1a; POST http://127/0.0.0.1:8000/api/auth/ {"username":"cqn", "password":"123"}返回&#xff1a; {"username":"cqn", "token&q…

Ubuntu2404安装

Ubuntu是一款非常优秀的发行版本&#xff0c;起初她的优势主要在于桌面版&#xff0c;但是随着Centos 从服务版的支持的退出&#xff0c;Ubuntu server也在迅猛的成长&#xff0c;并且不断收获了用户&#xff0c;拥有了一大批忠实的粉丝。好了&#xff0c;废话不多说&#xff0…

鸿蒙harmonyos next flutter通信之BasicMessageChannel获取app版本号

本文将通过BasicMessageChannel获取app版本号&#xff0c;以此来演练BasicMessageChannel用法。 建立channel flutter代码&#xff1a; //建立通道 BasicMessageChannel basicMessageChannel BasicMessageChannel("com.xmg.basicMessageChannel",StringCodec());…

微智启yolo数据集划分工具免费分享下载

微智启yolo数据集划分工具&#xff0c;是由微智启软件工作室开发&#xff0c;版权所有&#xff0c;用于划分yolo数据集的工具&#xff0c;免费分享不收费&#xff0c;禁止用于一切商业用途&#xff0c;如有发现欢迎举报投诉并退款&#xff01; 使用指南&#xff1a; 打开软件&…

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

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

Pikachu-暴力破解-验证码绕过(on client)

访问页面&#xff0c; 从burpsuite 上看到返回的源代码&#xff1b; 验证码生成时通过 createCode 方法生成&#xff0c;在前端页面生成&#xff1b; 同时也是在前端做的校验&#xff1b; 直接验证&#xff1b;F12 -- 网络&#xff0c;随便输入个账号、密码、验证码&#xff0…

【Web】portswigger 服务端原型污染 labs 全解

目录 服务端原型污染 为什么服务器端原型污染更难检测&#xff1f; 通过受污染的属性反射检测服务器端原型污染 lab1:通过服务器端原型污染进行权限提升 无需污染属性反射即可检测服务器端原型污染 状态代码覆盖 JSON 空格覆盖 字符集覆盖 lab2:检测没有污染属性反射的…