Java 集合进阶(二)
文章目录
- 一、Set
- 1. 概述
- 2. 哈希值
- 3. 元素唯一性
- 4. 哈希表
- 5. 遍历学生对象
- 6. LinkedHashSet
- 7. TreeSet
- 7.1 自然排序
- 7.2 比较器排序
- 8. 不重复的随机数
- 二、泛型
- 1. 概述
- 2. 泛型类
- 3. 泛型方法
- 4. 泛型接口
- 5. 类型通配符
- 6. 可变参数
- 7. 可变参数的使用
一、Set
1. 概述
Set 集合特点:
① 不包含重复元素的集合;
② 没有带索引的方法,所以不能使用普通 for 循环遍历;
③ HashSet 是 Set 的一个实现类,HashSet 对集合的迭代顺序不作任何保证,输出的元素可能是乱序的。
//Test.javapackage com.an;import java.util.HashSet;
import java.util.Set;public class Test {public static void main(String[] args) {Set<String> set = new HashSet<String>();set.add("a");set.add("b");set.add("c");set.add("c");for (String s : set) {System.out.println(s);}}
}

可以看到当出现重复的元素时,控制台只会输出一个!
2. 哈希值
哈希值是 JDK 根据对象的地址或者字符串或者数字算出来的 int 类型的数值。
Object 类中有一个方法可以获取到对象的哈希值:
public int hashCode(); //返回对象的哈希码值
//Test.javapackage com.an;public class Test {public static void main(String[] args) {Student s1 = new Student("刘德华", 50);System.out.println(s1.hashCode());System.out.println(s1.hashCode());Student s2 = new Student("张学友", 53);System.out.println(s2.hashCode());}
}

同一个对象多次调用 hashCode() 方法返回的哈希值是相同的,不同对象的哈希值在默认情况下是不相同的!
通过方法重写,可以使不同的对象拥有相同的哈希值:
@Overridepublic int hashCode() {return Objects.hash(name, age);}

在学生类里面 Alt + Insert,equals() and hasCode(),一直按下一步,这里会自动帮我们生成 equals() 方法和 hasCode() 方法,equals() 方法就是我们前面常用 API 里面讲过的用于比较两个对象是否相等,hasCode() 方法即可使不同的对象拥有相同的哈希值,return 后面的内容自定义。
3. 元素唯一性

HashSet 集合存储元素要保证元素的唯一性,就需要重写 equals() 方法和 hasCode() 方法!
4. 哈希表
JDK8 之前,底层采用数组+链表实现,可以说是一个元素为链表的数组;JDK8 以后,在长度比较长的时候,底层实现了优化。

① 存储地址即哈希值对 16 取余;
② 当存储地址相同时,先比较哈希值,哈希值不同直接存储;
③ 哈希值相同时,比较存储内容,存储内容不同直接存储,内容相同则不存储。
5. 遍历学生对象
需求:创建一个存储学生对象的集合,存储多个学生对象,使用程序实现在控制台遍历该集合,当学生对象的成员变量值相同时,我们就认为是同一个对象。
//Student.javapackage com.an;import java.util.Objects;public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", 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 2;}
}
//Test.javapackage com.an;import java.util.HashSet;public class Test {public static void main(String[] args) {Student s1 = new Student("刘德华", 50);Student s2 = new Student("张学友", 53);Student s3 = new Student("周杰伦", 46);Student s4 = new Student("周杰伦", 46);HashSet<Student> set = new HashSet<Student>();set.add(s1);set.add(s2);set.add(s3);set.add(s4);for (Student s : set) {System.out.println(s);}}
}

要注意,这里与我们前面说的元素唯一性是不同的,前面所讲是多次调用相同对象时,控制台不予输出,而本案例是当其成员变量的值相同时,我们就认为是同一个对象,就是说不会再控制台打印相同的内容。前者针对对象,后者针对内容,需在学生类中重写 equals() 及 hashCode()方法。
6. LinkedHashSet
LinkedHashSet 集合的特点:
① 由哈希表和链表实现的 Set 接口,具有可预测的迭代次序;
② 由链表保证元素有序,也就是说元素的存储和取出顺序是一致的;
由哈希表保证元素唯一,也就是说没有重复元素。
LinkedHashSet<String> l = new LinkedHashSet<String>();
往集合里面添加元素,输出的结果有序且唯一!
7. TreeSet
TreeSet():根据其元素的自然排序进行排序;
TreeSet(Comparator comparator):根据指定的比较器进行排序。
TreeSet 集合的特点:
① 元素有序,这里的顺序不是指存储和取出的顺序,而是按照一定的规则进行排序,具体排序方式取决于构造方法;
② 没有带索引的方法,所以不能使用普通 for 循环遍历;
③ 由于是 Set 集合,所以不包含重复元素的集合。
//Test.javapackage com.an;import java.util.TreeSet;public class Test {public static void main(String[] args) {TreeSet<Integer> ts = new TreeSet<Integer>();ts.add(10);ts.add(40);ts.add(30);ts.add(50);ts.add(20);for (Integer i : ts) {System.out.println(i);}}
}

可以看到这里遍历到的结果并不是按我们存取的顺序来取出的,这就是自然排序,从小到大排。
集合里面存储的只能是引用类型的元素,对于基本类型存储的时候,我们用的是它的包装类类型!
7.1 自然排序
需求:存储学生对象并遍历,创建 TreeSet 集合使用无参构造方法,要求按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序。
//Student.javapackage com.an;import java.util.Objects;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;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}public int compareTo(Student s) {int num = this.age - s.age;int num2 = num == 0 ? this.name.compareTo(s.name) : num;return num2;}
}
//Test.javapackage com.an;import java.util.TreeSet;public class Test {public static void main(String[] args) {Student s1 = new Student("xishi", 20);Student s2 = new Student("zhangliang", 29);Student s3 = new Student("diaochan", 31);Student s4 = new Student("wuzetian", 34);Student s5 = new Student("lvbu", 31);Student s6 = new Student("xishi", 20);TreeSet<Student> ts = new TreeSet<Student>();ts.add(s1);ts.add(s2);ts.add(s3);ts.add(s4);ts.add(s5);ts.add(s6);for (Student s : ts) {System.out.println(s);}}
}

① Comparable 该接口对实现它的每个类的对象强加一个整体排序,这个排序被称为类的自然排序。也就是说,如果我们要对学生对象做自然排序,就必须让学生类去实现该接口;
② 这里实现接口的时候需要加泛型,然后在学生类里面重写 compareTo 方法;
③ 注意它的返回值,返回 0 重复元素不添加,返回正数按照升序存储,返回负数按照降序来存储;
④ 同时我们可以看到当两个对象的内容相同时,程序会认为是同一个对象,所以不会存储,保证了元素的唯一性;
⑤ 若按成绩、年龄等数字型变量排序,num 值是 s.age - this.age,若按非数字型标准排序,num 值是 s.name.compareTo(this.name);
⑥ 写出主要条件,不要忘了次要条件。
//1.升序排序public int compareTo(Student s) {int num = this.age - s.age;int num2 = num == 0 ? this.name.compareTo(s.name) : num;return num2;}//2.降序排序public int compareTo(Student s) {int num = s.age - this.age;int num2 = num == 0 ? s.name.compareTo(this.name) : num;return num2;}
在存储对象的时候,add() 方法内部会自动调用 compartTo() 方法!
7.2 比较器排序
需求:存储学生对象并遍历,创建 TreeSet 集合使用无参构造方法,要求按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序。
//Test.javapackage com.an;import java.util.Comparator;
import java.util.TreeSet;public class Test {public static void main(String[] args) {TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {@Overridepublic int compare(Student s1, Student s2) {int num = s1.getAge() - s2.getAge();int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;return num2;}});Student s1 = new Student("xishi", 20);Student s2 = new Student("zhangliang", 29);Student s3 = new Student("diaochan", 31);Student s4 = new Student("wuzetian", 34);Student s5 = new Student("lvbu", 31);Student s6 = new Student("xishi", 20);ts.add(s1);ts.add(s2);ts.add(s3);ts.add(s4);ts.add(s5);ts.add(s6);for (Student s : ts) {System.out.println(s);}}
}
① 学生类即基础学生类,比较器排序法不用在学生类中实现接口;
② 自然排序是在学生类中重写接口方法,比较器排序采用的是匿名内部类的方式,让集合构造方法接收 Comparator 的实现类对象,这两个方法的功能效果一模一样;
③ 注意测试类中访问成员变量要使用其 get 方法,设置了权限不能直接访问。
8. 不重复的随机数
需求:编写一个程序,获取 10 个 1~20 之间的随机数,要求随机数不能重复,并在控制台输出。
思路:
① 创建 Set 集合对象;
② 创建随机数对象;
③ 判断集合的长度是不是小于 10,如果小于 10 就产生一个随机数,添加到集合,通过循环不断判断,直到集合长度为 10;
④ 遍历集合。
//Test.javapackage com.an;import java.util.HashSet;
import java.util.Random;
import java.util.Set;public class Test {public static void main(String[] args) {Set<Integer> s = new HashSet<>();Random r = new Random();while (s.size() < 10) {Integer random = r.nextInt(20) + 1;s.add(random);}for (Integer i : s) {System.out.println(i);}}
}

二、泛型
1. 概述
泛型是 JDK5 引入的特性,它提供了编译时类型安全检测机制,该机制允许在编译时检测到非法的类型,它的本质是参数化类型,也就是说,所操作的数据类型被指定为一个参数。
一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?
顾名思义,就是将类型由原来的具体的类型参数化,然后在使用 / 调用时传入具体的类型。
这种参数类型可以用在类、方法和接口中,分别被称为泛型类、泛型方法和泛型接口。
泛型的定义格式:
① <类型>,指定一种类型的格式,这里的类型可以看成是形参;
② <类型1, 类型2 … >,指定多种类型的格式,多种类型之间用逗号隔开,这里的类型可以看成是形参;
③ 将来具体调用时候给定的类型可以看成是实参,并且实参的类型只能是引用数据类型。
Collection c = new ArrayList();
直接这样创建集合,集合对象默认的数据类型是 Object,所以遍历集合元素写 String 类型时就会报错,需要把 String 改成 Object 或者进行强制类型转换!

使用泛型后:
Collection<String> c = new ArrayList<String>();
泛型的好处:
① 把运行时期的问题提前到了编译期间;
② 避免了强制类型转换。
2. 泛型类
//此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型
public class Generic<T> {}
//Generic.javapackage com.an;public class Generic<T> {private T t;public T getT() {return t;}public void setT(T t) {this.t = t;}}
//Test.javapackage com.an;public class Test {public static void main(String[] args) {Generic<String> g1 = new Generic<>();g1.setT("熊二");System.out.println(g1.getT());Generic<Integer> g2 = new Generic<>();g2.setT(20);System.out.println(g2.getT());}
}

泛型类让我们传入的参数可以是任意类型的数据类型!
3. 泛型方法
public <T> void show(T t) {}
//Generic.javapackage com.an;public class Generic {public <T> T show(T t) {return t;}
}
//Test.javapackage com.an;public class Test {public static void main(String[] args) {Generic g = new Generic();System.out.println(g.show(2));System.out.println(g.show("hhhh"));System.out.println(g.show(false));}
}

任何类型均可满足,直到传入实参之后,形参的数据类型才被确定!
4. 泛型接口
public interface Generic<T> {}
//Generic.javapackage com.an;public interface Generic<T> {void show(T t);
}
//GenericImpl.javapackage com.an;public class GenericImpl<T> implements Generic<T> {@Overridepublic void show(T t) {System.out.println(t);}
}
//Test.javapackage com.an;public class Test {public static void main(String[] args) {Generic<String> g1 = new GenericImpl<>();g1.show("world");Generic<Integer> g2 = new GenericImpl<>();g2.show(12);}
}
5. 类型通配符
为了表示各种泛型 List 的父类,可以使用类型通配符。
类型通配符:<?> List<?>:表示元素类型未知的 List,它的元素可以匹配任何的类型。
这种带通配符的 List 仅表示它是各种泛型 List 的父类,并不能把元素添加到其中!
如果说我们不希望 List<?> 是任何泛型 List 的父类,只希望它代表某一类泛型 List 的父类,可以使用类型通配符的上限。(它及其子类)
类型通配符上限:<? extends 类型>
List<? extends Number>:它表示的类型是 Number 或者其子类型
除了可以指定类型通配符的上限,我们也可以指定类型通配符的下限。(它及其父类)
类型通配符下限:<? super 类型>
List<? super Number>:它表示的类型是 Number 或者其父类型。
//类型通配符
List<?> list1 = new ArrayList<Object>();
List<?> list2 = new ArrayList<Number>();
//类型通配符上限
List<? extends Number> list3 = new ArrayList<Number>();
List<? extends Number> list4 = new ArrayList<Integer>();
//类型通配符下限
List<? super Number> list5 = new ArrayList<Number>();
List<? super Number> list6 = new ArrayList<Object>();
6. 可变参数
可变参数又称参数个数可变,用作方法的形参出现,那么方法参数个数就是可变的了。
public static int sum(int... a) {}
//Test.javapackage com.an;public class Test {public static void main(String[] args) {System.out.println(sum(1, 2));System.out.println(sum(10, 2, 11, 9));System.out.println(sum(8, 21, 10));System.out.println(sum(2, 3, 8, 10, 10, 20));}public static int sum(int... a) {int sum = 0;for (int i : a) {sum += i;}return sum;}
}

可以看到不管传入多少个参数,我们始终只用一个 sum 方法即可,可变参数的好处就是使代码更加精简,这里 …a
实际上是把传入的数个参数都封装到一个数组中,而这个数组就是 a,求和?遍历数组然后累加。
如果一个方法中有多个参数,其中包含可变参数时,可变参数一定要放到最后,否则报错!
7. 可变参数的使用
//Test.javapackage com.an;import java.util.Arrays;
import java.util.List;
import java.util.Set;public class Test {public static void main(String[] args) {// 1.返回由指定数组支持的固定大小的列表,不能增删可以修改List<String> l1 = Arrays.asList("I", "love", "you");
// l1.add("w");
// l1.remove("love");l1.set(0, "w");System.out.println(l1);// 2.返回包含任意数量元素的不可变列表,不能增删改List<String> l2 = List.of("hello", "world", "hi", "world");
// l2.add("hh");
// l2.remove("hi");
// l2.set(1, "abc");System.out.println(l2);// 3.返回一个包含任意数量元素的不可变集合,不能增删改且元素不能重复Set<String> s = Set.of("I", "am", "a", "good", "man");
// s.add("ai");
// s.remove("I");System.out.println(s);}
}

相关文章:
Java 集合进阶(二)
文章目录一、Set1. 概述2. 哈希值3. 元素唯一性4. 哈希表5. 遍历学生对象6. LinkedHashSet7. TreeSet7.1 自然排序7.2 比较器排序8. 不重复的随机数二、泛型1. 概述2. 泛型类3. 泛型方法4. 泛型接口5. 类型通配符6. 可变参数7. 可变参数的使用一、Set 1. 概述 Set 集合特点&am…...
小孩用什么样的台灯比较好?2023眼科医生青睐的儿童台灯推荐
小孩子属于眼睛比较脆弱的人群,所以选购护眼台灯时,选光线温和的比较好,而且调光、显色效果、色温、防蓝光等方面也要出色,否则容易导致孩子近视。 1、调光。台灯首先是照度高,国AA级+大功率发光࿰…...
Ubuntu c++ MySQL数据库操作
mysql安装sudo apt-get install updatesudo apt-get install mysql-server libmysqlclient-dev mysql-workbenchmysql启动/重启/停止sudo service mysql start/restart/stop登录mysql命令:mysql -uroot -p错误异常:解决办法:修改mysqld.cnf配…...
C++11:lambda表达式
文章目录1. 概念2. 语法3. 示例示例1示例2示例3示例44. 捕捉方式基本方式隐式和混合补充5. 传递lambda表达式示例6. 原理7. 内联属性1. 概念 lambda表达式实际上是一个匿名类的成员函数,该类由编译器为lambda创建,该函数被隐式地定义为内联。因此&#…...
【Android -- 开源库】表格 SmartTable 的基本使用
介绍 1. 功能 快速配置自动生成表格;自动计算表格宽高;表格列标题组合;表格固定左序列、顶部序列、第一行、列标题、统计行;自动统计,排序(自定义统计规则);表格图文、序列号、列标…...
自动化测试实战篇(9),jmeter常用断言方法,一文搞懂9种测试字段与JSON断言
Jmeter常用的断言主要有,JSON断言和响应断言这两种方式。 断言主要就是帮助帮助人工进行快速接口信息验证避免繁杂的重复的人工去验证数据 第一种响应断言Apply to:表示应用范围测试字段:针对响应数据进行不同的匹配响应文本响应代码响应信息…...
vue-virtual-scroll-list虚拟列表
当DOM中渲染的列表数据过多时,页面会非常卡顿,非常占用浏览器内存。可以使用虚拟列表来解决这个问题,即使有成百上千条数据,页面DOM元素始终控制在指定数量。 一、参考文档 https://www.npmjs.com/package/vue-virtual-scroll-li…...
C++学习笔记(以供复习查阅)
视频链接 代码讲义 提取密码: 62bb 文章目录1、C基础1.1 C初识(1) 第一个C程序(2)注释(3)变量(4)常量(5)关键字(6)标识符命名规则1.2 …...
备份时间缩短为原来 1/4,西安交大云数据中心的软件定义存储实践
XEDP 统一数据平台为西安交通大学云平台业务提供可靠的备份空间和强大的容灾能力,同时确保数据安全。西安交通大学(简称“西安交大”)是我国最早兴办、享誉海内外的著名高等学府,是教育部直属重点大学。学校现有兴庆、雁塔、曲江和…...
我国近视眼的人数已经超过了六亿,国老花眼人数超过三亿人
眼镜是一种用于矫正视力问题、改善视力、减轻眼睛疲劳的光学器件,在我们的生活中不可忽略的一部分,那么我国眼镜市场发展情况是怎样了?下面小编通过可视化互动平台对我国眼镜市场的状况进行分析。我国是一个近视眼高发的国家,据统…...
设计模式(十八)----行为型模式之策略模式
1、概述 先看下面的图片,我们去旅游选择出行模式有很多种,可以骑自行车、可以坐汽车、可以坐火车、可以坐飞机。 作为一个程序猿,开发需要选择一款开发工具,当然可以进行代码开发的工具有很多,可以选择Idea进行开发&a…...
VUE3入门基础:input元素的type属性值说明
说明 在Vue 3中,<input>元素的type属性可以设置不同的类型,以适应不同的输入需求。 常见的type属性取值如下: text:默认值,用于输入文本。password:用于输入密码,输入内容会被隐藏。em…...
关于供应链,一文教你全面了解什么是供应链
什么是供应链?供应链是指产品生产和流通过程中所涉及的原材料供应商、生产商、分销商、零售商以及最终消费者等成员通过与上游、下游成员的连接 (linkage) 组成的网络结构。也即是由物料获取、物料加工、并将成品送到用户手中这一过程所涉及的企业和企业部门组成的一…...
Scope作用域简单记录分析
类型 singleton 单例作用域 prototype 原型作用域 request web作用域,请求作用域,生命周期跟request相同,请求开始bean被创建,请求结束bean被销毁 session web作用域,会话作用域,会话开始bean被创建,会话结束bean被销毁 application web作用域,应用程序作用域,应用程序创建…...
ChatGPT创作恋爱甜文
林欣是一个长相可爱、性格呆萌的小姑娘,她年纪轻轻就失去了父母,独自一人面对世界的冷漠和残酷。 虽然经历了这样的打击,但她并没有沉沦,反而更加努力地去生活。 她找到了一份服务员的工作,每天在餐厅里穿梭…...
贝叶斯优化及其python实现
贝叶斯优化是机器学习中一种常用的优化技术,其目的是在有限步数内寻找函数的最大值或最小值。它可以被视为在探索不同参数配置与观察这些配置结果之间寻求平衡点的过程。基本思想是将我们在过去的观察和体验,传递到下一个尝试中,从而在等待数…...
Lombok使用@Builder无法build父类属性
文章目录问题描述解决方案使用示例lombok Builder注解和build父类属性问题1、简介2.使用3、Builder注解对类做了什么?问题描述 实体类使用Lombok的Builder来实现Builder模式,但是如果使用了extend继承,则子类无法通过Builder来Build父类属性…...
Pixhawk RPi CM4 Baseboard 树莓派CM4安装Ubuntu20.04 server 配置ros mavros mavsdk
文章目录硬件安装Ubuntu Server20.04下载rpiboot工具下载imager刷写系统配置USB配置WIFI开机安装桌面配置wifi配置串口安装ROS安装mavros安装MAVSDK-PythonInternet设置最后参考: https://docs.holybro.com/autopilot/pixhawk-baseboards/pixhawk-rpi-cm4-baseboard…...
后端开发过程中的安全问题
安全问题是木桶效应,整个系统的安全等级取决于安全性最薄弱的那个模块。在写业务代码的时候,要从我做起,建立最基本的安全意识,从源头杜绝低级安全问题。 1、数据源头的安全处理 对于 HTTP 请求,我们要在脑子里有一个…...
基于Hyperledger Fabric的学位学历认证管理系统
基于Hyperledger Fabric的学位学历认证管理系统 项目源码:https://github.com/Pistachiout/Academic-Degree-BlockChain 一、选题背景 学历造假、认证造假等是一个全球日益普遍的现象,不仅对社会产生了巨大的负面影响,同时也极大增加了企业…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
