Java中的泛型类 --为集合的学习做准备
学习目标
● 掌握在集合中正确使用泛型
● 了解泛型类、泛型接口、泛型方法
● 了解泛型上下限
● 了解基本的使用场景
1.有关泛型
1.1泛型的概念
泛型(Generics)是Java中引入的参数化类型机制,允许在定义类、接口或方法时使用类型参数(如),实际类型在使用时才指定。其本质是通过类型参数化,增强代码的灵活性和安全性。
● 我们将要在集合中接触泛型。了解泛型,为学习集合做知识准备
● 泛型在集合中用于类型检查,那么为什么集合中 一定要用到泛型?
○ 若没有泛型的使用,那么在设计集合类型时,只能确定集合用来装对象,但是无法确定装什么类型的对象,即集合的元素类型未知。在使用时,编译器就无法进行更加具体的类型检查,存在类型安全问题;
○ 从集合中取出的集合元素对象,为了调用该元素对象的非Object类的方法,不得不向下转型,就存在ClassCastException的风险存在,代码繁琐的问题;
● 有了泛型的使用,既能保证安全,又能简化代码。
● 因为如果通过了编译,那么类型一定是符合要求的,因此就避免了类型转换;
● <类型>这种语法形式就叫泛型。
○ <类型>代表未知的数据类型,我们可以指定为String,Student等。相当于把某个具体的类型泛化为一般的类型,所以称为泛型,或者成为参数化数据类型。参数化类型必须是引用数据类型。
○ <类型> 一般使用一个泛型符号表示;泛型符号只是一个占位符 先占着位置,给引用类型占位置。
○ 泛型符号,名称不要求,个数不要求。 在使用的时候当成已知类型来进行使用。一般使用大写字母A-Z表示。
○ 泛型符号如果不指定 统统都是Object类型
1.2 泛型的分类
泛型符号,可以出现在类声明处 、接口声明处、方法定义中。
● 泛型在类声明处使用,一般称为泛型类。
● 泛型在接口声明处使用,一般称为泛型接口。
● 泛型在方法定义中使用,一般称为泛型方法。
1.3泛型的作用
● 类型安全:编译时检查类型一致性,避免运行时因类型转换导致的ClassCastException
● 泛型核心作用: 实现数据类型的自动转换,避免出现强制转换(较少出现类型转换的异常)。
● 弊端: 泛型只在编译期间有效,运行期间泛型擦除,底层还是会将每一个参数化类型改为Object
2.泛型类
在类名后声明类型参数,用于成员变量或方法中
● 泛型符号 可以出现在 类声明处
● 泛型符号 在本类中当成已知类型来进行使用
● 静态方法中不能出现 类的泛型符号
2.1 创建泛型类
//泛型里面: <>里面必须编写参数化数据类型。引用数据类型 默认值null
public class MyClass<S, E> {//S,E就是2个参数化数据类型。具体什么类型我们是不清楚的,要看使用的时候,传过来的数据类型。//使用MyClass,没有传递S,E的真实的数据类型,S,E默认为Object。//S,E是一个数据类型,肯定可以作为形参,返回值,属性的数据类型。
}
2.2 使用泛型类
- 创建泛型类对象,不指定参数化类型
private static void method1() {//调用MyClass里面的属性+方法。---> 面向对象编程//还会报警告。对于泛型类、接口 建议指定参数化数据类型//1.创建MyClass类对象MyClass myClass1 = new MyClass();//使用MyClass时候 没有指定S,E的真实数据类型。ObjectmyClass1.setName("张三");String name = myClass1.getName();myClass1.setS(100);int s = (int) myClass1.getS();//对s进行类型强制转换----> 会有几率出现ClassCastExceptionmyClass1.setS("hello");String str = (String) myClass1.getS();System.out.println(myClass1.demo1(new int[]{1, 2, 4}));
}
- 创建泛型类对象,指定参数化类型
private static void method2() {//创建泛型类对象 指定参数化数据类型(引用数据类型)//MyClass<Integer, String> myClass1 = new MyClass<Integer, String>();//jdk1.7+之后的写法MyClass<Integer, String> myClass2 = new MyClass<>();//S:Integer//E:StringmyClass2.setName("李四");String name = myClass2.getName();myClass2.setS(100);Integer s = myClass2.getS();Integer hello = myClass2.demo1("hello");
}
3.泛型方法
● 任意一个类/接口中,都可以存在泛型方法。 就是在方法上使用<>修饰方法。<>里面的参数化类型就可以是任意数据类型。
● 泛型符号 只出现本方法的声明处
● 泛型符号的声明 在返回值的前面
3.1 创建泛型方法
- 参数化类型仅仅作为形参/返回值使用,不是泛型方法
//S 参数化数据类型 作为返回值类型使用
public S getS() {return s;
}
//S作为形参数据类型使用。
public void setS(S s) {this.s = s;
}
//getS setS不是泛型方法,仅仅是参数化数据类型作为形参/返回值。//普通的方法
//1.非静态的
public S demo1(E e) {System.out.println("demo1............e:" + e);return s;
}//以上方法仅仅是普通方法 只不过是参数化类型作为形参和返回值使用而已。
//具体形参和返回值是什么类型,要看创建对象时指定的数据类型,因为这些属性/方法,称为实例变量/方法,必须对象访问。
- 存在类中的泛型方法
//泛型里面: <>里面必须编写参数化数据类型。引用数据类型 默认值null
public class MyClass<S, E> {//普通的方法//1.非静态的public S demo1(E e) {System.out.println("demo1............e:" + e);return s;}//2.静态的方法---->类名.静态//静态方法里面使用参数化数据类型 必须将这个方法标识为"泛型方法"public static <A,Z> void staticMethod(A s1) {System.out.println("s1:" + s1);}//在任意一个类中 静态方法里面使用了参数类型 这个方法一定是泛型方法//普通的功能方法: 也可以是一个泛型方法public <B> void demo2(B b){System.out.println("b:"+b);}
}
- 存在接口中的泛型方法
public interface MyInterface<K, S> {default <T> void demo1(T t) {System.out.println("t:" + t);}static <E> int demo2(E e) {return 100;}
}
3.2 使用泛型方法
private static void method3() {//调用staticMethod方法/*MyClass<String,String> myClass = new MyClass<>();myClass.staticMethod(100.0);*/MyClass.staticMethod("hello");MyClass<String,String> myClass = new MyClass<>();myClass.demo2(100);
}
private static void method3() {System.out.println(MyInterface.demo2("hello"));
}
4.泛型接口
接口定义时声明类型参数,实现类需指定具体类型或保留泛型
● 泛型符号 可以出现在 接口声明处
● 在本接口中当成 已知类型来使用
4.1 创建泛型接口
public interface MyInterface<K, S> {//封装行为//在接口中 定义方法的时候 可以让参数化类型作为形参/返回值使用S method1();void method2(K k);//接口中可以有泛型方法 一般都是静态的//自己很少编写public static <A> void aa(A a) {}public default <B> void bb(B b) {}
}
public interface GenericInterface<A, B, C> {void methodA(A a);void methodB(B b);void methodC(C c);
}
4.2 使用泛型接口
//封装/设计: 一个类实现类泛型接口 这个类一般也是一个泛型类。
public class MyInterfaceImpl<K,S> implements MyInterface<K,S>{@Overridepublic S method1() {return null;}@Overridepublic void method2(K k) {}
}class Test{public static void main(String[] args) {MyInterface<Integer,String> myInterface = new MyInterfaceImpl<>();}
}
//一般在设计中 我们很少这样写
/*** 实现类取实现泛型接口 直接固定类型*/
public class InterfaceImpl1 implements GenericInterface<String, Integer, Double> {@Overridepublic void methodA(String s) {}@Overridepublic void methodB(Integer integer) {}@Overridepublic void methodC(Double aDouble) {}
}
/*** 实现类 也带上泛型符号* @param <A>* @param <B>* @param <C>*/
public class InterfaceImpl3<A, B, C> implements GenericInterface<A, B, C> {private A a;@Overridepublic void methodA(A a) {}@Overridepublic void methodB(B b) {}@Overridepublic void methodC(C c) {}
}
5.泛型上下限
通配符与上下界
- 通配符<?>:表示未知类型,用于接受任意泛型类型:
public void printList(List<?> list) { /* 可处理List<String>、List<Integer>等 */ }
- 上界<? extends T>:限定类型为T或其子类,用于读取操作:
List<? extends Number> numbers = new ArrayList<Double>(); // 允许Double
Number num = numbers.get(0); // 安全读取
- 下界<? super T>:限定类型为T或其父类,用于写入操作:
List<? super Integer> list = new ArrayList<Number>();
list.add(123); // 允许写入Integer
5.1 问题
- 创建父类Animal
public class Animal {public void eat() {}
}
- 创建子类 Dog 重写 eat()方法
public class Dog extends Animal {@Overridepublic void eat() {System.out.println("狗喜欢吃骨头");}
}
- 创建饲养员类
public class Feeder {public void feed(List<Animal> animals) {for (Animal animal : animals) {animal.eat();}}
}
- 测试:饲养员喂食不同小动物
public static void main(String[] args) {Feeder feeder = new Feeder();List<Animal> animals = new ArrayList<>();animals.add(new Dog());animals.add(new Cat());List<Dog> dogList = new ArrayList<>();dogList.add(new Dog());feeder.feed(animals);//编译报错,dogList不能传入 feeder.feed(dogList);}
5.2 原因
● 泛型类型的指定上和多态并不相同,它要求两边类型必须一致 才能使用,因此如何解决上述问题,因为在实际业务开发中,子类集合也应该是可以传入的,此时就需要使用泛型上限进行解决;
● ? 通配符 代表任意类型;
○ 完整形式为:类名 或接口名,此时?代表上限类型本身或者上限的子类,即?代表
5.3 解决
/*** 饲养员类*/
public class Feeder {/*** @param animals 泛型的上限* ? 通配符*/public void feed(List<? extends Animal> animals) {for (Animal animal : animals) {animal.eat();}}/** * 指定了下限 下限就到Animal* 上不要求 所有Animal父类型都可以传*/public void method1(List<? super Animal> animals) {for (Object animal : animals) {
// animal.eat();}}
}
5.4 测试
public static void main(String[] args) {Feeder feeder = new Feeder();List<Animal> animals = new ArrayList<>();animals.add(new Dog());animals.add(new Cat());List<Dog> dogList = new ArrayList<>();dogList.add(new Dog());List<Object> objectList = new ArrayList<>();// 泛型上限feeder.feed(dogList);feeder.feed(animals);// 泛型下限feeder.method1(animals);feeder.method1(objectList);}
6.泛型擦除
public static void main(String[] args) {List<Integer> list = new ArrayList<>(10);list.add(100);list.add(200);//我就是想存一个“hello”到list集合中//编译的class文件中 不存在List<Integer> 只有List<Object>//泛型在运行期间会被擦除 还是Object类型try {Method addMethod = list.getClass().getMethod("add", Object.class);System.out.println(addMethod.invoke(list,"hello"));} catch (Exception e) {e.printStackTrace();}System.out.println(list);}
7.使用场景
泛型类以及泛型接口的出现一般都是满足项目的整体设计。
7.1 泛型类
● 满足与整体的项目功能设计。通用的操作。
● 需求: 模拟前端请求,触发一个按钮的功能。后端就要返回固定格式数据
成功的数据:statusmsgdata失败的数据:statusmsg满足所有的模块数据封装。
1.普通类编写
- 创建MyResult类
@Setter
@Getter
public class MyResult {private int status;private String msg;private Object data;//查询成功的数据 数据类型不定的public MyResult(int status, String msg, Object data) {this.status = status;this.msg = msg;this.data = data;}public MyResult(int status, String msg) {this.status = status;this.msg = msg;}
}
- 测试不同模块功能
private static MyResult testFindOneProduct() {ProductDao productDao = new ProductDaoImpl();Product product = productDao.findOne(1L);if (product == null) {return new MyResult(StatusEnum.ERROR.getStatus(), StatusEnum.ERROR.getMsg());}//状态码 msg productreturn new MyResult(StatusEnum.SUCCESS.getStatus(), StatusEnum.SUCCESS.getMsg(), product);
}private static MyResult testFindAllUser() {//模拟测试查询所有用户SysUserDao sysUserDao = new SysUserDaoImpl();SysUser[] users = sysUserDao.findAll();if (users == null || users.length == 0) {//查询失败 状态码 msgreturn new MyResult(StatusEnum.ERROR.getStatus(), StatusEnum.ERROR.getMsg());}//查询成功//状态码 msg 查询所有成功的数据 usersreturn new MyResult(StatusEnum.SUCCESS.getStatus(), StatusEnum.SUCCESS.getMsg(), users);
}private static MyResult testFindOneUser() {//模拟测试查询单个用户SysUserDao sysUserDao = new SysUserDaoImpl();SysUser sysUser = sysUserDao.findOne(1);if (sysUser == null) {//查询失败 状态码 msgreturn new MyResult(StatusEnum.ERROR.getStatus(), StatusEnum.ERROR.getMsg());}//查询成功//状态码 msg 查询成功的数据 sysUserreturn new MyResult(StatusEnum.SUCCESS.getStatus(), StatusEnum.SUCCESS.getMsg(), sy
- 测试
public static void main(String[] args) {//前端触发了对用户模块的增删改查//成功/失败MyResult result = test2();int status = result.getStatus();String msg = result.getMsg();Object data = result.getData();//查询单个用户对象System.out.println(status);System.out.println(msg);if(status==200){SysUser sysUser = (SysUser) data;System.out.println(sysUser.getId());System.out.println(sysUser.getName());}System.out.println(data);System.out.println("----------------------------------");MyResult myResult = test4();int status1 = myResult.getStatus();if(status1==200){Object data1 = myResult.getData();Product product = (Product) data1;}}
以上代码封装数据完全ok
- 弊端: 每一次获得data 都要向下转型 会有几率出现类型转换的异常
所以getData的时候 自动的转换成想要的数据类型想到使用 泛型
2.泛型类编写
- 创建MyResult类
//T: 满足查询成功之后的数据的封装
//封装成功之后的任意类型的封装。
@Setter
@Getter
public class ReturnResult<T> {private int status;private String msg;private T data;private ReturnResult(int status, String msg, T data) {this.status = status;this.msg = msg;this.data = data;}private ReturnResult(int status, String msg) {this.status = status;this.msg = msg;}public static <T> ReturnResult<T> success(T data){return new ReturnResult<>(StatusEnum.SUCCESS.getStatus(),StatusEnum.SUCCESS.getMsg(),data);}public static <T> ReturnResult<T> error(){return new ReturnResult<>(StatusEnum.ERROR.getStatus(),StatusEnum.ERROR.getMsg());}}
- 测试模块功能
public static ReturnResult<Product> testFindOneProduct(){ProductDao productDao = new ProductDaoImpl();Product product = productDao.findOne(1L);if(product==null){return ReturnResult.error();}return ReturnResult.success(product);}//测试查询单个用户public static ReturnResult<SysUser> testFindOneUser() {SysUserDao sysUserDao = new SysUserDaoImpl();SysUser sysUser = sysUserDao.findOne(1);if (sysUser == null) {return ReturnResult.error();}return ReturnResult.success(sysUser);}
7.2 泛型接口
//开发XXXX管理系统:
//1.系统用户模块----> 增加/删除/修改/查询用户 与角色/权限相关的一些行为
//2.订单模块---->
//3.商品模块---->
//......
//提高程序的扩展性。多态----> 继承类与类 实现 类与接口//有3个实体类封装每个对象具备的信息
//有3个接口封装每个模块里面行为:
- 对子接口的抽象: 封装模块里面共有的行为。
//E就是实体类型 T:id的数据类型
public interface BaseDao<E,T> {//封装的很多模块具备的一些行为void insert(E entity);void delete(T id);void update(E entity);E findOne(T id);E[] findAll();//还没讲解集合 先使用数组编写
}
- 对共有的行为的实现进行 封装。
public abstract class BaseDaoImpl<E,T> implements BaseDao<E,T> {@Overridepublic void insert(E entity) {}@Overridepublic void delete(T id) {}@Overridepublic void update(E entity) {}@Overridepublic E findOne(T id) {return null;}@Overridepublic E[] findAll() {return null;}
}
- 具体子模块的编写
public interface SysUserDao extends BaseDao<SysUser,Integer> {//编写用户模块特有的行为void userLogout();}
public class SysUserDaoImpl extends BaseDaoImpl<SysUser,Integer> implements SysUserDao {//编写用户模块特有行为的实现
}
public interface ProductDao extends BaseDao<Product,Long> {//维护每个模块独有的行为
}public class ProductDaoImpl extends BaseDaoImpl<Product,Long> implements ProductDao {}
相关文章:
Java中的泛型类 --为集合的学习做准备
学习目标 ● 掌握在集合中正确使用泛型 ● 了解泛型类、泛型接口、泛型方法 ● 了解泛型上下限 ● 了解基本的使用场景 1.有关泛型 1.1泛型的概念 泛型(Generics)是Java中引入的参数化类型机制,允许在定义类、接口或方法时使用类型参数&a…...
【MySQL】表的基本操作
??表的基本操作 文章目录: 表的基本操作 创建查看表 创建表 查看表结构 表的修改 表的重命名 表的添加与修改 删除表结构 总结 前言: 在数据库中,数据表是存储和组织数据的基本单位,对于数据表的操作是每个程序员需要烂熟…...
横向移动靶场-Tr0ll: 3
Tr0ll: 3来自 <Tr0ll: 3 ~ VulnHub> 1,将两台虚拟机网络连接都改为NAT模式 2,攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182,靶场IP192.168.23.187 3,对靶机进行端口服务探测 …...
房屋租赁|房屋租赁系统|基于Springboot的房屋租赁系统设计与实现(源码+数据库+文档)
房屋租赁系统目录 目录 基于Springboot的房屋租赁系统设计与实现 一、前言 二、系统功能设计 三、系统实现 管理员功能模块 房主功能模块 用户功能模块 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取:…...
自然语言处理:词频-逆文档频率
介绍 大家好,博主又来给大家分享知识了。本来博主计划完成稠密向量表示的内容分享后,就开启自然语言处理中文本表示的讲解。可在整理分享资料的时候,博主发现还有个知识点,必须得单独拎出来好好说道说道。 这就是TF-IDF…...
Linux | 程序 / 进程调用库依赖关系查看
注:本文为 “Linux | 程序 / 进程调用库依赖” 相关文章合辑。 英文引文,机翻未校。 未整理去重。 How to Check Library Dependencies in Linux 如何在 Linux 系统中检查库依赖关系 Mohd Shakir Zakaria Programs on Linux often require external…...
3-4 WPS JS宏 工作表的新建、删除与错务内容处理(批量新建工作表)学习笔记
************************************************************************************************************** 点击进入 -我要自学网-国内领先的专业视频教程学习网站 *******************************************************************************************…...
泰勒公式详解与应用
前言 本文隶属于专栏《机器学习数学通关指南》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见《机器学习数学通关指南》 正文 📝 一句话总结 泰…...
计算机视觉(opencv-python)入门之图像的读取,显示,与保存
在计算机视觉领域,Python的cv2库是一个不可或缺的工具,它提供了丰富的图像处理功能。作为OpenCV的Python接口,cv2使得图像处理的实现变得简单而高效。 示例图片 目录 opencv获取方式 图像基本知识 颜色空间 RGB HSV 图像格式 BMP格式 …...
现代前端框架渲染机制深度解析:虚拟DOM到编译时优化
引言:前端框架的性能进化论 TikTok Web将React 18迁移至Vue 3后,点击响应延迟降低42%,内存占用减少35%。Shopify采用Svelte重构核心交互模块,首帧渲染速度提升580%。Discord在Next.js 14中启用React Server Components后…...
Selenium自动化测试:如何搭建自动化测试环境,搭建环境过程应该注意的问题
最近也有很多人私下问我,selenium学习难吗,基础入门的学习内容很多是3以前的版本资料,对于有基础的人来说,3到4的差别虽然有,但是不足以影响自己,但是对于没有学过的人来说,通过资料再到自己写的…...
Linux服务升级:Almalinux 升级 DeepSeek-R1
目录 一、实验 1.环境 2.Almalinux 部署 Ollama 3.Almalinux 升级 DeepSeek-R1 4.Almalinux 部署 docker 5. docker 部署 DeepSeek-R1 6.Almalinux 部署 Cpolar (内网穿透) 7.使用cpolar内网穿透 二、问题 1.构建容器失败 一、实验 1.环境 (1)…...
《HelloGitHub》第 107 期
兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等,涵盖多种编程语言 Python、…...
【实战 ES】实战 Elasticsearch:快速上手与深度实践-1.3.2Kibana可视化初探
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 10分钟快速部署Kibana可视化平台1. Kibana与Elasticsearch关系解析1.1 架构关系示意图1.2 核心功能矩阵 2. 系统环境预检2.1 硬件资源配置2.2 软件依赖清单 3. Docker快速部…...
网络七层模型—OSI参考模型详解
网络七层模型:OSI参考模型详解 引言 在网络通信的世界中,OSI(Open Systems Interconnection)参考模型是一个基础且核心的概念。它由国际标准化组织(ISO)于1984年提出,旨在为不同厂商的设备和应…...
老旧android项目编译指南(持续更)
原因 编译了很多项目,找到了一些可观的解决办法 1. android studio里面的jdk版本切换 jdk版本切换在这里,一般安卓开发需要用到4个版本的jdk,jdk8, jdk11, jdk17, jdk21新版的android stuio是默认使用高版本的jdk,所以切换版本是很有必要的 2. 命令…...
测试金蝶云的OpenAPI
如何使用Postman测试K3Cloud的OpenAPI 1. 引言 在本篇博客中,我将带你逐步了解如何使用Postman测试和使用K3Cloud的OpenAPI。内容包括下载所需的SDK文件、配置文件、API调用及测试等步骤。让我们开始吧! 2. 下载所需的SDK文件 2.1 获取SDK 首先&…...
从零基础到通过考试
1. 学习资源与实践平台 使用Proving Grounds进行靶机练习 OSCP的备考过程中,实战练习占据了非常重要的地位。Proving Grounds(PG)是一个由Offensive Security提供的练习平台,拥有152个靶机,涵盖了从基础到进阶的多种…...
AI人工智能机器学习之神经网络
1、概要 本篇学习AI人工智能机器学习之神经网络,以MLPClassifier和MLPRegressor为例,从代码层面讲述最常用的神经网络模型MLP。 2、神经网络 - 简介 在 Scikit-learn 中,神经网络是通过 sklearn.neural_network 模块提供的。最常用的神经网…...
【原创】Open WebUI 本地部署
使用官网的默认部署,遇到不少的问题。比如白屏问题,其实需要修改几个参数即可。 其实在部署的时候有不少参数 WEBUI_AUTH False ENABLE_OPENAI_API 0 PATH /usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin LANG C.UTF-8…...
基于SpringBoot的绿城郑州爱心公益网站设计与实现现(源码+SQL脚本+LW+部署讲解等)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
【天地图-点线面最全功能】天地图实现功能:回显、绘制、编辑、删除任意点线面
实现效果图 实现功能 1. 回显点线面数据 2. 绘制点线面,保存可获取点线面数据 3. 编辑点线面,保存可获取最新编辑后的点线面数据 4. 删除任意点线面(解决删除按钮不能随元素位置变化(地图拖拽/放大缩小时)而变化问题-&…...
003 SpringBoot集成Kafka操作
4.SpringBoot集成Kafka 文章目录 4.SpringBoot集成Kafka1.入门示例2.yml完整配置3.关键配置注释说明1. 生产者优化参数2. 消费者可靠性配置3. 监听器高级特性4. 安全认证配置 4.配置验证方法5.不同场景配置模板场景1:高吞吐日志收集场景2:金融级事务消息…...
【工具篇】【深度解析:2025 AI视频工具的全面指南】
随着人工智能技术的飞速发展,AI视频工具已经成为内容创作者、营销人员、教育工作者以及普通用户的得力助手。这些工具不仅简化了视频制作流程,还提供了前所未有的创意可能性。本文将详细介绍各类AI视频工具,帮助你找到最适合自己需求的工具。 1. 文生视频工具 智谱清影:这…...
前端面试真题 2025最新版
文章目录 写在前文CSS怪异盒模型JS闭包闭包的形成闭包注意点 CSS选择器及优先级优先级 说说flex布局及相关属性Flex 容器相关属性:Flex 项目相关属性 响应式布局如何实现是否用过tailwindcss,有哪些好处好处缺点 说说对象的 prototype属性及原型说说 pro…...
数据结构课程设计(java实现)---九宫格游戏,也称幻方
【问题描述】 九宫格,一款数字游戏,起源于河图洛书,与洛书是中国古代流传下来的两幅神秘图案,历来被认为是河洛文化的滥觞,中华文明的源头,被誉为"宇宙魔方"。九宫格游戏对人们的思维锻炼有着极大…...
一文掌握Charles抓包工具的详细使用
Charles是一款强大的HTTP代理/HTTP监视器/反向代理工具,广泛用于开发和测试网络应用程序。在爬虫开发中,Charles可以帮助开发者拦截、查看和修改HTTP/HTTPS请求和响应,从而更好地理解网络通信过程,分析和调试爬虫程序。本文将详细介绍Charles的安装、配置、基本使用方法以及…...
Ollama下载安装+本地部署DeepSeek+UI可视化+搭建个人知识库——详解!(Windows版本)
目录 1️⃣下载和安装Ollama 1. 🥇官网下载安装包 2. 🥈安装Ollama 3.🥉配置Ollama环境变量 4、🎉验证Ollama 2️⃣本地部署DeepSeek 1. 选择模型并下载 2. 验证和使用DeepSeek 3️⃣使用可视化工具 1. Chrome插件-Page …...
Rk3568驱动开发_点亮led灯(手动挡)_5
1.MMU简介 完成虚拟空间到物理空间的映射 内存保护设立存储器的访问权限,设置虚拟存储空间的缓冲特性 stm32点灯可以直接操作寄存器,但是linux点灯不能直接访问寄存器,linux会使能mmu linux中操作的都是虚拟地址,要想访问物理地…...
【服务治理中间件】consul介绍和基本原理
目录 一、CAP定理 二、服务注册中心产品比较 三、Consul概述 3.1 什么是Consul 3.2 Consul架构 3.3 Consul的使用场景 3.4 Consul健康检查 四、部署consul集群 4.1 服务器部署规划 4.2 下载解压 4.3 启动consul 五、服务注册到consul 一、CAP定理 CAP定理ÿ…...
Docker下ARM64架构的源码编译Qt5.15.1,并移植到开发板上
Docker下ARM64架构的源码编译Qt5.15.1,并移植到开发板上 1、环境介绍 QT版本:5.15.1 待移植环境: jetson nano 系列开发板 aarch64架构(arm64) 编译环境: 虚拟机Ubuntu18.04(x86_64) 2、…...
对话Stack Overflow,OceanBase CTO 杨传辉谈分布式数据库的“前世今生”
近日, OceanBase CTO 杨传辉受邀出席全球知名开发者论坛 Stack Overflow 的最新一期播客节目,与 Stack Overflow 高级内容创作官 Ryan Donovan 展开对话。双方围绕分布式数据库的可靠性、一致性保障、HTAP 架构以及 AI 时代分布式数据库的发展趋势等热点…...
ds回答-开源llm应用开发平台
以下是几个著名的开源 LLM 应用开发平台,涵盖不同场景和技术特点: 1. Dify 特点:低代码 / 无代码开发、支持 RAG 检索、Agent 智能体、模型管理、LLMOps 全流程优化。核心功能:可视化工作流编排、数百种模型兼容(如 GP…...
C++ Qt常见面试题(4):Qt事件过滤器
在 Qt 中,事件过滤器(Event Filter)提供了一种机制,可以拦截并处理对象的事件(如鼠标事件、键盘事件等),在事件到达目标对象之前对其进行预处理。事件过滤器通常用于以下场景: 捕获和处理特定的事件(如鼠标点击、按键等);对事件进行筛选或修改;实现全局的事件监听功…...
CF 109A.Lucky Sum of Digits(Java实现)
题目分析 给定一个值,判断这个值能否被4和7组成,如果能就输出最小的组合。不能就输出-1。 思路分析 由于是最小组合,即判断4能最多有多少个。但是如果一个值能完全被7整除,那就不需要4了,只用7组合的话位数会更短。(例…...
计算机毕业设计Python+DeepSeek-R1大模型游戏推荐系统 Steam游戏推荐系统 游戏可视化 游戏数据分析(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
生鲜行业智能化供应链解决方案技术白皮书
行业痛点与技术挑战 损耗控制难题 行业平均损耗率达18%-25%,需构建动态定价模型与智能分拣系统 冷链管理复杂度 全程温控数据采集点超过23个/车次,异常响应延迟需压缩至90秒内 供需预测偏差 传统模式预测准确率不足65%,亟需AI驱动需求预测体…...
《每天搞懂一道Hard》之数独终结者(LeetCode 37)
📌《每天搞懂一道Hard》之数独终结者(LeetCode 37) 🔗原题链接:https://leetcode.com/problems/sudoku-solver/ 今天我们来解剖一个经典回溯算法问题——数独求解器!这道题在算法面试中出现频率高达35%&a…...
论文笔记-NeurIPS2017-DropoutNet
论文笔记-NeurIPS2017-DropoutNet: Addressing Cold Start in Recommender Systems DropoutNet:解决推荐系统中的冷启动问题摘要1.引言2.前言3.方法3.1模型架构3.2冷启动训练3.3推荐 4.实验4.1实验设置4.2在CiteULike上的实验结果4.2.1 Dropout率的影响4.2.2 实验结…...
【后端开发面试题】每日 3 题(四)
✍个人博客:Pandaconda-CSDN博客 📣专栏地址:https://blog.csdn.net/newin2020/category_12903849.html 📚专栏简介:在这个专栏中,我将会分享后端开发面试中常见的面试题给大家~ ❤️如果有收获的话&#x…...
使用AoT让.NetFramework4.7.2程序调用.Net8编写的库
1、创建.Net8的库,双击解决方案中的项目,修改如下,启用AoT: <Project Sdk"Microsoft.NET.Sdk"><PropertyGroup><OutputType>Library</OutputType><PublishAot>true</PublishAot>&…...
c++中的静态多态和动态多态简介
在 C 中,多态性(Polymorphism) 分为 静态多态(Static Polymorphism) 和 动态多态(Dynamic Polymorphism),二者通过不同的机制实现代码的灵活性。以下是详细对比和核心要点࿱…...
FastExcel与Reactor响应式编程深度集成技术解析
一、技术融合背景与核心价值 在2025年企业级应用开发中,大规模异步Excel处理与响应式系统架构的结合已成为技术刚需。FastExcel与Reactor的整合方案,通过以下技术协同实现突破性性能: 内存效率革命:FastExcel的流式字节操作与Re…...
【MySQL篇】数据类型
目录 前言: 1,数据类型的分类 编辑 2 ,数值类型 2.1 tinyint类型 2.2 bit类型 2.3 小数类型 2.3.1 float类型 2.3.2 decimal类型 3,字符串类型 3.1 char 3.2 varchar 3.3 char与varchar的比较 3.4日期和时间类型 3.5 …...
haclon固定相机位标定
什么是标定? 工业应用中相机拍到一个mark点的坐标为C1(Cx,Cy),C1点对应的龙门架/机械手等执行端对应的坐标是多少? 标定就是解决这个问题,如相机拍到一个点坐标C1(Cx,Cy),…...
Token相关设计
文章目录 1. 双Token 机制概述1.1 访问令牌(Access Token)1.2 刷新令牌(Refresh Token) 2. 双Token 认证流程3. Spring Boot 具体实现3.1 生成 Token(使用 JWT)3.2 解析 Token3.3 登录接口(返回…...
vue3:四嵌套路由的实现
一、前言 1、嵌套路由的含义 嵌套路由的核心思想是:在某个路由的组件内部,可以定义子路由,这些子路由会渲染在父路由组件的特定位置(通常是 <router-view> 标签所在的位置)。通过嵌套路由,你可以实…...
在 Element Plus 的 <el-select> 组件中,如果需要将 <el-option> 的默认值设置为 null。 用于枚举传值
文章目录 引言轻松实现 `<el-option>` 的默认值为 `null`I 实现方式监听清空事件 【推荐】使用 v-model 绑定 null添加一个值为 null 的选项处理 null 值的显示引言 背景:接口签名规则要求空串参与,空对象不参与签名计算 // 空字符串“” 参与签名组串,null不参与签…...
List(3)
前言 上一节我们讲解了list主要接口的模拟实现,本节也是list的最后一节,我们会对list的模拟实现进行收尾,并且讲解list中的迭代器失效的情况,那么废话不多说,我们正式进入今天的学习 list的迭代器失效 之前在讲解vec…...
算法-二叉树篇23-二叉搜索树中的插入操作
二叉搜索树中的插入操作 力扣题目链接 题目描述 给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同…...