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

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 泛型标识 变量名;...... }常用的泛型标识&#xff1a;T、E、K、V jav…...

LabVIEW工业虚拟仪器的标准化实施

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

JavaScript系列从入门到精通系列第十七篇:JavaScript中的全局作用域

文章目录 前言 1&#xff1a;什么叫作用域 一&#xff1a;全局作用域 1&#xff1a;全局变量的声明 2&#xff1a;变量声明和使用的顺序 3&#xff1a;方法声明和使用的顺序 前言 1&#xff1a;什么叫作用域 可以起作用的范围 function fun(){var a 1; } fun();consol…...

汇编指令集合

...

TinyWebServer整体流程

从main主函数开始&#xff1a; 一、定义MySQL数据库的账号、密码和用到的数据库名称。 二、调用Config获得服务器初始化属性 在这一步确定触发模式端口等信息。 三、创建服务器实例对象 设置根目录、开辟存放http连接对象的空间&#xff0c;开辟定时器空间。 四、利用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 自媒…...

自学(黑客)技术方法————网络安全

如果你想自学网络安全&#xff0c;首先你必须了解什么是网络安全&#xff01;&#xff0c;什么是黑客&#xff01;&#xff01; 1.无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面性&#xff0c;例如 Web 安全技术&#xff0c;既有 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 (线性回归&#xff0c;直线方程) 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、文件权限怎么修改&#xff1f;3、说说常用的Linux命令&#xff1f;4、说说如何以root权限运行某个程序&#xff1f;5、 说说软链接和硬链接的区别&#xff1f;6、说说静态库和动态…...

12、【Qlib】【主要组件】Qlib Recorder:实验管理

11、【Qlib】【主要组件】Qlib Recorder:实验管理 简介Qlib RecorderExperiment ManagerExperimentRecorderRecord Template简介 Qlib包含一个名为QlibRecorder的实验管理系统,旨在帮助用户以高效的方式处理实验并分析结果。 该系统有三个组件: 实验管理器(ExperimentMan…...

三一充填泵:煤矿矸石无害化充填,煤炭绿色高效开采的破局利器

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

医疗器械标准目录汇编2022版共178页(文中附下载链接!)

为便于更好地应用医疗器械标准&#xff0c;国家药监局医疗器械标准管理中心组织对现行1851项医疗器械国家和行业标准按技术领域&#xff0c;编排形成《医疗器械标准目录汇编&#xff08;2022版&#xff09;》 该目录汇编分为通用技术领域和专业技术领域两大类&#xff0c;通用…...

C#和Excel文件的读写交互

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

Pytorch目标分类深度学习自定义数据集训练

目录 一&#xff0c;Pytorch简介&#xff1b; 二&#xff0c;环境配置&#xff1b; 三&#xff0c;自定义数据集&#xff1b; 四&#xff0c;模型训练&#xff1b; 五&#xff0c;模型验证&#xff1b; 一&#xff0c;Pytorch简介&#xff1b; PyTorch是一个开源的Python机…...

2023 年 Web 安全最详细学习路线指南,从入门到入职(含书籍、工具包)【建议收藏】

第一个方向&#xff1a;安全研发 你可以把网络安全理解成电商行业、教育行业等其他行业一样&#xff0c;每个行业都有自己的软件研发&#xff0c;网络安全作为一个行业也不例外&#xff0c;不同的是这个行业的研发就是开发与网络安全业务相关的软件。 既然如此&#xff0c;那其…...

qt常用控件1

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

想提高网站访问速度?CDN加速了解下

随着数字时代的到来&#xff0c;网站已成为企业展示自身实力和吸引目标受众的关键平台之一。然而&#xff0c;网站的成功与否往往取决于一个关键因素 - 速度。网站访问速度的快慢不仅影响用户体验&#xff0c;还对搜索引擎排名和转化率产生深远的影响。因此&#xff0c;网站加速…...

验证回文串[简单]

优质博文&#xff1a;IT-BLO-CN 一、题目 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个回文串。 字母和数字都属于字母数字字符。 给你一个字符串s&#xff0c;如果它是回文串&#xff0…...

Golang编译生成可执行程序的三种方法

目录 前言 正文 方法一、 方法二、 方法三、 结尾 前言 Golang是一种强类型、编译型、跨平台的编程语言&#xff0c;相同代码在不同平台上都可以编译出对应的可执行程序。今天就来简单介绍一下如何使用命令编译出可执行程序&#xff0c;本文以windows平台为例进行介绍。 …...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...