当前位置: 首页 > article >正文

Java基础下

一、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);   //输出:9999System.out.println(m);   //{品牌=dj, 价格=111}//2.删除 remove 删除成功返回valueString s1 = m.remove("品牌");System.out.println(s1);  //djSystem.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.键找值//生成键的setSet<String> s1 = m.keySet();for (String s : s1) {System.out.println(s+"="+m.get(s));}//2.键值对//entry  生成键值对 对象的setSet<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>() {@Overridepublic 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;}@Overridepublic 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值@Overridepublic 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;}@Overridepublic 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值@Overridepublic int hashCode() {return Objects.hash(name, age);}public String toString() {return "Student{name = " + name + ", age = " + age + "}";}//用于TreeMap排序的@Overridepublic 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.生成键值sethm.keySet().stream().forEach(h-> System.out.println(h));//2.生成键值对sethm.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.filterArrayList<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

相关文章:

Java基础下

一、Map Map常用的API //map常用的api//1.添加 put: 如果map里边没有key&#xff0c;则会添加&#xff1b;如果有key&#xff0c;则会覆盖&#xff0c;并且返回被覆盖的值Map<String,String> mnew HashMap<>();m.put("品牌","dj");m.put("…...

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

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

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

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

Python3笔记之号称替代pip的uv包管理器

uv是什么&#xff1f; uv&#xff0c;这是一个由 Astral 团队开发的极快速的Python包和项目管理工具&#xff0c;用Rust语言编写。它集成了多种功能&#xff0c;旨在替代pip、pip-tools、pipx、poetry、pyenv、twine、virtualenv等多个工具&#xff0c;提供更高效、更全面的Py…...

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数据包&串口收发文本数据包 前…...

【Springboot知识】Springboot进阶-Micrometer指标监控深入解析

文章目录 ​​Micrometer 核心概念与标准指标详解**Micrometer 核心概念与标准指标详解****一、Micrometer 核心概念****二、Micrometer 标准指标****1. JVM 监控指标****2. 系统资源监控****3. HTTP 请求监控****4. 数据库监控****5. 缓存监控** **三、配置与自定义指标****1.…...

Skyline配置指南-微信小程序

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

Go 微服务框架 | 中间件

文章目录 定义中间件前置中间件后置中间件路由级别中间件 定义中间件 中间件的作用是给应用添加一些额外的功能&#xff0c;但是不会影响原有应用的编码方式&#xff0c;想用的时候直接添加&#xff0c;不想用的时候也可以轻松去除&#xff0c;实现所谓的可插拔。中间件的实现…...

Spring MVC 重定向(Redirect)详解

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

项目开发流程总结

目录 1. 项目启动阶段&#xff08;需求分析&#xff09; 2. 项目设计阶段 3. 开发阶段 4. 测试阶段 5. 打包和发布阶段 6. 运维和监控阶段 7. 版本迭代和维护阶段 项目生命周期中的管理要点&#xff1a; 总结&#xff1a; 一个完整的项目开发流程通常包括以下几个阶段…...

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;接着前端工程师需要知道每个按钮对应的权限代…...

大模型格式化输出的几种方法

大模型格式化输出的几种方法 在开发一些和LLM相关的应用的时候,如何从大模型的反馈中拿到结构化的输出数据是非常重要的,那么本文就记录几种常用的方法。 OpenAI提供的新方法 在 OpenAI 的 Python 库中,client.beta.chat.completions.parse 是一个用于生成结构化输出的方法…...

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

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

JBDC java数据库连接(2)

目录 JBDC建立 获得PrepareStatement执行sql语句 形式&#xff1a; PrepareStatement中的方法: 实例 PreparedStatement和Statement 基于以下的原因: JBDC建立 获得PrepareStatement执行sql语句 在sql语句中参数位置使用占位符,使用setXX方法向sql中设置参数 形式&…...

es --- 集群数据迁移

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

Redis高频面试题及深度解析(20大核心问题+场景化答案)

摘要&#xff1a;Redis作为高性能缓存与内存数据库&#xff0c;是后端开发的核心技术栈之一。本文整理20大高频Redis面试题&#xff0c;结合真实场景与底层源码逻辑&#xff0c;助你彻底掌握Redis核心机制。涵盖单线程模型、集群方案、分布式锁、持久化等核心知识点。 一、Redi…...

事件处理程序

事件处理程序 一、事件处理程序的定义 事件处理程序是一段代码&#xff0c;用于响应特定的事件。在网页开发中&#xff0c;事件是在文档或浏览器窗口中发生的特定交互瞬间&#xff0c;如用户点击按钮、页面加载完成等。事件处理程序则是针对这些事件执行的函数&#xff0c;它能…...

stable diffusion部署ubuntu

stable-diffusion webui: https://github.com/AUTOMATIC1111/stable-diffusion-webui python3.10 -m venv venv&#xff08;3.11的下torch会慢得要死&#xff09; source venv/bin/activate 下载checkpoint模型放入clip_version"/home/chen/软件/stable-diffusion-webu…...

Qt的window注册表读写以及删除

Qt的window注册表读写以及删除 1. 使用 QSettings&#xff08;Qt推荐方式&#xff09;基本操作关键点限制 2. 调用Windows原生API示例&#xff1a;创建/读取键值常用API注意事项 3. 高级场景(1) 递归删除键(2) 注册表权限修改 4. 安全性建议总结其他QT文章推荐 在Qt中操作Windo…...

聊一聊接口测试时遇到上下游依赖时该如何测试

目录 一、手工测试时的处理方法 1.1沟通协调法 1.2模拟数据法 二、自动化测试时的处理方法 2.1 数据关联法&#xff08;变量提取&#xff09; 2.2 Mock数据法 2.3自动化框架中的依赖管理 三、实施示例&#xff08;以订单接口测试为例&#xff09; 3.1Mock依赖接口&…...

C++ 排序(1)

以下是一些插入排序的代码 1.插入排序 1.直接插入排序 // 升序 // 最坏&#xff1a;O(N^2) 逆序 // 最好&#xff1a;O(N) 顺序有序 void InsertSort(vector<int>& a, int n) {for (int i 1; i < n; i){int end i - 1;int tmp a[i];// 将tmp插入到[0,en…...