Java基础下

news2025/4/12 13:56:26

一、Map

Map常用的API

        //map常用的api

        //1.添加 put: 如果map里边没有key,则会添加;如果有key,则会覆盖,并且返回被覆盖的值
        Map<String,String> m=new HashMap<>();
        m.put("品牌","dj");
        m.put("价格","9999");
        String  s = m.put("价格", "111");
        System.out.println(s);   //输出:9999
        System.out.println(m);   //{品牌=dj, 价格=111}
        //2.删除 remove 删除成功返回value
        String s1 = m.remove("品牌");
        System.out.println(s1);  //dj
        System.out.println(m);      //{价格=111}
        //3.清除 clear()
       // m.clear();
        System.out.println(m);     //{}
        //4.判断集合是否有该键值  返回 布尔类型的
        System.out.println(m.containsKey("价格"));
        //5.判断是否含有指定值     返回布尔类型
        System.out.println(m.containsValue("111"));
        //6.判断集合是否为空    返回布尔类型
        System.out.println(m.isEmpty());  //false
        //7.集合的长度
        System.out.println(m.size());   //1

Map的遍历方式

一共有三种

    //遍历方式一共三种
        Map<String,String> m =new HashMap<>();
        m.put("aaa","bbb");
        m.put("ccc","ddd");
        m.put("eee","fff");
        //1.键找值
        //生成键的set
        Set<String> s1 = m.keySet();
        for (String s : s1) {
            System.out.println(s+"="+m.get(s));

        }
        //2.键值对
        //entry  生成键值对 对象的set
        Set<Map.Entry<String, String>> s2 = m.entrySet();
        for (Map.Entry<String, String> s : s2) {
            System.out.println(s.getKey()+"="+s.getValue());

        }
        //3.lambda表达式遍历
        m.forEach(new BiConsumer<String, String>() {
            @Override
            public void accept(String key, String value) {
                System.out.println(key+"="+value);
            }
        });
        //简化
        m.forEach((key,  value) ->
                System.out.println(key+"="+value)

        );

HashMap

HashMap的键值特点:无序,不重复,无索引

如果存储的是自定义对象,要重写hashCode方法和equals方法(学生类中)

下边代码是一个存储自定义对象Student和String的一个遍历示例:

    public static void main(String[] args) {
        /*
        * 自定义对象,hashcode和equals得重写
        * */

        HashMap<Student,String> hm=new HashMap<>();
        Student s1=new Student("小a",12);
        Student s2=new Student("小b",14);
        Student s3=new Student("小c",15);
        hm.put(s1,"日照");
        hm.put(s2,"青岛");
        hm.put(s3,"黄岛");
        //键值对的遍历方式
        Set<Map.Entry<Student, String>> set1 = hm.entrySet();
        for (Map.Entry<Student, String> s : set1) {
            Student key = s.getKey();
            String value = s.getValue();
            System.out.println(key.getName()+","+key.getAge()+","+value);
            System.out.println(key+","+value);

        }
        //lambda遍历方式
        hm.forEach((student,  s)->
                System.out.println(student+","+s)

        );


    }

public class Student {

    private String name;
    private int age;


    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }
    //基于name和age生成 hashcode值
    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }
}

LinkedHashMap

键的特点,有序,不重复,无索引

底层的数据结构是哈希表,再加上双向链表的机制

TreeMap

键的特点,可排序(可自定义排序的规则),不重复,无索引

底层的数据结构是红黑树

基本数据类型默认是升序

       //默认是升序
//        TreeMap<Integer,String> tm=new TreeMap<>(new Comparator<Integer>() {
//            @Override
//            public int compare(Integer o1, Integer o2) {
//                return o2-o1;
//            }
//        });
        TreeMap<Integer,String> tm=new TreeMap<>((o1, o2)->
                 o2-o1
        );
        tm.put(2,"aa");
        tm.put(3,"ee");
        tm.put(1,"ad");
        tm.put(5,"cc");
        tm.put(4,"bb");
        System.out.println(tm);
    }

自定义的数据类型,因为默认没有比较排序规则,直接添加在TreeMap会进行报错,所以要实现comparable接口(在学生类中),重写比较方法

 TreeMap<Student,String> tm1=new TreeMap<>();
        Student s1=new Student("小a",14);
        Student s2=new Student("小b",11);
        Student s3=new Student("小c",15);
        tm1.put(s1,"日照");
        tm1.put(s2,"青岛");
        tm1.put(s3,"黄岛");
        tm1.put(s2,"lll");  //覆盖
        System.out.println(tm1);
        // out:{Student{name = 小b, age = 11}=lll, Student{name = 小a, age = 14}=日照, Student{name = 小c, age = 15}=黄岛}



public class Student implements Comparable<Student> {

    private String name;
    private int age;


    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }
    //基于name和age生成 hashcode值
    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }
    //用于TreeMap排序的
    @Override
    public int compareTo(Student o) {
        int i = this.getAge()-o.getAge();
        i= i==0?this.getName().compareTo(o.getName()):i;
        return i;
    }
}

可变参数

可变参数就是形参的个数是可以变化的,不用再只有一个两个了这种固定值了

    public static void main(String[] args) {
        
        /*
        参数的数量是可变的
        格式是 int...arg   数据类型加三个点
        底层就是数组
        
        注意:
        可变参数只能有一个
        如果有固定参数,要写在可变参数的前面
        * */
        System.out.println(getSum(1,2,3));
        System.out.println(getSum(1,2));
        
    }
    
    public static int getSum(int...arr)
    {
        int sum=0;
        for (int i : arr) {
            sum+=i;
        }
        return sum;
    }

二、创建不可变的集合

不想让别人修改集合里边的内容,就只能查询

创建不可变的集合的方法

1.List: List.of("xxx","xxxxx");

2.Set: Set.of("xxx","xxxxx"); 不可变集合里的参数必须是不重复的,否则会报错

3.Map:Map.copyof(Map的对象);

三、Stream流

Stream流有三大步1.获取Stream流,2.中间方法操作,3.终结方法操作

1.获取Stream流

1.单列集合示例

直接arr.stream()来获取

  ArrayList<String> arr=new ArrayList<>();
        arr.add("王大一");
        arr.add("王大二");
        arr.add("王大");
        arr.add("大一");
        arr.add("大二");
        Stream<String> stream = arr.stream();
        stream.forEach(name-> System.out.println(name));

2.双列集合示例

双列集合无法直接使用stream流,需要生成keySet或者entrySet来实现

 HashMap<String,Integer> hm=new HashMap<>();
        hm.put("王大一",1);
        hm.put("王大二",4);
        hm.put("王一",2);
        hm.put("一",3);
        hm.put("大一",5);
        //1.生成键值set
        hm.keySet().stream().forEach(h-> System.out.println(h));
        //2.生成键值对set
        hm.entrySet().stream().forEach(h-> System.out.println(h));

3.数组

用Arrays.stream()方法

String[] s1={"xxx","vvv"};
Arrays.stream(s1).forEach(s-> System.out.println(s));

4.零散数据

使用Stream.of()

Stream.of(1,2,3).forEach(i-> System.out.println(i));

2.Stream流的中间方法

1.filter

stream流只能使用一次,所以推荐使用链式编程

只改变stream流的内容,不会改变原来集合的内容

 //1.filter
        ArrayList<String> array=new ArrayList<>();
        Collections.addAll(array,"ygh","dxh","ygh1","ygh111","gh");
        array.stream().filter(s -> s.length()==3).forEach(s-> System.out.println(s));

2.limit

获取前几个元素

array.stream().limit(2).forEach(System.out::println);  //输出为 ygh dxh

3.skip

跳过前几个元素

array.stream().skip(4).forEach(System.out::println);   //输出为 gh

4.distinct

他的作用是去重,如果是自定义数据类型要重写hashcode和equals方法

 ArrayList<String> array=new ArrayList<>();
 Collections.addAll(array,"ygh","dxh","ygh1","ygh111","gh","ygh");
 array.stream().distinct().forEach(System.out::println);

5.concat

两个Stream流concat拼接在一起

        ArrayList<String> array=new ArrayList<>();
        ArrayList<String> array1=new ArrayList<>();
        Collections.addAll(array,"ygh","dxh","ygh1","ygh111","gh","ygh");
        Collections.addAll(array1,"ygh","dxh","ygh1","ygh111","gh","ygh");

        Stream.concat(array.stream(),array1.stream()).forEach(System.out::println);

6.map

map的作用是转换数据类型

这个示例是截取最后的数字,再转换为int数据类型

        ArrayList<String> array=new ArrayList<>();

        Collections.addAll(array,"ygh-1","dxh-1","ygh-2","ygh-3","gh-6","ygh-7");
        array.stream().map(s->Integer.parseInt(s.split("-")[1]))
        .forEach(System.out::println);

3.Stream流的终结方法

1.forEach

遍历

2.count

统计,统计个数

        ArrayList<String> array=new ArrayList<>();
        Collections.addAll(array,"ygh-1","dxh-1","ygh-2","ygh-3","gh-6","ygh-7");
        long count = array.stream().count();
        System.out.println(count);   //输出  6

3.toArray

将流中的数据收集进数组

toArray(s->new String[s])这里边的s表示长度,就是生成一个长度为s的String数组

        ArrayList<String> array=new ArrayList<>();
        Collections.addAll(array,"ygh-1","dxh-1","ygh-2","ygh-3","gh-6","ygh-7");
        String[] array1 = array.stream().toArray(s -> new String[s]);
        System.out.println(Arrays.toString(array1)); //输出 [ygh-1, dxh-1, ygh-2, ygh-3, gh-6, ygh-7]

4.collect

将流中的数据收集集合

第一个是收集成list   也是array.stream().collect(Collectors.toList());  示例中直接简化了

第二个是收集成set

第三个是收集成map(注意的是,如果流中所规定的键值有相同的,会报错)

        ArrayList<String> array=new ArrayList<>();
        Collections.addAll(array,"yg1-1","dx-1","yg-2","ygh-3","gh-6","y-7");
        List<String> list = array.stream().toList();
        Set<String> collect = array.stream().collect(Collectors.toSet());
        Map<String, String> collect1 = array.stream().collect(Collectors.toMap(s -> s.split("-")[0], s -> s.split("-")[1]));
        System.out.println(collect1);

四、方法引用

方法引用就是将已经存在的方法拿过来用,当做函数式接口的方法体

方法引用要注意的事项

1.引用的地方需要是函数式接口

2.被引用的方法要存在

3.被引用的方法的形参和返回值要和抽象方法的形参和返回值一样

4.被引用方法的功能要满足当前的要求

1.引用静态方法

格式    类名::方法名

        ArrayList<String> arr=new ArrayList<>();
        Collections.addAll(arr,"1","2","3","4","5");
        //原来的Lambda表达式
        arr.stream().map(s->Integer.parseInt(s)).forEach(System.out::println);
        //现在的方法引用
        arr.stream().map(Integer::parseInt).forEach(System.out::println);


2.引用其他类的成员方法

格式   对象::成员方法

再细分为三类1.其他类: 其他类对象::方法名  2.本类:  this::方法名 3.父类: super::方法名

3.引用构造方法

格式   类名::new

4.使用类名引用成员方法

格式  类名::成员方法(注意,抽象方法第一个参数表示引用方法的调用者。第一个参数的类型,决定了可以引用哪些类中的方法)

这个就只能引用String类中的方法

5.引用数组的构造方法

格式  数据类型【】::new     比如  int[ ]::new

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

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

相关文章

数据结构和算法(十二)--最小生成树

一、有向图 定义: 有向图是一副具有方向性的图&#xff0c;是由一组顶点和一组有方向的边组成的&#xff0c;每条方向的边都连着一对有序的顶点。 出度: 由某个顶点指出的边的个数称为该顶点的出度。 入度: 指向某个顶点的边的个数称为该顶点的入度。 有向路径: 由一系列顶点组…

TK广告素材优化:提升投放效果的核心策略

在广告投放领域&#xff0c;决定投放效果的三大关键要素是&#xff1a;产品、素材和人群。由于产品相对固定且人群多采用通投策略&#xff0c;因此素材质量成为影响投放效果的决定性因素。 为什么素材如此重要&#xff1f; 素材质量直接影响广告的点击率&#xff0c;进而影响…

8.3.1 MenuStrip(菜单)控件

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的 MenuStrip控件提供了程序窗体的主菜单&#xff0c;即显示于窗体顶端部分的菜单。 MenuStrip常用属性&#xff1a; ImageScalingSize…

STM32单片机入门学习——第29节: [9-5] 串口收发HEX数据包串口收发文本数据包

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.04.09 STM32开发板学习——第29节: [9-5] 串口收发HEX数据包&串口收发文本数据包 前…

Skyline配置指南-微信小程序

Skyline 是微信小程序推出的新一代渲染引擎&#xff0c;提供了更强大的渲染能力和更流畅的性能体验。以下是配置 Skyline 的详细步骤&#xff1a; 一、app.json文件配置 "componentFramework": "glass-easel", "lazyCodeLoading": "requi…

Spring MVC 重定向(Redirect)详解

Spring MVC 重定向&#xff08;Redirect&#xff09;详解 1. 核心概念与作用 重定向&#xff08;Redirect&#xff09; 是 Spring MVC 中一种客户端重定向机制&#xff0c;通过 HTTP 302 状态码&#xff08;默认&#xff09;将用户浏览器重定向到指定 URL。 主要用途&#xf…

window上 docker使用ros2开发并usbip共享usb设备

曾经参考 https://blog.csdn.net/laoxue123456/article/details/138339029 来共享windows上的usb 发现没有办法成功总是出现 tcp 错误。telnet测试能够正常连接 很是奇怪&#xff0c;window上换成低版本的usbipd仍然是同样的错误&#xff0c;没有办法的情况下参考了docker官方文…

基于MATLAB/simulink的信号调制仿真--AM调制

实验内容&#xff1a; 假设y(t)(20.5*2cos&#xff08;2*pi*1000*t&#xff09;)*5cos&#xff08;2*pi*2*1e4*t&#xff09;调幅系统&#xff0c;请将一个频率为1000HZ的余弦波信号&#xff0c;通过进行AM调制&#xff0c;载波信号频率为20kHZ的余弦波&#xff0c;调制度ma0.…

Vue3+Ts封装ToolTip组件(2.0版本)

本组件支持hover和click两种触发方式&#xff0c;需要更多的触发方式&#xff0c;可自行去扩展&#xff01;&#xff01;&#xff01; 1.传递三个参数&#xff1a; content&#xff1a;要展示的文本 position&#xff1a;文本出现的位置&#xff08;"top" | "t…

Latex语法入门之数学公式

Latex是一种高质量的排版系统&#xff0c;尤其擅长于数学公式的排版。本文我将带大家深入了解Latex在数学公式排版中的应用。从基础的数学符号到复杂的公式布局&#xff0c;我们都会一一讲解&#xff0c;通过本文的学习&#xff0c;你将能够轻松编写出清晰、美观的数学公式&…

shell脚本 - Linux定时温度监控-软硬件检测 - 服务器温度监控 - 写入日志

效果图 脚本 vi auto.sh (chmod x ./auto.sh) #!/bin/bash # 按照日期创建一个文件或目录 https://blog.csdn.net/shoajun_5243/article/details/83539069 datetimedate %Y%m%d-%H%M%S |cut -b1-20 dirpath/systemMonitor/$datetime file1$dirpath/sensors.log file2$dirpa…

Linux驱动开发进阶(六)- 多线程与并发

文章目录 1、前言2、进程与线程3、内核线程4、底半步机制4.1、软中断4.2、tasklet4.3、工作队列4.3.1、普通工作项4.3.2、延时工作项4.3.3、工作队列 5、中断线程化6、进程6.1、内核进程6.2、用户空间进程 7、锁机制7.1、原子操作7.2、自旋锁7.3、信号量7.4、互斥锁7.5、comple…

买不起了,iPhone 或涨价 40% ?

周知的原因&#xff0c;新关税对 iPhone 的打击&#xff0c;可以说非常严重。 根据 Rosenblatt Securities分析师的预测&#xff0c;若苹果完全把成本转移给消费者。 iPhone 16 标配版的价格&#xff0c;可能上涨43%。 iPhone 16 标配的价格是799美元&#xff0c;上涨43%&am…

Axure 列表滚动:表头非常多(横向滚动方向)、分页(纵向滚动) | 基于动态面板的滚动方向和取消调整大小以适合内容两个属性进行实现

文章目录 引言I 列表滚动的操作说明see also共享原型引言 Axure RP9教程 【数据传输】(页面值传递)| 作用域 :全局变量、局部变量 https://blog.csdn.net/z929118967/article/details/147019839?spm=1001.2014.3001.5501 基于动态面板的滚动方向和取消调整大小以适合内容两…

RBAC 权限控制:深入到按钮级别的实现

RBAC 权限控制&#xff1a;深入到按钮级别的实现 一、前端核心思路 1. 大致实现思路 后端都过SELECT连表查询把当前登录的用户对应所有的权限返回过来&#xff0c;前端把用户对应所有的权限 存起来to(vuex/pinia) 中 &#xff0c;接着前端工程师需要知道每个按钮对应的权限代…

【区间贪心】合并区间 / 无重叠区间 / 用最少数量的箭引爆气球 / 俄罗斯套娃信封问题

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;贪心算法 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 合并区间无重叠区间用最少数量的箭引爆气球俄罗斯套娃信封问题 合并区间 合并区间 class Solution { public:vector<vecto…

es --- 集群数据迁移

目录 1、需求2、工具elasticdump2.1 mac安装问题解决 2.2 elasticdump文档 3、迁移 1、需求 迁移部分新集群没有的索引和数据 2、工具elasticdump Elasticdump 的工作原理是将输入发送到输出 。两者都可以是 elasticsearch URL 或 File 2.1 mac安装 前置&#xff1a;已经安装…

【有啥问啥】深入浅出讲解 Teacher Forcing 技术

深入浅出讲解 Teacher Forcing 技术 在序列生成任务&#xff08;例如机器翻译、文本摘要、图像字幕生成等&#xff09;中&#xff0c;循环神经网络&#xff08;RNN&#xff09;以及基于 Transformer 的模型通常采用自回归&#xff08;autoregressive&#xff09;的方式生成输出…

zk基础—zk实现分布式功能

1.zk实现数据发布订阅 (1)发布订阅系统一般有推模式和拉模式 推模式&#xff1a;服务端主动将更新的数据发送给所有订阅的客户端。 拉模式&#xff1a;客户端主动发起请求来获取最新数据(定时轮询拉取)。 (2)zk采用了推拉相结合来实现发布订阅 首先客户端需要向服务端注册自己关…

ubuntu wifi配置(命令行版本)

1、查询当前设备环境的wifi列表 nmcli dev wifi list2、连接wifi nmcli dev wifi connect "MiFi-SSID" password "Password" #其中MiFi-SSID是wifi的密码&#xff0c;Password是wifi的密码3、查看连接情况 nmcli dev status