JAVA基础语法 Day11

news2024/12/28 9:45:37

一、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返回的一定是true
    public boolean equals(Object o) {
        //如果自己和自己比,直接return true
        if (this == o) return true;
        //如果o为空或者o不是学生类型,返回false
        if (o == null || getClass() != o.getClass()) return false;
        //比较两个对象的内容是否一样:
        Student student = (Student) o;
        return age == student.age && gender == student.gender && Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        //重写后的方法保证了,如果对象内容一样,返回的哈希值也一样
        return Objects.hash(name, age, gender);
    }

    @Override
    public 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;
    //龟腚:如果你认为左边大于右边,返回一个正整数;反之,负整数
    @Override
    public 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>() {
            @Override
            public 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.coloradmin.cn/o/2186375.html

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

相关文章

Redis: 集群架构,优缺点和数据分区方式和算法

集群 集群指的就是一组计算机作为一个整体向用户提供一组网络资源 我就举一个简单的例子&#xff0c;比如百度&#xff0c;在北京和你在上海访问的百度是同一个服务器吗&#xff1f;答案肯定是不是的&#xff0c;每一个应用可以部署在不同的地方&#xff0c;但是我们提供的服务…

C0010.Qt5.15.2下载及安装方法

1. 下载及安装 Qt 添加链接描述下载地址&#xff1a;http://download.qt.io/ 选择 archive 目录 安装Qt **注意&#xff1a;**本人使用的是Qt5.15.2版本&#xff0c;可以按如下方法找到该版本&#xff1b;

华为OD机试 - 信号发射和接收 - 矩阵(Python/JS/C/C++ 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

【AIGC】AI时代的数据安全:使用ChatGPT时的自查要点

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;法律法规背景中华人民共和国保守秘密法中华人民共和国网络安全法中华人民共和国个人信息保护法遵守法律法规的重要性 &#x1f4af;ChatGPT的数据使用特点ChatGPT数据安全…

华为OD机试 - 分班问题(Python/JS/C/C++ 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

无人机电力巡检:点亮电力巡检新视野!

一、无人机电力巡查的优势 提高巡检效率&#xff1a;无人机可以搭载高清摄像头、红外热像仪等先进设备&#xff0c;实时拍摄和传输图像&#xff0c;帮助巡检人员快速发现潜在问题&#xff0c;如电线破损、绝缘子污损、设备过热等&#xff0c;从而大大缩短了巡检周期。 降低人…

Tiny Transformer:从零开始构建简化版Transformer模型

引言 自然语言处理&#xff08;NLP&#xff09;与计算机视觉&#xff08;CV&#xff09;有显著差异&#xff0c;各自任务的独特性决定了它们适用的模型架构。在CV中&#xff0c;卷积神经网络&#xff08;CNN&#xff09;长期占据主导地位&#xff0c;而在NLP领域&#xff0c;循…

基于微信小程序的四六级词汇+ssm(lw+演示+源码+运行)

摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;四六级词汇小程序被用户普遍使用&#xff0c;为方便用户能…

Python入门--判断语句

目录 1. 布尔类型和比较运算符 2. if语句的基本格式 3. if-else语句 4. if-elif-else语句 5. 判断语句的嵌套 6. 应用--猜数字游戏 进行逻辑判断&#xff0c;是生活中常见的行为。同样&#xff0c;在程序中&#xff0c;进行逻辑判断也是最为基础的功能。 1. 布尔类型和比…

OceanBase—02(入门篇——对于单副本单节点,由1个observer扩容为3个observer集群)——之前的记录,当初有的问题未解决,目前新版未尝试

OceanBase—02&#xff08;入门篇——对于单副本单节点&#xff0c;由1个observer扩容为3个observer集群&#xff09;——之前的记录&#xff0c;有的问题未解决&#xff0c;新版未尝试 1、前言—安装单副本单节点集群1.1 docker安装OB 2、查看现有集群情况2.1 进入容器&#x…

设置服务器走本地代理

勾选&#xff1a; 然后&#xff1a; git clone https://github.com/rofl0r/proxychains-ng.git./configure --prefix/home/wangguisen/usr --sysconfdir/home/wangguisen/etcmakemake install# 在最后配置成本地代理地址 vim /home/wangguisen/etc/proxychains.confsocks4 17…

Python编写的贪吃蛇小游戏

安装包 pip install pygame完整代码 import pygame import randompygame.init()# 定义颜色 white (255, 255, 255) black (0, 0, 0) red (213, 50, 80) green (0, 255, 0) blue (50, 153, 213)# 定义屏幕大小 dis_width 800 dis_height 600dis pygame.display.set_mo…

【数据结构】什么是平衡二叉搜索树(AVL Tree)?

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 &#x1f4cc;AVL树的概念 &#x1f4cc;AVL树的操作 &#x1f38f;AVL树的插入操作 ↩️右单旋 ↩️↪️右左双旋 ↪️↩️左右双旋 ↪️左单旋 &#x1f38f;AVL树的删…

CTF刷题buuctf

[WUSTCTF2020]颜值成绩查询 拿到相关题目&#xff0c;其实根据功能和参数分析。需要传入一个学号然后进行针对于对应的学号进行一个查询&#xff0c;很可能就会存在sql注入。 其实这道题最难的点&#xff0c;在于过滤了空格&#xff0c;因此我们使用 /**/来过滤空格的限制。…

智能化焊接数据管理系统:系统功能设计与应用场景,OEM定制

在快速发展的工业4.0时代&#xff0c;智能化技术正以前所未有的速度改变着各行各业&#xff0c;其中焊接行业也不例外。随着物联网、大数据、人工智能等技术的不断融合&#xff0c;智能化焊接数据管理系统应运而生&#xff0c;成为提高焊接效率、保障焊接质量、优化生产流程的重…

半监督学习与数据增强(论文复现)

半监督学习与数据增强&#xff08;论文复现&#xff09; 本文所涉及所有资源均在传知代码平台可获取 文章目录 半监督学习与数据增强&#xff08;论文复现&#xff09;概述算法原理核心逻辑效果演示使用方式 概述 本文复现论文提出的半监督学习方法&#xff0c;半监督学习&…

C题(二)字符串转数字 --- atoi

———————————————————**目录**—————————————————— 一、 atoi函数介绍 功能函数原型使用示例 二、题解之一 三、留言 问题引入&#x1f449; 输入样例&#x1f449; 5 01234 00123 00012 00001 00000 输出样例&#x1f449; 1234 123 …

‌文件名称与扩展名:批量重命名的技巧与指南

在日常的文件管理中&#xff0c;我们经常需要处理大量的文件&#xff0c;这些文件可能有着各种各样的名称和扩展名。为了更好地管理和识别这些文件&#xff0c;批量重命名成为了一项非常实用的技能。能够帮助我们快速整理文件&#xff0c;提高工作效率。本文将深入探讨文件名称…

vue2圆形标记(Marker)添加点击事件不弹出信息窗体(InfoWindow)的BUG解决

目录 一、问题详情 二、问题排查 三、解决方案 一、问题详情 地图上面的轨迹点希望能通过点击看到详细的经纬度信息&#xff0c;但是点击的时候就是显示不出来。 二、问题排查 代码都是参考高德的官方文档&#xff0c;初步看没有问题啊&#xff0c;但是点击事件就感觉失效…

10.3今日错题解析(软考)

目录 前言计算机网络——路由配置数据库系统——封锁协议 前言 这是用来记录我备考软考设计师的错题的&#xff0c;今天知识点为路由配置、封锁协议&#xff0c;大部分错题摘自希赛中的题目&#xff0c;但相关解析是原创&#xff0c;有自己的思考&#xff0c;为了复习&#xf…