Java集合进阶
双列集合
单列集合的特点:一次添加一个。
双列集合的特点:一次添加一对/键值对/键值对对象/Entry。
左键(不可重复)右值(可重复),一一对应。
Map是双列集合的顶层接口,他的功能是全部双列集合都可以继承使用的。
//简单代码例子
import java.util.HashMap;
import java.util.Map;public class jaa {public static void main(String[] args) {//创建Map集合对象Map<String,String>m=new HashMap<>();//添加:put方法//键已经存在,覆盖原有的m.put("lisa","女");m.put("bob","男");m.put("lisa","男");System.out.println(m);//删除m.remove("lisa");System.out.println(m);//清空m.clear();System.out.println(m);//是否包含boolean r=m.containsKey("bob");boolean v=m.containsValue("男");System.out.println(r);System.out.println(m);//是否空boolean is=m.isEmpty();System.out.println(is);//长度int size=m.size();System.out.println(size);}
}
HashMap
特点:是Map里面的一个类,直接用map里的方法。无序,不重复,无索引。哈希表结构(利用键计算哈希值,依赖hashCode和equals方法保证键的唯一)。
//例子
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;public class Main {public static void main(String[] args) {//存学生对象//名和岁数一样认为是一个学生HashMap<student,String>hm=new HashMap<>();student s1=new student("zhangsan",23);student s2=new student("lisi",24);student s3=new student("wangwu",25);student s4=new student("wangwu",25);hm.put(s1,"江苏");hm.put(s2,"浙江");hm.put(s3,"福建");hm.put(s4,"山东");Set<student> keys=hm.keySet();for(student key:keys){String value=hm.get(key);System.out.println(key+"="+value);}}
}
import java.util.Objects;class student {private String name;private int age;public student(String name, int age) {this.name = name;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);}@Overridepublic int hashCode() {return Objects.hash(name, age);}@Overridepublic String toString() {return "student{" +"name='" + name + '\'' +", age=" + age +'}';}
}
LinkedHashMap
有序(存储和取出元素顺序一致),不重复,无索引。哈希表结构(只是每个键值对元素又额外多了一个双链表的机制记录存储的顺序)。
import java.util.*;public class Main {public static void main(String[] args) {LinkedHashMap<String,Integer> lhm=new LinkedHashMap<>();lhm.put("a",1);lhm.put("a",1);lhm.put("b",2);lhm.put("c",3);System.out.println(lhm);}
}
TreeMap
底层和TreeSet一样,都是红黑树结构。
由键决定,不重复,无索引,可排序(对键)。
默认按照键的从小到大进行排序,也可以自己规定键的排序规则。
实现Comparable接口,指定比较规则。
创建集合时传递Comparator比较器对象,指定比较规则。
//默认排序:键的升序//Integer,Double默认升序
//String默认字母ASCII码升序
import java.util.*;public class Main {public static void main(String[] args) {TreeMap<Integer,String> tm=new TreeMap<>();tm.put(4,"ke");tm.put(1,"vn");tm.put(2,"jsidj");tm.put(3,"jd");System.out.println(tm);}
}
//降序
import java.util.*;public class Main {public static void main(String[] args) {TreeMap<Integer,String> tm=new TreeMap<>(new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2-o1;}});tm.put(4,"ke");tm.put(1,"vn");tm.put(2,"jsidj");tm.put(3,"jd");System.out.println(tm);}
}
可变参数
import java.util.*;public class Main {public static void main(String[] args) {//求和,2个数加,3个数加,4个数加,n个数加//可变参数//格式:属性类型...名字//int...argsint sum=getSum(1,2,3,4,6,7,8);System.out.println(sum);}public static int getSum(int...args){int sum=0;for(int i:args){sum=sum+i;}return sum;}
}
集合工具类Collections
1.批量添加方法
2.打乱方法
import java.util.*;public class Main {public static void main(String[] args) {ArrayList<String>list=new ArrayList<>();Collections.addAll(list,"ab","f","dvs","ds","dcs","dw");//批量添加System.out.println(list);//打印Collections.shuffle(list);//打乱System.out.println(list);}
}
创建不可变集合
不可变集合:不可改,一经创建,长度不变,内容不变。
更加安全。
of方法创建不可变集合
List直接用,Set元素不能重复,Map不能重复且键值对最多10个,超过了ofEntries方法。
Stream流
一般结合lambda表达式,简化操作。
得到流,放数据,中间方法和终结方法。
流:流水线
流的获取如下代码:
import javax.sql.rowset.serial.SerialStruct;
import java.util.*;
import java.util.function.Consumer;
import java.util.stream.Stream;public class Main {public static void main(String[] args) {//1.单列集合获取stream流ArrayList<String> list=new ArrayList<>();Collections.addAll(list,"a","b","c","d");
// Stream<String> stream1=list.stream();
// stream1.forEach(new Consumer<String>() {
// @Override
// public void accept(String s) {
// System.out.println(s);
// }
// });或者list.stream().forEach(s-> System.out.println(s));//2.双列集合无法直接使用Stream//第一种方法HashMap<String,Integer> hm=new HashMap<>();hm.put("a",12);hm.put("b",124);hm.put("c",13);hm.keySet().stream().forEach(s-> System.out.println(s));//第二种方法hm.entrySet().stream().forEach(s-> System.out.println(s));//3.数组获取streamint arr[]={1,2,3,4,5,6,7};Arrays.stream(arr).forEach(s-> System.out.println(s));String arr1[]={"ds","d","w"};Arrays.stream(arr1).forEach(s-> System.out.println(s));//4.零散数据获取stream流(同数据类型)//可以传递数组,但必须是引用数据类型Stream.of(1,2,3,4,5).forEach(s-> System.out.println(s));Stream.of("a","d","s").forEach(s-> System.out.println(s));}
}
Stream流的中间方法如下:
import javax.sql.rowset.serial.SerialStruct;
import java.util.*;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Stream;public class Main {public static void main(String[] args) {ArrayList<String>list=new ArrayList<>();Collections.addAll(list,"张丽丽","李四","张浩","李四");//1.过滤
// list.stream().filter(new Predicate<String>() {
// @Override
// public boolean test(String s) {
// return s.startsWith("张");
// }
// }).forEach(s-> System.out.println(s));或者这么写list.stream().filter(s->s.startsWith("张")).forEach(s-> System.out.println(s));//2.获取前几个元素list.stream().limit(2).forEach(s-> System.out.println(s));//3.跳过前面几个元素list.stream().limit(2).skip(1).forEach(s-> System.out.println(s));//4.去重list.stream().distinct().forEach(s-> System.out.println(s));//5.合并a,b俩流ArrayList<String>list1=new ArrayList<>();Collections.addAll(list1,"张丽丽","李四","张浩","李四");ArrayList<String>list2=new ArrayList<>();Collections.addAll(list2,"张丽丽");Stream.concat(list1.stream(),list2.stream()).forEach(s-> System.out.println(s));//6.转换流的数据类型ArrayList<String>list3=new ArrayList<>();Collections.addAll(list3,"张丽丽-11","李四-14","张浩-17","李四-14");
// list3.stream().map(new Function<String, Integer>() {
// public Integer apply(String s){
// String[]arr=s.split("-");
// String ageString=arr[1];
// int age=Integer.parseInt(ageString);
// return age;
// }
// }).forEach(s-> System.out.println(s));或者list3.stream().map(s->Integer.parseInt(s.split("-")[1])).forEach(s-> System.out.println(s));}
}
流的终结方法如下:
import javax.sql.rowset.serial.SerialStruct;
import java.util.*;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.IntFunction;
import java.util.function.Predicate;
import java.util.stream.Stream;public class Main {public static void main(String[] args) {ArrayList<String>list=new ArrayList<>();Collections.addAll(list,"a","d","f","s");//遍历list.stream().forEach(s-> System.out.println(s));//统计long count=list.stream().count();System.out.println(count);//收集
// Object[]arr=list.stream().toArray();
// System.out.println(Arrays.toString(arr));或者// list.stream().toArray(new IntFunction<String[]>() {
// @Override
// public String[] apply(int value) {
// return new String[value];
// }
// });
// System.out.println(Arrays.toString(arr));再或者String[] arr2=list.stream().toArray(value ->new String[value]);System.out.println(Arrays.toString(arr2));}
}
收集方法collect
import javax.sql.rowset.serial.SerialStruct;
import java.lang.reflect.Array;
import java.util.*;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.IntFunction;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;public class Main {public static void main(String[] args) {ArrayList<String> list=new ArrayList<>();Collections.addAll(list,"张无忌-男-15","周芷若-女-14","张强-男-20","赵敏-女-13");//1.收集到list//男List<String>newlist=list.stream().filter(s->"男".equals(s.split("-")[1])).collect(Collectors.toList());System.out.println(newlist);//2.收集到Set//男ArrayList<String> list33=new ArrayList<>();Collections.addAll(list33,"张无忌-男-15","周芷若-女-14","张强-男-20","赵敏-女-13","张强-男-20");Set<String>newlist2=list33.stream().filter(s->"男".equals(s.split("-")[1])).collect(Collectors.toSet());System.out.println(newlist2);//3.收集到Map//男//键值//键不可以重复
// Map<String,Integer>map=list.stream().filter(s->"男".equals(s.split("-")[1])).collect(Collectors.toMap(new Function<String, String>() {
// @Override
// public String apply(String s) {
// return s.split("-")[0];
// }
// },//前面是键,后面是值。
// new Function<String, Integer>() {
// @Override
// public Integer apply(String s) {
// return Integer.parseInt(s.split("-")[2]);
// }
// }));//或者这么写Map<String,Integer>map=list.stream().filter(s->"男".equals(s.split("-")[1])).collect(Collectors.toMap(s->s.split("-")[0],s->Integer.parseInt(s.split("-")[2])));System.out.println(map);}
}
小结:
1.Stream流的作用:结合了Lambda表达式,简化集合数组的操作。
2.Stream流的使用步骤:获取stream流对象,使用中间方法处理数据,使用终结方法处理数据。
3.如何获取流:单列集合(默认),双列(不能直接获取),数组(Arrays),零散数据(of)。
4.常见方法:
(中间)filter,limit,skip,distinct,concat,map
(终结)forEach,count,collect
方法引用
把已经有的方法拿过来用,当作函数式接口中抽象方法的方法体。
import javax.sql.rowset.serial.SerialStruct;
import java.lang.reflect.Array;
import java.util.*;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.IntFunction;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;public class Main {public static void main(String[] args) {//数组倒序Integer[]arr={1,2,4,6,7};//1.匿名内部类Arrays.sort(arr, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2-o1;}});System.out.println(Arrays.toString(arr));//2.lambbda表达式Arrays.sort(arr,(Integer o1, Integer o2)->{returno2-o1;});System.out.println(Arrays.toString(arr));//简化Arrays.sort(arr,(o1, o2)-> o2-o1);System.out.println(Arrays.toString(arr));//3.方法引用//引用出必须是函数式接口//被引用的方法需要已经存在//被引用方法的形参和返回值需要跟抽象方法的形参和返回值一致//被引用方法的功能需要满足当前的要求Arrays.sort(arr,Main::subtraction);System.out.println(Arrays.toString(arr));}public static int subtraction(int num1,int num2){return num2-num1;}
}
::(方法引用符)
方法引用分类:
1.引用静态方法:类名::静态方法
import javax.sql.rowset.serial.SerialStruct;
import java.lang.reflect.Array;
import java.util.*;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.IntFunction;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;public class Main {public static void main(String[] args) {ArrayList<String>list=new ArrayList<>();Collections.addAll(list,"1","2","3");//转化成int//1.常规方式ArrayList<Integer>list2=new ArrayList<>();for (String s : list) {int i=Integer.parseInt(s);list2.add(i);}//2.list.stream().map(new Function<String, Integer>() {@Overridepublic Integer apply(String s) {int i = Integer.parseInt(s);return i;}}).forEach(s-> System.out.println(s));//简化//1.方法已经存在//2.形参和返回值和抽象方法的形参返回值一致//3.方法的功能需要把形参的字符串转化成整数list.stream().map(Integer::parseInt).forEach(s-> System.out.println(s));}
}
2.引用成员方法:对象(this,super,其他类)::成员方法
import javax.sql.rowset.serial.SerialStruct;
import java.lang.reflect.Array;
import java.util.*;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.IntFunction;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;public class Main {public static void main(String[] args) {ArrayList<String>list=new ArrayList<>();Collections.addAll(list,"张五级","里的","多多","的的");//张开头,三个字list.stream().filter(s->s.startsWith("张")).filter(s->s.length()==3).forEach(s-> System.out.println(s));//匿名内部类list.stream().filter(new Predicate<String>() {@Overridepublic boolean test(String s) {return s.startsWith("张")&&s.length()==3;}}).forEach(s-> System.out.println(s));//改成方法引用list.stream().filter(new Main()::stringjudge).forEach(s-> System.out.println(s));}public boolean stringjudge(String s){return s.startsWith("张")&&s.length()==3;}
}
3.引用构造方法:类名::new
import javax.sql.rowset.serial.SerialStruct;
import java.lang.reflect.Array;
import java.util.*;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.IntFunction;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;public class Main {public static void main(String[] args) {ArrayList<String>list=new ArrayList<>();Collections.addAll(list,"张无极,15","周芷若,14","张强,20");List<Student> newlist = list.stream().map(new Function<String, Student>() {@Overridepublic Student apply(String s) {String[] arr = s.split(",");String name = arr[0];int age = Integer.parseInt(arr[1]);return new Student(name, age);}}).collect(Collectors.toList());System.out.println(newlist);//或者List<Student> newlist2 = list.stream().map(Student::new).collect(Collectors.toList());System.out.println(newlist2);}
}
public class Student {private String name;private int age;public Student(){}public Student(String str){String[]arr=str.split(",");this.name=arr[0];this.age=Integer.parseInt(arr[1]);}public Student(String name,int age){this.name=name;this.age=age;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String toString(){return "Student{name="+name+",age="+age+"}";}
}
4.类名引用成员方法
import javax.sql.rowset.serial.SerialStruct;
import java.lang.reflect.Array;
import java.util.*;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.IntFunction;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;public class Main {
//变大写public static void main(String[] args) {ArrayList<String>list=new ArrayList<>();Collections.addAll(list,"aaa","bbb","ccc");list.stream().map(String::toUpperCase).forEach(s-> System.out.println(s));}
}
5.引用数组的构造方法
import javax.sql.rowset.serial.SerialStruct;
import java.lang.reflect.Array;
import java.util.*;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.IntFunction;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;public class Main {public static void main(String[] args) {ArrayList<Integer>list=new ArrayList<>();Collections.addAll(list,1,2,3,4,5,6);
// Integer[] arr = list.stream().toArray(new IntFunction<Integer[]>() {
// @Override
// public Integer[] apply(int value) {
// return new Integer[value];
// }
// });//改成方法引用Integer[] arr = list.stream().toArray(Integer[]::new);System.out.println(Arrays.toString(arr));}
}
学不明白回头再写。
相关文章:
Java集合进阶
双列集合 单列集合的特点:一次添加一个。 双列集合的特点:一次添加一对/键值对/键值对对象/Entry。 左键(不可重复)右值(可重复),一一对应。 Map是双列集合的顶层接口,他的功能是…...

一.算法基础
目录 1.算法基础 2.算法概念 3.时间复杂度--用来评估算法运行效率的一个式子 如何简单快速的判断算法复杂度? 4.空间复杂度 1.算法基础 2.算法概念 --静态动态 3.时间复杂度--用来评估算法运行效率的一个式子 ----一个单位!!! 1-在什么配置下运行(机器) 2-问题的规模…...

python自学7
第二章第一节面向对象 程序的格式都不一样,每个人填写的方式也有自己的习惯,比如收集个人信息,可能有人用字典字符串或者列表, 类的成员方法 类和对象 构造方法 挨个传输值太麻烦了,也没有方便点的,有&…...

Umi - 刷新后页面报404
Umi 项目本地运行刷新没问题,但是部署之后刷新页面报404。因为Umi 默认是用 browser 模式,需要做一下处理。 以下是官方给出解决方案。 一、解决方案 1. 方案一:改用hashHistory .umirc.js {history: { type: hash }, }这个方案项目打包…...

图片编辑器tui-image-editor
提示:图片编辑器tui-image-editor 文章目录 前言一、安装tui-image-editor二、新建components/ImageEditor.vue三、修改App.vue四、效果五、遇到问题 this.getResolve is not a function总结 前言 需求:图片编辑器tui-image-editor 一、安装tui-image-ed…...

如何使用“ubuntu移动文件、复制文件到其他文件夹“?
一、移动文件到其他文件夹命令 mv node_exporter-1.5.0.linux-amd64.tar.gz /usr/local/etc/prometheus 二、复制文件到其他文件夹命令 cp node_exporter-1.5.0.linux-amd64.tar.gz /home/master...
python实现B/B+树
python实现–顺序查找 python实现–折半查找 python实现–分块查找 python实现B/B树 B树和B树都是一种多路搜索树,用于对大量数据进行排序和查找。它们在数据库系统中被广泛应用,特别是用于构建索引结构。 B树(B-Tree) B树&…...

感觉捡到宝了!这究竟是哪位大神出的神器?
你们在制作简历时,是不是基本只关注两件事:简历模板,还有基本信息的填写。 当你再次坐下来更新你的简历时,可能会发现自己不自觉地选择了那个“看起来最好看的模板”,填写基本信息,却没有深入思考如何使简历…...
Vue教学17:Element UI基础组件上手,打造美观实用的Vue应用
大家好,欢迎回到我们的Vue教学系列博客!在前十六篇博客中,我们学习了Vue.js的基础知识、安装Node.js与npm、使用Vue Devtools进行调试、Vue实例与生命周期钩子、数据绑定(单向与双向)、计算属性与侦听器、条件渲染和列…...

从政府工作报告探计算机行业发展(在医疗健康领域)
从政府工作报告探计算机行业发展 政府工作报告作为政府工作的全面总结和未来规划,不仅反映了国家整体的发展态势,也为各行各业提供了发展的指引和参考。随着信息技术的快速发展,计算机行业已经成为推动经济社会发展的重要引擎之一。因此&…...

ElasticSearch学习篇10_Lucene数据存储之BKD动态磁盘树
前言 基础的数据结构如二叉树衍生的的平衡二叉搜索树通过左旋右旋调整树的平衡维护数据,靠着二分算法能满足一维度数据的logN时间复杂度的近似搜索。对于大规模多维度数据近似搜索,Lucene采用一种BKD结构,该结构能很好的空间利用率和性能。 …...

运维实习生 - 面经 - 游族网络
2024.3.5 Boss投递 2024.3.6 回复 2024.3.8过初筛 2024.3.13面试 确认候选人姓名 自我介绍 我看你更多是做数据分析的? 你是实习的时候才接触Linux? 软件工程不应该是往开发方面发展的吗? 你最近有做运维方面的工作吗,技术…...

SpringBoot接口添加IP白名单限制
实现流程: 自定义拦截器——注入拦截器——获取请求IP——对比IP是否一致——请求返回 文章背景: 接口添加IP白名单限制,只有规定的IP可以访问项目。 实现思路: 添加拦截器,拦截项目所有的请求,获取请求的…...

用postman进行web端自动化测试
前言 概括说一下,web接口自动化测试就是模拟人的操作来进行功能自动化,主要用来跑通业务流程。 主要有两种请求方式:post和get,get请求一般用来查看网页信息;post请求一般用来更改请求参数,查看结果是否正…...

基于Java+SpringBoot+vue+element疫情物资捐赠分配系统设计和实现
基于JavaSpringBootvueelement疫情物资捐赠分配系统设计和实现 🍅 作者主页 央顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 文章目录 基于JavaSpringBootvueelement疫情物资捐赠…...
(差分)胡桃爱原石
琴团长带领着一群胡桃准备出征,进攻丘丘人,出征前,琴团长根据不同胡桃的战力,发放原石作为军饷,琴团长分批次发放,每批次会给连续的几个胡桃发放相同的原石,琴团长最后想知道给每个胡桃发放了多…...
二级Java程序题--01基础操作:源码大全(all)
目录 1.基本操作(源代码): 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.10 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.18 1.19 1.20 1.21 1.22 1.23 1.24 1.25 1.26 1.27 1.28 1.29 1.30 1.31 1.32 1.33 1.34 1.…...

伪分布HBase的安装与部署
1.实训目标 (1)熟悉掌握使用在Linux下安装伪分布式HBase。 (2)熟悉掌握使用在HBase伪分布式下使用自带Zookeeper。 2.实训环境 环境 版本 说明 Windows 10系统 64位 操作电脑配置 VMware 15 用于搭建所需虚拟机Linux系统 …...

Python语言基础与应用-北京大学-陈斌-P40-39-基本扩展模块/上机练习:计时和文件处理-给算法计时-上机代码
Python语言基础与应用-北京大学-陈斌-P40-39-基本扩展模块/上机练习:计时和文件处理-给算法计时-上机代码 上机代码: # 基本扩展模块训练 给算法计时 def factorial(number): # 自定义一个计算阶乘的函数i 1result 1 # 变量 result 用来存储每个数的阶…...

Sqllab第一关通关笔记
知识点: 明白数值注入和字符注入的区别 数值注入:通过数字运算判断,1/0 1/1 字符注入:通过引号进行判断,奇数个和偶数个单引号进行识别 联合查询:union 或者 union all 需要满足字段数一致&…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...