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

第11章 集合与迭代器

目录

目录

目录

11.1 Collection集合

11.1.1 集合的概念

11.1.2 Collection接口

1、添加元素

2、删除元素

3、查询与获取元素

11.2 List 有序集合

11.2.1 新增方法

11.2.2 ArrayList

11.2.3 LinkedList

1、单向链表

2、双向链表

3、删除元素

11.3 Set 无序集合

11.3.1 HashSet

1、HashSet 的特点

11.3.2 TreeSet

11.5 Collections工具类



11.1 Collection集合

11.1.1 集合的概念

集合是java中提供的一种容器,可以用来存储多个数据。

集合和数组既然都是容器,它们有啥区别呢?

数组的长度是固定的,集合的长度是可变的。

数组中可以存储基本数据类型值,也可以存储对象,而集合中只能存储对象 。

集合主要分为两大系列:CollectionMap,Collection 表示一组对象,Map表示一组映射关系或键值对。

11.1.2 Collection接口

Collection 层次结构中的根接口。 Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。JDK 不提供此接口的任何直接实现:它提供更具体的子接口(如 Set无序集合 和 List有序集合、Queue队列)实现。此接口通常用来传递 collection,并在需要最大普遍性的地方操作这些 collection。

Collection<E>是所有单列集合的父接口,因此在Collection中定义了单列集合(List和Set)通用的一些方法,这些方法可用于操作所有的单列集合。方法如下:

1、添加元素

(1)add(E obj):添加元素对象到当前集合中

(2)addAll(Collection<? extends E> other):添加other集合中的所有元素对象到当前集合中,即this = this ∪ other

  @Testpublic void test01(){
//        添加元素
// (1)add(E obj):添加元素对象到当前集合中Collection<Integer> number = new ArrayList<>();number.add(10);System.out.println(number);
//        (2)addAll(Collection<? extends E> other):
//        添加other集合中的所有元素对象到当前集合中,
//        即this = this ∪ otherCollection<Integer> number1 =new ArrayList<>();number1.add(10);number1.add(20);number1.add(30);number1.addAll(number);System.out.println(number1);}

2、删除元素

(1) boolean remove(Object obj) :从当前集合中删除第一个找到的与obj对象equals返回true的元素。

@Testpublic void test02(){
//        (1) boolean remove(Object obj) :
//        从当前集合中删除第一个找到的与obj对象equals返回true的元素。List<String> list = new ArrayList<>();list.add("yang");list.add("asdlfj");list.add("qweoqiwue");list.remove("yang");System.out.println(list);}

  (2)boolean removeAll(Collection<?> coll):从当前集合中删除所有与coll集合中相同的元素。即this = this - this ∩ coll

 @Testpublic void test03(){/* (2)boolean removeAll(Collection<?> coll):从当前集合中删除所有与coll集合中相同的元素。即this = this - this ∩ coll*/Collection<String> str =new ArrayList<>();str.add("zhangsan");str.add("zhangsan");str.add("王五");str.add("李四");str.add("zhangsan");str.add("赵六");str.add("猪猪侠");System.out.println(str);Collection<String> str1 = new ArrayList<>();str1.add("zhangsan");System.out.println(str1);str.removeAll(str1);System.out.println(str);}

(3)boolean removeIf(Predicate<? super E> filter) :删除满足给定条件的此集合的所有元素。

 @Testpublic void test04() {/** (3)boolean removeIf(Predicate<? super E> filter) :* 删除满足给定条件的此集合的所有元素。* */Collection<String> list = new ArrayList<>();list.add("张三");list.add("张a");list.add("张三");list.add("张三");list.add("张三");Collection<String> list1 = new ArrayList<>();list1.add("张三");list1.add("张a");list1.add("张三");list1.add("张三");list1.add("张三");list.addAll(list1);//把list1添加到list里面list.removeIf(new Predicate<String>() {@Overridepublic boolean test(String s) {return s.contains("张a");}});list.removeIf(new Predicate<String>() {@Overridepublic boolean test(String s) {return false;}});System.out.println(list);}

(4)boolean retainAll(Collection<?> coll):从当前集合中删除两个集合中不同的元素,使得当前集合仅保留与c集合中的元素相同的元素,即当前集合中仅保留两个集合的交集,即this = this ∩ coll;

@Testpublic void test05(){/** (4)boolean retainAll(Collection<?> coll):* 从当前集合中删除两个集合中不同的元素,* 使得当前集合仅保留与c集合中的元素相同的元素,* 即当前集合中仅保留两个集合的交集,即this  = this ∩ coll;* */Collection<String> str = new ArrayList<>();str.add("张三");str.add("王五");str.add("李四");str.add("asd四");str.add("a四");str.add("asd四");System.out.println(str);Collection<String> str1 = new ArrayList<>();str1.add("张三1");str1.add("王五2");str1.add("李四");str1.add("asd四");str1.add("a四");str1.add("asd四");System.out.println(str1);str.retainAll(str1);System.out.println("取交集后:"+str);str1.retainAll(str);System.out.println("取交集后:"+str1);}
3、查询与获取元素

(1)boolean isEmpty():判断当前集合是否为空集合。

  @Testpublic void test06() {
//            (1)boolean isEmpty():判断当前集合是否为空集合。Collection<String> str =new ArrayList<>();str.add("asdf");System.out.println(str.isEmpty());}

(2)boolean contains(Object obj):判断当前集合中是否存在一个与obj对象equals返回true的元素。

 @Testpublic void test07(){
//        (2)boolean contains(Object obj):
//        判断当前集合中是否存在一个与obj对象equals返回true的元素。Collection<String> str= new ArrayList<>();str.add("啊撒旦解放");str.add("啊撒旦");str.add("啊解放");}

(3)boolean containsAll(Collection<?> c):判断c集合中的元素是否在当前集合中都存在。即c集合是否是当前集合的“子集”。

 @Testpublic void test08(){
//        (3)boolean containsAll(Collection<?> c):
//        判断c集合中的元素是否在当前集合中都存在。
//        即c集合是否是当前集合的“子集”。Collection<String> str = new ArrayList<>();str.add("asdfasg");str.add("dfasg");str.add("afasg");str.add("asdsg");str.add("aasg");str.add("fasg");Collection<String> str1= new ArrayList<>();str1.add("aesfas");System.out.println(str.containsAll(str1));}

(4)int size():获取当前集合中实际存储的元素个数

(5)Object[] toArray():返回包含当前集合中所有元素的数组

 @Testpublic void test09(){/*** (4)int size():获取当前集合中实际存储的元素个数*/Collection<String> str = new ArrayList<>();str.add("sajf");str.add("sajf");str.add("sajf");str.add("sajf");System.out.println(str.size());
//        (5)Object[] toArray():
//        返回包含当前集合中所有元素的数组Collection<String> list = new ArrayList<>();list.add("asdljkflaks");list.add("asdljkflaks");list.add("sdaf");list.add("sdaf");list.add("sdaf");list.add("sdaf");System.out.println(list.toArray());/*[Ljava.lang.Object;@6ee52dcd*/Object[] array =list.toArray();
//        iter//快捷键
//      itar//for (Object o : array) {System.out.println(o);}}

11.2 List 有序集合

List集合代表一个元素有序、可重复的集合。集合中每个元素都有对应的顺序索引。

11.2.1 新增方法

作为Collection子接口,自然可以使用父接口的所有方法,当然也有新增的方法

方法名说明
add(E e)增加单个数据
addAll(Collection<? extends E> c)将一个 Collection 集合的数据添加到现在的集合中
remove(Object o)删除指定的元素
contains(Object o)判断集合是否包含指定的元素
size()得到集合的数据总数
isEmpty()判断集合是否有数据
get(int index)通过索引获取对应的数据元素
set(int index, E element)通过索引和新的元素替换原有内容
toArray()将List转为对象数组

11.2.2 ArrayList

ArrayList 是List 接口的大小可变数组的实现。实现了所有可选列表操作, 并允许包括null 在内的所有元素。除了实现List 接口外, 此类还提供一些方法来操作内部用来存储列表的数组的大小( 此类大致上等同于 vector 类, 但 vector 是同步的) 。

ArrayList 底层使用数组实现,特点就和数组一致:查询速度快,增删速度慢。

11.2.3 LinkedList

LinkedList 和ArrayList不同,是一个链表结构。可当作堆栈、队列、双端队列 。链表是一种在物理上非连续、非顺序的数据结构,由若干节点(node)所组成。链表有单链表和双链表之分。

1、单向链表

单向链表的每一个节点包含两部分,一部分是存放数据的变量data,另一部分是指向下一个节点的指针next。正如地下党的联络方式,一级一级,单线传递 。

2、双向链表

双向链表比单向链表稍微复杂一些,它的每一个节点除了拥有data和next指针,还拥有指向前置节点的 prev 指针

3、删除元素

11.3 Set 无序集合

Set 集合就像是一个罐子,将数据丢进来就行,因为是丢进来的,Set集合通常不会记忆元素的添加顺序(无序)。 Set接口的方法和Collection基本相同,但Set不允许包含重复的元素。

11.3.1 HashSet

HashSet是Set接口的典型实现,大多时候使用Set集合的时候都是使用这个实现类。因为使用Hash算法来储存元素,因此有很好的存储于查找性能。

1、HashSet 的特点

不能保证元素的排列顺序, 顺序可能与添加顺序不同, 顺序也有可能发生变化 HashSet 不是同步的, 如果多个线程同时访问一个HashSet , 假设有两个或者两个以上线程同时修改了HashSet 集合时, 则必须通过代码来保证其同步 集合元素值可以是null 。

当向HashSet 集合中存入一个元素时,会调用该对象的hashCode() 方法来得到该对象的hashCode 值,然后根据该hashCode 值决定该对象在HashSet 中的存储位置。

如果有两个元素通过equals() 方法比较返回true,但它们的hashCode()方法返回值不相等, HashSet 将会把它们存储在不同的位置,依然可以添加成功。

也就是说 HashSet 集合判断两个元素相等的标准是两个对象通过equals() 方法比较相等, 并且两个对象的hashCode() 方法返回值也相等。

@Testpublic void test01(){Set<String> set = new HashSet<>();set.add("张三");set.add("李四");set.add("李四");set.add("李四");set.add("王五");System.out.println(set);
//    总结HashSet没有顺序,而且不会重复
}

11.3.2 TreeSet

介绍Set集合的时候说过,Set基本是无序的,但凡事总有例外,TreeSet就是Set中的例外,它储存的数据是有序的!

@Testpublic void test02(){TreeSet<String> tree = new TreeSet<>();tree.add("小吴");tree.add("小蓝");tree.add("小绿");System.out.println(tree);
//    String中的排序方法
}
@Testpublic void test03(){TreeSet<String> tree = new TreeSet<>(new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {return o1.length()-o2.length();}});tree.add("asdfasdfa");tree.add("asasdfa");tree.add("asdffa");tree.add("dasdfa");System.out.println(tree);
}
@Testpublic void test04(){TreeSet<Student> tree = new TreeSet<>(new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {int num = o1.getAge()-o2.getAge();return num==0?o1.getId()-o2.getId():num;}});tree.add(new Student(2,"张三",45));tree.add(new Student(1,"张三",24));tree.add(new Student(3,"张三",15));tree.add(new Student(5,"张三",43));tree.add(new Student(4,"张三",43));System.out.println(tree);
}

11.5 Collections工具类

参考操作数组的工具类:Arrays。

Collections 是一个操作 Set、List 和 Map 等集合的工具类。Collections 中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法:

  • public static <T> boolean addAll(Collection<? super T> c,T... elements)将所有指定元素添加到指定 collection 中。

  • public static <T> int binarySearch(List<? extends Comparable<? super T>> list,T key)在List集合中查找某个元素的下标,但是List的元素必须是T或T的子类对象,而且必须是可比较大小的,即支持自然排序的。而且集合也事先必须是有序的,否则结果不确定。

  • public static <T> int binarySearch(List<? extends T> list,T key,Comparator<? super T> c)在List集合中查找某个元素的下标,但是List的元素必须是T或T的子类对象,而且集合也事先必须是按照c比较器规则进行排序过的,否则结果不确定。

  • public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)在coll集合中找出最大的元素,集合中的对象必须是T或T的子类对象,而且支持自然排序

  • public static <T> T max(Collection<? extends T> coll,Comparator<? super T> comp)在coll集合中找出最大的元素,集合中的对象必须是T或T的子类对象,按照比较器comp找出最大者

  • public static void reverse(List<?> list)反转指定列表List中元素的顺序。

  • public static void shuffle(List<?> list) List 集合元素进行随机排序,类似洗牌

  • public static <T extends Comparable<? super T>> void sort(List<T> list)根据元素的自然顺序对指定 List 集合元素按升序排序

  • public static <T> void sort(List<T> list,Comparator<? super T> c)根据指定的 Comparator 产生的顺序对 List 集合元素进行排序

  • public static void swap(List<?> list,int i,int j)将指定 list 集合中的 i 处元素和 j 处元素进行交换

  • public static int frequency(Collection<?> c,Object o)返回指定集合中指定元素的出现次数

  • public static <T> void copy(List<? super T> dest,List<? extends T> src)将src中的内容复制到dest中

  • public static <T> boolean replaceAll(List<T> list,T oldVal,T newVal):使用新值替换 List 对象的所有旧值

  • Collections 类中提供了多个 synchronizedXxx() 方法,该方法可使将指定集合包装成线程同步的集合,从而可以解决多线程并发访问集合时的线程安全问题

  • Collections类中提供了多个unmodifiableXxx()方法,该方法返回指定 Xxx的不可修改的视图。

相关文章:

第11章 集合与迭代器

目录 目录 目录 11.1 Collection集合 11.1.1 集合的概念 11.1.2 Collection接口 1、添加元素 2、删除元素 3、查询与获取元素 11.2 List 有序集合 11.2.1 新增方法 11.2.2 ArrayList 11.2.3 LinkedList 1、单向链表 2、双向链表 3、删除元素 11.3 Set 无序集合 …...

探索Linux中的神奇工具:探秘tail命令的妙用

探索Linux中的神奇工具&#xff1a;探秘tail命令的妙用 在Linux系统中&#xff0c;tail命令是一个强大的工具&#xff0c;用于查看文件的末尾内容。本文将详细介绍tail命令的基本用法和一些实用技巧&#xff0c;帮助读者更好地理解和运用这个命令。 了解tail命令 tail命令用…...

1688商品API接口:电商数据自动化的新引擎

1688作为中国领先的B2B电子商务平台&#xff0c;为广大商家和制造商提供了一个展示和交易商品的广阔市场。随着1688商品API接口的推出&#xff0c;开发者和商家现在能够通过编程方式自动化获取和管理商品数据&#xff0c;极大地提高了工作效率和数据处理的灵活性。 一、1688商…...

路由器不能端口映射什么原因?如何设置内网映射?

近期有小伙伴发来求助信息&#xff0c;他以前开游戏服务器和别人一起玩&#xff0c;那个时候端口映射还好&#xff0c;不知道哪一天开始突然不行了&#xff0c;已经是公网了&#xff0c;光猫是桥接的状态&#xff0c;连路由器都换了&#xff0c;就是不能端口映射开服务器&#…...

开源RAG,本地mac启动 dify源码服务

一、Dify文档 参考官方文档来操作&#xff0c;基本没太大的问题。一些细节&#xff0c;我在本篇文章中补充了出来。 这篇文章主要讲以源码的方式启动后端服务&#xff0c;前端服务使用容器启动。 dify 文档地址 欢迎使用 Dify | 中文 | Dify Dify 本地源码部署文档&#xff…...

【Linux取经路】基于信号量和环形队列的生产消费者模型

文章目录 一、POSIX 信号量二、POSIX 信号量的接口2.1 sem_init——初始化信号量2.2 sem_destroy——销毁信号量2.3 sem_wait——等待信号量2.4 sem_post——发布信号量 三、基于环形队列的生产消费者模型3.1 单生产单消费模型3.2 多生产多消费模型3.3 基于任务的多生产多消费模…...

计算机SCI期刊,中科院2区,收稿范围非常广泛!

一、期刊名称 Journal of Web Semantics 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;计算机科学 影响因子&#xff1a;2.5 中科院分区&#xff1a;2区 出版方式&#xff1a;开放出版 版面费&#xff1a;$1600 三、期刊征稿范围 《网络语义学杂志》…...

JDK、JRE、编译指令和垃圾回收机制详解

JDK 全称 Java SE Development Kit (Java 开发工具包) JVM虚拟机&#xff1a;Java运行的地方 核心类库&#xff1a;Java提前编好的东西 开发工具&#xff1a; javac,java,jdb,jhat javac:Java编译器&#xff0c;用于将Java源代码编译成Java字节码文件(.class)。 java: java…...

【ARM 嵌入式 C 入门及渐进 6.2 -- ARMv8 C 内嵌汇编读系统寄存器的函数实现】

请阅读【嵌入式开发学习必备专栏】 文章目录 ARMv8 C 内嵌汇编读系统寄存器 ARMv8 C 内嵌汇编读系统寄存器 要在ARMv8架构中通过C代码和内嵌汇编来读取系统寄存器s3_0_c15_c5_5的值&#xff0c;并将其返回&#xff0c;可以按照以下方式实现system_read_reg函数&#xff1a; #…...

使用 LlamaParse 进行 PDF 解析并创建知识图谱

此 Python 笔记本提供了有关利用 LlamaParse 从 PDF 文档中提取信息并随后将提取的内容存储到 Neo4j 图形数据库中的综合指南。本教程在设计时考虑到了实用性&#xff0c;适合对文档处理、信息提取和图形数据库技术感兴趣的开发人员、数据科学家和技术爱好者。 该笔记本电脑的主…...

Oracle行迁移解析

行迁移&#xff08;Row Migration&#xff09;是Oracle数据库中的另一个现象&#xff0c;它与行链接类似&#xff0c;都是由于数据行大小的变化导致的存储问题&#xff0c;但其本质和影响有所不同。 触发条件&#xff1a;行迁移发生在当一个已存在的、原先能够完全存储在一个数…...

【k8s】 busybox镜像、挂载volume卷

1. 概述 busybox是一个包含了nslookup,ping,wget等网络处理命令的Pod容器&#xff08;不含curl命令&#xff09;&#xff0c;它的体积非常小&#xff0c;适合做一些容器内的网络调试。 即创建一个docker &#xff0c;进去执行 ping 命令等 2. 启动容器 2.1 会自动退出&…...

文本三剑客之 sed 编辑器

一.sed 概述 1.sed 介绍 sed是一种流编辑器&#xff0c;流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。 sed编辑器可以根据命令来处理数据流中的数据&#xff0c;这些命令要么从命令行中输入&#xff0c;要么存储在一个 命令文本文件中。 2.sed 的工…...

【MySQL精通之路】SQL优化(1)-查询优化(3)-索引合并

主博客&#xff1a; 【MySQL精通之路】SQL优化(1)-CSDN博客 上一篇&#xff1a; 【MySQL精通之路】SQL优化(1)-查询优化(2)-范围查询优化-CSDN博客 下一篇&#xff1a; 目录 1.索引合并-交集访问算法 2.索引合并联合访问算法 3.索引合并-排序联合访问算法 4.影响索引合…...

Linux中安装配置并使用samba服务(Centos以及Ubuntu)

目录 前言1. 基本知识2. Centos3. Ubuntu3.1 物理服务器3.2 云服务器前言 在window与linux系统中配置一个共享文件夹,可以做很多时间,比如映射器或者像linux中定时存放文件等 1. 基本知识 在Ubuntu上安装和配置Samba服务可以让你的Ubuntu机器与Windows、macOS以及其他Linu…...

three.js能实现啥效果?看过来,这里都是它的菜(06)

这是第五期了&#xff0c;本期继续分享three.js可以实现的3D动画案例&#xff0c;有老铁反馈再发案例的时候&#xff0c;是否可以顺道分享一下three.js的知识点&#xff0c;好吧&#xff0c;安排。 材质动画 材质动画可以实现各种复杂的视觉效果&#xff0c;包括但不限于以下…...

利用ESP32-C3将TF卡内容变成U盘进行读取

利用ESP32-C3将TF卡内容变成U盘进行读取 ESP32-C3是一款高性价比的微控制器&#xff0c;具备WiFi和蓝牙功能&#xff0c;广泛应用于物联网&#xff08;IoT&#xff09;项目中。除了常见的无线通信功能外&#xff0c;ESP32-C3还可以用来模拟U盘读取TF卡内容。本文将介绍如何通过…...

C++小病毒

C小病毒&#xff08;注&#xff1a;对电脑无过大伤害&#xff09; 短短行&#xff0c;创造奇迹&#xff01; 把这个文件命名为virus.exe就可以使用了。 #include<bits/stdc.h> #include<windows.h> using namespace std; int main() {HWND hwnd GetForegroundW…...

使用VUE3+TS+elementplus创建一个增加按钮

一、前言 在上一篇文章中分享了创建table的过程&#xff0c;详见&#xff08;VUE3TSelementplus创建table&#xff0c;纯前端的table&#xff09;&#xff0c;本文在创建好的table的基础上&#xff0c;再创建一个增加按钮。 二、程序展示 1、前面创建table的程序 <templ…...

Python面试宝典:文件读写和上下文管理器以及输入输出流面试题(1000加python面试题助你轻松捕获大厂Offer)

Python面试宝典:1000加python面试题助你轻松捕获大厂Offer【第一部分:Python基础:第八章:文件操作和输入输出:第一节:文件读写和上下文管理器以及输入输出流】 第八章:文件操作和输入输出第一节:文件读写和上下文管理器以及输入输出流1.1、文件读写基本操作1.1.1、打开…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...