Java泛型--什么是泛型?
https://www.bilibili.com/video/BV1xJ411n77R?p=5&vd_source=bb1fced25254581cf052adea5e87a1ff
1.泛型类、接口
1.1.泛型类
泛型类的定义
class 类名称 <泛型标识, 泛型标识, ...> {private 泛型标识 变量名;......
}
常用的泛型标识:T、E、K、V
```java
package org.example;
public class Generic {
private T key;
public Generic(T key) {this.key = key;
}// alt+insert快速生成get和set方法
public T getKey() {return key;
}public void setKey(T key) {this.key = key;
}@Override
public String toString(){return "Generic{" + "key=" + key + '}';
}
}
**泛型类的使用**```java
类名<具体的数据类型> 对象名 = new 类名<具体的数据类型>();Java1.7以后,后面的<>中的具体的数据类型可以省略不写
类名<具体的数据类型> 对象名 = new 类名<>();
public class Main{public static void main( String args[] ) {// 1.泛型类在创建对象的时候,通过【类名<具体的数据类型>】来指定操作的具体数据类型Generic<String> strGeneric = new Generic<>("abc");String key1 = strGeneric.getKey();System.out.println("key1:" + key1);System.out.printf("key1:%s", key1);System.out.println("----------------------------");Generic<Integer> intGeneric = new Generic<>(100);int key2 = intGeneric.getKey();System.out.println("key2:" + key2);System.out.println("----------------------------");// 2.泛型类在创建对象的时候,没有指定类型,将按照Object类型来操作Generic generic = new Generic("ABC");Object key3 = generic.getKey();System.out.println("key3:" + key3);// 3.泛型类,不支持基本数据类型。// Generic<int> generic1 = new Generic<int>(100);System.out.println("----------------------------");// 4.同一泛型类,根据不同的数据类型创建的对象,本质上是同一类型。System.out.println(intGeneric.getClass());System.out.println(strGeneric.getClass());System.out.println(intGeneric.getClass() == strGeneric.getClass());}
}
1.2.泛型类–使用
package org.example;import java.util.ArrayList;
import java.util.Random;public class ProductGetter<T> {Random random = new Random();// 奖品private T product;// 奖品集合ArrayList<T> list = new ArrayList<>();// 添加奖品public void addProduct(T t){list.add(t);}// 抽奖public T getProduct() {// 获取的int的值不要超过list.size()长度product = list.get(random.nextInt(list.size()));return product;}
}
public class Main{public static void main( String args[] ) {ProductGetter<String> stringProductGetter = new ProductGetter<>();String[] strProducts = { "苹果手机", "华为手机", "扫地机器人", "咖啡机" };for (int i=0; i < strProducts.length; i++) {stringProductGetter.addProduct(strProducts[i]);}String product1 = stringProductGetter.getProduct();System.out.println("恭喜您,你抽中了:" + product1);System.out.println("----------------------------------");ProductGetter<Integer> integerProductGetter = new ProductGetter<>();int[] intProducts = {10000, 5000, 3000, 500, 300000};for (int i=0; i<intProducts.length; i++) {integerProductGetter.addProduct(intProducts[i]);}Integer product2 = integerProductGetter.getProduct();System.out.println("恭喜您,你抽中了:" + product2);}
}
1.3.泛型类派生子类
子类也是泛型类,子类和父类的泛型类型要一致
class ChildGeneric<T> extends Generic<T>
子类不是泛型类,父类要明确泛型的数据类型
语法:class ChildGeneric extends Generic<String>
package org.example;public class Parent<E> {private E value;public E getValue() {return value;}public void setValue(E value) {this.value = value;}
}
package org.example;public class Child<T> extends Parent<T> {@Overridepublic T getValue() {return super.getValue();}
}
1.4.泛型接口的使用
实现类不是泛型类,接口要明确数据类型:
// 例如,假设我们有一个泛型接口 InterfaceA<T>:
public interface InterfaceA<T> {void method(T t);
}
// 我们可以创建一个非泛型类 ClassB 来实现这个接口,并明确 T 的类型为 String:
public class ClassB implements InterfaceA<String> {@Overridepublic void method(String s) {System.out.println(s);}
}
//在这个例子中,ClassB 不是一个泛型类,但它实现了一个泛型接口,并且在实现接口时明确了 T 的类型为 String。因此,当我们实例化 ClassB 时,不需要指定数据类型:
ClassB b = new ClassB();
b.method("Hello, world!");
实现类是泛型类,实现类和接口的泛型类型要一致:
package org.example;// 定义一个Generator接口,数据类型是T
public interface Generator<T> {T getKey();
}
package org.example;public class Pair<T, E> implements Generator<T>{private T key;private E value;public Pair(T key, E value) {this.key = key;this.value = value;}@Overridepublic T getKey() {return this.key;}public E getValue() {return this.value;}public void setKey(T key) {this.key = key;}public void setValue(E value) {this.value = value;}
}
public class Main{public static void main( String args[] ) {Pair<String, Integer> pair = new Pair<>("coung", 100);System.out.println(pair.getKey());;}
}
2.泛型方法
修饰符 <T, E, ...> 返回值类型 方法名(形参列表) {方法体...
}
(1)public与返回值中间<T>非常重要,可以理解为声明此方法为泛型方法。
(2)只有声明了<T>的方法才是泛型方法,泛型类中的使用了泛型的成员方法并不是泛型方法。
(3)<T>表明该方法将使用泛型类型T,此时才可以在方法汇总使用泛型类型T。
(4)与泛型类的定义一样,此处T可以随便写为任意标识,场景的如T、E、K、V等形式的参数常用于表示泛型。
package org.example;import java.util.ArrayList;
import java.util.Random;public class ProductGetter<T> {Random random = new Random();// 奖品private T product;// 奖品集合ArrayList<T> list = new ArrayList<>();// 添加奖品public void addProduct(T t){list.add(t);}// 抽奖public T getProduct() {// 获取的int的值不要超过list.size()长度product = list.get(random.nextInt(list.size()));return product;}public <E> E getProduct1(ArrayList<E> list) { // ArrayList里的E要遵循前面的<E>return list.get(random.nextInt(list.size()));}
}
package demo06;import org.example.ProductGetter;import java.util.ArrayList;public class Test06 {public static void main(String[] args) {ProductGetter<Integer> productGetter = new ProductGetter<>();ArrayList<String> strList = new ArrayList<>();strList.add("笔记本电脑");strList.add("华为手机");strList.add("苹果手机");String product1 = productGetter.getProduct1(strList);System.out.println(product1 + "\t" + product1.getClass());System.out.println(product1 + "\t" + product1.getClass().getSimpleName());}
}
(1)泛型方法能使方法独立于类而产生变化
(2)如果static方法要使用泛型能力,就必须使其成为泛型方法
3.类型通配符
3.1.为什么需要类型通配符
类型通配符一般是使用"?"代表具体的类型实参。所以,类型通配符是类型实参,而不是类型形参。
虽然他们的泛型类型不同,但是他们本质还是同一个类,所以两个下面两个函数的参数本质还是个Box,并没有实现方法重载:
package demo07;public class Box<E> {private E first;public E getFirst() {return first;}public void setFirst(E first) {this.first = first;}
}
下面实现是会报错的,因为虽然他们的泛型类型不同,但是他们本质还是同一个类,所以两个下面两个函数的参数本质还是个Box,并没有实现方法重载。
package demo07;public class Test07 {public static void main(String[] args) {Box<Number> box1 = new Box<>();box1.setFirst(100);showBox(box1);Box<Integer> box2 = new Box<>();box2.setFirst(200);showBox(box2);}// 虽然他们的泛型类型不同,但是他们本质还是同一个类,所以下面两个函数的参数本质还是个Box,并没有实现方法重载。public static void showBox(Box<Number> box) {Number first = box.getFirst();System.out.println(first);}public static void showBox(Box<Integer> box) {Number first = box.getFirst();System.out.println(first);}
}
因此引入了类型通配符:
package demo07;public class Test07 {public static void main(String[] args) {Box<Number> box1 = new Box<>();box1.setFirst(100);showBox(box1);Box<Integer> box2 = new Box<>();box2.setFirst(200);showBox(box2);}public static void showBox(Box<?> box) {Object first = box.getFirst();System.out.println(first);}
}
3.2.类型通配符上限
类/接口<? extends 实参类型>
要求泛型的类型,只能是实参类型,或实参类型的子类类型。比如,下面最大可以传到Number,或者Number的子类(下面的Object就是Number的子类):
package demo07;public class Box<E> {private E first;public E getFirst() {return first;}public void setFirst(E first) {this.first = first;}
}
package demo07;public class Test07 {public static void main(String[] args) {Box<Number> box1 = new Box<>();box1.setFirst(100);showBox(box1);Box<Integer> box2 = new Box<>();box2.setFirst(200);showBox(box2);}public static void showBox(Box<? extends Number> box) {Object first = box.getFirst(); // Object也可以改为NumberSystem.out.println(first);}
}
再举个例子,加深对类型通配符上限用法
package demo08;public class Animal {
}
package demo08;public class Cat extends Animal{
}
package demo08;public class MiniCat extends Cat {
}
package demo08;import java.util.ArrayList;public class Test08 {public static void main(String[] args) {ArrayList<Animal> animals = new ArrayList<>();ArrayList<Cat> cats = new ArrayList<>();ArrayList<MiniCat> miniCats = new ArrayList<>();// showAnimal(animals); // 报错:因为类型通配符的上限,传递的集合类型,只能是Cat或Cat的子类类型。showAnimal(cats);showAnimal(miniCats);}public static void showAnimal(ArrayList<? extends Cat> list) {// 报错:类型通配符,不能用下列方法指定增加类型,因为泛型通配符,你并不知道list里面的元素是什么数据类型。// list.add(new Animal());// list.add(new Cat());for (int i = 0; i < list.size(); i++) {Cat cat = list.get(i);System.out.println(cat);}}
}
3.3.类型通配符的下限
package demo08;import java.util.ArrayList;
// 集合
import java.util.List;public class Test08 {public static void main(String[] args) {ArrayList<Animal> animals = new ArrayList<>();ArrayList<Cat> cats = new ArrayList<>();ArrayList<MiniCat> miniCats = new ArrayList<>();showAnimal(animals); // 因为Animal类型是Cat的父类类型,因此可以传递// showAnimal(miniCats); // 报错:因为不是Cat或Cat的父类类型,会报错}/*** 类型通配符下限,要求集合只能是Cat或Cat的父类类型*/// 表达式中的? super Cat是一个类型通配符。接受一个List作为参数,这个List的元素类型是Cat或者Cat的任何父类。public static void showAnimal(List<? super Cat> list) {for (Object o : list) {System.out.println(o);}}
}
TreeSet的使用案例解读类型通配符下限。我们使用到TreeSet类
查看TreeSet源代码:表达式中的 ? super E 是一个通配符类型。这意味着可以传递任何 Comparator<E> 或者它的父类的实例。
public TreeSet(Comparator<? super E> comparator)
代码如下所示:
package demo08;public class Animal {public String name;public Animal(String name) {this.name = name;}@Overridepublic String toString() {return "Animal{" +"name='" + name + '\'' +'}';}
}
package demo08;public class Cat extends Animal{public int age;public Cat(String name, int age) {super(name);this.age = age;}@Overridepublic String toString() {return "Cat{" +"age=" + age +", name='" + name + '\'' +'}';}
}
package demo08;public class MiniCat extends Cat {public int level;public MiniCat(String name, int age, int level) {super(name, age);this.level = level;}@Overridepublic String toString() {return "MiniCat{" +"level=" + level +", age=" + age +", name='" + name + '\'' +'}';}
}
package demo08;import java.util.Comparator;
// 在Java中,TreeSet 是一个实现了 SortedSet 接口的类,它可以确保集合中的元素按照某种特定的顺序进行排序。这个顺序可以是元素自然的顺序(例如数字的升序或降序),也可以是通过提供一个 Comparator 对象来定义的自定义顺序。
import java.util.TreeSet;public class Test08 {public static void main(String[] args) {// 传递new Comprator2() 参数,其是一个 Comparator 对象,它定义了如何比较 Cat 对象。这意味着 TreeSet 将使用这个 Comparator 来决定元素的排序方式。TreeSet<Cat> treeSet = new TreeSet<>(new Comprator2());treeSet.add(new Cat("jerry", 20)); // java字符串要用双引号treeSet.add(new Cat("amy", 22));treeSet.add(new Cat("frank", 35));treeSet.add(new Cat("jim", 15));for (Cat cat: treeSet) {System.out.println(cat);}}
}// Comparator<Animal>表示要对Animal这个数据类型进行比较
class Comprator1 implements Comparator<Animal> {@Overridepublic int compare(Animal o1, Animal o2) {return o1.name.compareTo(o2.name);}
}// 泛型接口的使用:实现类不是泛型类,接口要明确数据类型。
class Comprator2 implements Comparator<Cat> {@Overridepublic int compare(Cat o1, Cat o2) {return o1.age - o2.age;}
}class Comprator3 implements Comparator<MiniCat> {@Overridepublic int compare(MiniCat o1, MiniCat o2) {return o1.level - o2.level;}
}
4.类型擦除
package demo09;import java.util.ArrayList;public class Test09 {public static void main(String[] args) {ArrayList<Integer> intList = new ArrayList<>();ArrayList<String> strList = new ArrayList<>();// 类型擦除:在代码中定义 ArrayList<Integer> 和 ArrayList<String> 等类型,在编译后都会变成 ArrayList ,JVM看到的只是ArrayList,而由泛型附加的类型信息对JVM是看不到的3。这就是类型擦除的基本概念System.out.println(intList.getClass().getSimpleName());System.out.println(strList.getClass().getSimpleName());System.out.println(intList.getClass() == strList.getClass());}
}
5.泛型与数组
package demo10;import java.util.ArrayList;public class Test10 {public static void main(String[] args) {// 报错:可以声明带泛型的数组引用,但是不能直接创建带泛型的数组对象// ArrayList<String>[] listArr = new ArrayList<String>[5];// 不能直接创建带泛型的数组对象,那么怎么办?可以将list的引用赋值给listArr。但会出现一个问题:listArr的元素类型要求String,但是listArr[0][0]指向的是Integer类型,类型检查还不会报错,只有运行之后才会报错。那又该怎么办?看下一块代码。// 创建数组的基本方法:创建一个长度为5、元素数据类型为ArrayList的列表list。ArrayList[] list = new ArrayList[5];ArrayList<String>[] listArr = list;ArrayList<Integer> intList = new ArrayList<>();intList.add(100);list[0] = intList;String s = listArr[0].get(0);System.out.println(s);}
}
解决方案1:声明类型相同的数组
package demo10;import java.util.ArrayList;public class Test10 {public static void main(String[] args) {// 不变知识点:这种声明长度为5,元素类型都为String的数组。ArrayList<String>[] listArr = new ArrayList[5];ArrayList<Integer> intList = new ArrayList<>();intList.add(100);ArrayList<String> strList = new ArrayList<>();strList.add("abc");// 报错// listArr[0] = intList;listArr[0] = strList;// 这行代码的意思是从一个列表数组 listArr 中获取第一个列表,然后从该列表中获取第一个元素,也就是说这是个二维数组。String s = listArr[0].get(0);System.out.println(s);}
}
解决方案2:可以通过java.lang.reflect.Array的newInstance(Class<T>, int)创建T[]数组。
package demo10;import java.lang.reflect.Array;public class Fruit<T> {// 报错:T是什么数据类型都无法确认,无法直接使用T[3],只有new ArrayList[3]才可以,但T不一定是ArrayList。// private T[] array = new T[3];private T[] array;// Fruit 类的一个构造函数,它接受两个参数:一个是 Class<T> 类型的 clz,另一个是 int 类型的 length。public Fruit(Class<T> clz, int length) {// 通过Array.newInstance创建泛型数组array = (T[]) Array.newInstance(clz, length);}/*** 填充数组* @param index* @param item*/public void put(int index, T item) {array[index] = item;}/*** 获取数组元素* @param index* @return*/public T get(int index) {return array[index];}public T[] getArray() {return array;}
}
package demo10;import java.util.Arrays;public class Test10 {public static void main(String[] args) {Fruit<String> fruit = new Fruit<>(String.class, 3);fruit.put(0, "苹果");fruit.put(1, "西瓜");fruit.put(2, "香蕉");System.out.println(Arrays.toString(fruit.getArray()));;}
}
6.泛型和反射
反射常用的泛型类
· Class<T>
· Constructor<T>
package demo11;import java.lang.reflect.Constructor;public class Test11 {public static void main(String[] args) throws Exception {// 获取 Person 类的 Class 对象。在Java中,每个类型都有一个对应的 Class 对象。Class<Person> personClass = Person.class;// 获取 Person 类的无参数构造函数。getConstructor() 方法是 Class 类的一个方法,用于获取类的公共(public)构造函数。Constructor<Person> constructor = personClass.getConstructor();// 调用 Constructor 对象的 newInstance() 方法来创建 Person 类的一个新实例。Person person = constructor.newInstance();}
}
相关文章:
Java泛型--什么是泛型?
https://www.bilibili.com/video/BV1xJ411n77R?p5&vd_sourcebb1fced25254581cf052adea5e87a1ff 1.泛型类、接口 1.1.泛型类 泛型类的定义 class 类名称 <泛型标识, 泛型标识, ...> {private 泛型标识 变量名;...... }常用的泛型标识:T、E、K、V jav…...

LabVIEW工业虚拟仪器的标准化实施
LabVIEW工业虚拟仪器的标准化实施 创建计算机化的测试和测量系统,从计算机桌面控制外部测量硬件设备,以及在计算机屏幕上显示的类似仪器的面板上查看来自外部设备的测试或测量数据,所有这些都需要虚拟仪器系统软件。该软件允许用户执行所有这…...

JavaScript系列从入门到精通系列第十七篇:JavaScript中的全局作用域
文章目录 前言 1:什么叫作用域 一:全局作用域 1:全局变量的声明 2:变量声明和使用的顺序 3:方法声明和使用的顺序 前言 1:什么叫作用域 可以起作用的范围 function fun(){var a 1; } fun();consol…...

汇编指令集合
...

TinyWebServer整体流程
从main主函数开始: 一、定义MySQL数据库的账号、密码和用到的数据库名称。 二、调用Config获得服务器初始化属性 在这一步确定触发模式端口等信息。 三、创建服务器实例对象 设置根目录、开辟存放http连接对象的空间,开辟定时器空间。 四、利用Confi…...

【Java项目推荐之黑马头条】自媒体文章实现异步上下架(使用Kafka中间件实现)
自媒体文章上下架功能完成 需求分析 流程说明 接口定义 说明接口路径/api/v1/news/down_or_up请求方式POST参数DTO响应结果ResponseResult DTO Data public class WmNewsDto {private Integer id;/*** 是否上架 0 下架 1 上架*/private Short enable;}ResponseResult 自媒…...

自学(黑客)技术方法————网络安全
如果你想自学网络安全,首先你必须了解什么是网络安全!,什么是黑客!! 1.无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面性,例如 Web 安全技术,既有 Web 渗透2.也有 Web 防…...
python+playwright 学习-84 Response 接口返回对象
Response 是获取接口响应对象,根据Response 对象可以获取响应的状态码,响应头部,响应正文等内容。 Response 相关操作方法 all_headers 所有响应HTTP标头, 返回Dict 类型 response.all_headers()body 获取 bytes 类型body内容 response.body()json 返回响应主体的 JS…...

GCN详解
a ⃗ \vec{a} a 向量 a ‾ \overline{a} a 平均值 a ‾ \underline{a} a下横线 a ^ \widehat{a} a (线性回归,直线方程) y尖 a ~ \widetilde{a} a a ˙ \dot{a} a˙ 一阶导数 a \ddot{a} a 二阶导数 H(l)表示l层的节点的特征 W(l)表示l层的参数 D ~ \widet…...

总结二:linux面经
文章目录 1、 Linux中查看进程运行状态的指令、查看内存使用情况的指令、tar解压文件的参数。2、文件权限怎么修改?3、说说常用的Linux命令?4、说说如何以root权限运行某个程序?5、 说说软链接和硬链接的区别?6、说说静态库和动态…...
12、【Qlib】【主要组件】Qlib Recorder:实验管理
11、【Qlib】【主要组件】Qlib Recorder:实验管理 简介Qlib RecorderExperiment ManagerExperimentRecorderRecord Template简介 Qlib包含一个名为QlibRecorder的实验管理系统,旨在帮助用户以高效的方式处理实验并分析结果。 该系统有三个组件: 实验管理器(ExperimentMan…...

三一充填泵:煤矿矸石无害化充填,煤炭绿色高效开采的破局利器
富煤贫油少气是我国的能源禀赋特征,决定了我国以煤炭为主的能源结构,煤炭为国民经济发展提供了重要的基础。煤炭开采过程会对土地、地下水、空气等环境造成较大的污染,但大宗固废煤矸石无害化充填的技术手段可以有效改善这样的情况࿰…...

医疗器械标准目录汇编2022版共178页(文中附下载链接!)
为便于更好地应用医疗器械标准,国家药监局医疗器械标准管理中心组织对现行1851项医疗器械国家和行业标准按技术领域,编排形成《医疗器械标准目录汇编(2022版)》 该目录汇编分为通用技术领域和专业技术领域两大类,通用…...

C#和Excel文件的读写交互
C#和Excel文件的读写交互是一项重要的技术,在许多应用程序开发中起着关键作用。C#作为一种现代的面向编程语言,提供了丰富的库和功能,使开发人员能够轻松地处理Excel文件,并进行数据的读取和写入。 首先,让我们了解一下…...

Pytorch目标分类深度学习自定义数据集训练
目录 一,Pytorch简介; 二,环境配置; 三,自定义数据集; 四,模型训练; 五,模型验证; 一,Pytorch简介; PyTorch是一个开源的Python机…...

2023 年 Web 安全最详细学习路线指南,从入门到入职(含书籍、工具包)【建议收藏】
第一个方向:安全研发 你可以把网络安全理解成电商行业、教育行业等其他行业一样,每个行业都有自己的软件研发,网络安全作为一个行业也不例外,不同的是这个行业的研发就是开发与网络安全业务相关的软件。 既然如此,那其…...

qt常用控件1
QLabel QLabel用于显示文本或图像。不提供用户交互功能。标签的视觉外观可以通过多种方式进行配置,并且可用于为另一个小组件指定焦点助记键。 常用API介绍: 获取对应的文本信息: 设置对其方式: 设置能否进行换行 获取及设置标…...

想提高网站访问速度?CDN加速了解下
随着数字时代的到来,网站已成为企业展示自身实力和吸引目标受众的关键平台之一。然而,网站的成功与否往往取决于一个关键因素 - 速度。网站访问速度的快慢不仅影响用户体验,还对搜索引擎排名和转化率产生深远的影响。因此,网站加速…...
验证回文串[简单]
优质博文:IT-BLO-CN 一、题目 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个回文串。 字母和数字都属于字母数字字符。 给你一个字符串s,如果它是回文串࿰…...
Golang编译生成可执行程序的三种方法
目录 前言 正文 方法一、 方法二、 方法三、 结尾 前言 Golang是一种强类型、编译型、跨平台的编程语言,相同代码在不同平台上都可以编译出对应的可执行程序。今天就来简单介绍一下如何使用命令编译出可执行程序,本文以windows平台为例进行介绍。 …...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...

从零开始了解数据采集(二十八)——制造业数字孪生
近年来,我国的工业领域正经历一场前所未有的数字化变革,从“双碳目标”到工业互联网平台的推广,国家政策和市场需求共同推动了制造业的升级。在这场变革中,数字孪生技术成为备受关注的关键工具,它不仅让企业“看见”设…...