Java 入门指南:List 接口

Collection 接口提供了一系列用于操作和管理集合的方法,包括添加、删除、查询、遍历等。它是所有集合类的根接口,包括 ListSetQueue 等。

![[Collection UML.png]]

Collection 接口常见方法

  • add(E element):向集合中添加元素。

  • addAll(Collection col):将 col 中的所有元素添加到集合中

  • boolean remove(Object obj):通过元素的equals方法判断是否是要删除的那个元素,只删除找到的第一个元素

  • boolean removeAll(Collection col):取两集合差集

  • boolean retain(Collection col):把交集的结果存在当前的集合中,不影响col

  • boolean contains(Object obj):判断集合中是否包含指定的元素。

  • boolean containsAll(Collection col):调用元素的equals方法来比较的。用两个两个集合的元素逐一比较

  • size():返回集合中的元素个数。

  • isEmpty():判断集合是否为空。

  • clear():清空集合中的所有元素。

  • iterator():返回用于遍历集合的迭代器。

  • hashCode(): 获取集合对象的哈希值

  • Object[] toArray():转换成对象数组

List 接口

List 接口是 Java 集合框架(Java Collections Framework)中的一个重要接口,它继承自 Collection 接口。List 接口的特点主要包括:

  1. 有序性List 集合中的元素是有序的,即元素的添加顺序和取出顺序一致。

  2. 可重复性List 集合中的元素可以重复

  3. 索引支持List 集合中的每个元素都对应一个整数型的索引,可以通过索引来访问元素。

List 接口底层以数组方式进行对象存储,允许存放null元素

不建议添加 null 值,null 值无意义,会让代码难以维护比如忘记做判空处理就会导致空指针异常

Collection 接口不同,List 接口中的元素是按照插入的顺序进行排序的,可以根据索引访问和操作集合中的元素。它允许集合中存在相同的元素

List 接口常用方法

![[List Methods.png]]

List 常见实现类

JDK API中提供了多个 List 接口的实现类,常用的有 ArrayListLinkedListVector 等。

  • ArrayList:基于动态数组实现,适用于对元素的随机访问,但在列表的头部或中部插入、删除元素时性能较差,因为需要移动其他元素。

  • LinkedList:基于双向链表实现,适用于频繁的插入和删除操作,尤其是在列表的头部或尾部进行操作时。但在随机访问元素时性能较差,因为需要从头或尾开始遍历链表。

  • Vector:与 ArrayList 类似,但它是线程安全的,即支持多线程环境下的并发访问。然而,由于线程安全的实现带来了额外的性能开销,因此在单线程环境下通常不推荐使用 Vector

ArrayList

ArrayList 是基于动态数组实现的 List,它使用数组来存储元素,具有快速的随机访问和修改能力。可以高效地通过索引访问和更新元素,适用于频繁访问元素的场景。

![[ArrayList Class.png]]

ArrayList 继承于 AbstractList ,实现了 List, RandomAccess, Cloneable, java.io.Serializable 这些接口。

ArrayList 类的定义

public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{ }
  • List : 表明它是一个列表,支持添加、删除、查找等操作,并且可以通过下标进行访问。

  • RandomAccess :这是一个标志接口,表明实现这个接口的 List 集合是支持 快速随机访问 的。在 ArrayList 中,我们即可以通过元素的索引快速获取元素对象,这就是快速随机访问。

  • Cloneable :表明它具有拷贝能力,可以进行深拷贝或浅拷贝操作。

  • Serializable : 表明它可以进行序列化操作,也就是可以将对象转换为字节流进行持久化存储或网络传输,非常方便。

ArrayList 特点
  1. 动态调整大小ArrayList 内部使用数组来存储元素,当元素数量超过当前数组容量时,ArrayList自动增加内部数组的大小,以容纳更多的元素。

    在添加大量元素前,应用程序也可以使用ensureCapacity操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。

  2. 随机访问:由于 ArrayList 基于数组实现,可以通过索引快速访问和修改元素。通过 get(index) 方法可以获取指定索引位置的元素
    通过 set(index, element) 方法可以替换指定索引位置的元素。

  3. 动态添加和删除ArrayList 提供了多个方法来添加和删除元素,如 add(element)add(index, element)remove(index)remove(element) 等。添加和删除元素时,ArrayList 会自动调整数组的大小。

  4. 支持迭代ArrayList 实现了 Iterable 接口,因此可以使用增强的 for 循环或者迭代器来遍历 ArrayList 中的元素。

  5. 不是线程安全的ArrayList 不是线程安全的,如果在多线程环境中使用 ArrayList 需要考虑线程同步的问题。

ArrayList 三种构造方法
  1. ArrayList():构造一个默认大小为10容量的空列表。
List list = new ArrayList();

JDK 1.7:直接创建一个初始容量为10的数组
JDK 1.8:一开始创建一个长度为0的数组,当添加第一个元素时再创建一个始容量为10的数组

  1. ArrayList(int initialCapacity):构造一个大小为指定 initialCapacity容量的空列表。
List list = new ArrayList(initCapacity);
  1. ArrayList(Collection c):构造一个和参数 c 相同元素的ArrayList对象
List col = new ArrayList(6);
col.add("1");
List list = new ArrayList(col);
ArrayList 扩容机制

ArrayList 的扩容机制是动态的,可以根据需要自动增加容量。这种机制使得 ArrayList 能够有效地管理内存,并且在大多数情况下提供了良好的性能。

ArrayList初始容量默认为10。如果在创建 ArrayList 时指定了初始容量,那么将使用指定的容量。例如:

ArrayList<String> list = new ArrayList<>(20);  // 初始容量为20

当向 ArrayList 添加元素导致其容量不足时,ArrayList 会自动增加容量。ArrayList 的扩容策略如下:

  • 默认扩容比例:默认情况下,ArrayList 的容量每次增加原来的50%(即扩容为原来的1.5倍)。

  • 扩容操作:扩容操作通过调用 ensureCapacityInternal 方法完成。

下面通过源码分析 ArrayList 的扩容过程:

public boolean add(E e) {ensureCapacityInternal(size + 1);  // Increments modCount!!elementData[size++] = e;return true;
}private void ensureCapacityInternal(int minCapacity) {if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);}ensureExplicitCapacity(minCapacity);
}private void ensureExplicitCapacity(int minCapacity) {modCount++;// 检查是否需要扩容if (minCapacity - elementData.length > 0)grow(minCapacity);
}private void grow(int minCapacity) {// overflow-conscious codeint oldCapacity = elementData.length;int newCapacity = oldCapacity + (oldCapacity >> 1);  // 原容量的1.5倍if (newCapacity - minCapacity < 0)newCapacity = minCapacity;if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);// minCapacity is usually close to size, so this is a win:elementData = Arrays.copyOf(elementData, newCapacity);
}

源代码解析:

  1. add方法add 方法首先调用 ensureCapacityInternal 来确保有足够的容量来存储新增的元素。

  2. ensureCapacityInternal方法:如果 elementData 是默认的空数组 DEFAULTCAPACITY_EMPTY_ELEMENTDATA,则将最小容量设置为10或指定的初始容量。然后调用 ensureExplicitCapacity 方法。

  3. ensureExplicitCapacity方法:如果最小容量大于当前容量,则调用 grow 方法来扩容。

  4. grow方法:根据当前容量计算新的容量(默认为原容量的1.5倍),如果新的容量仍然不足以满足最小容量的要求,则直接设置为最小容量。如果新的容量超过了 MAX_ARRAY_SIZE(即 Integer.MAX_VALUE - 8),则调用 hugeCapacity 方法来防止溢出。

ArrayList 使用示例
import java.util.ArrayList;
import java.util.List;public class ArrayListExample {public static void main(String[] args) {// 创建一个 ArrayListList<String> names = new ArrayList<>();// 添加元素names.add("Alice");names.add("Bob");names.add("Charlie");// 访问元素System.out.println(names.get(0));  // 输出: Alice// 修改元素names.set(1, "David");System.out.println(names);  // 输出: [Alice, David, Charlie]// 插入元素names.add(1, "Eve");System.out.println(names);  // 输出: [Alice, Eve, David, Charlie]// 删除元素names.remove(2);System.out.println(names);  // 输出: [Alice, Eve, Charlie]// 查找元素System.out.println(names.indexOf("Eve"));  // 输出: 1}
}
LinkedList

LinkedList 是基于双向链表实现的 List,它使用链表来存储元素,具有高效的插入和删除操作。不同于 ArrayListLinkedList 在插入和删除元素时没有数组的扩容和复制开销,适用于频繁插入和删除元素的场景

![[LinkedList类图.png]]

LinkedList 继承了 AbstractSequentialList ,而 AbstractSequentialList 又继承于 AbstractList 。所以 LinkedList 会有大部分方法和 ArrayList 相似。

LinkedList的定义

public class LinkedList<E>extends AbstractSequentialList<E>implements List<E>, Deque<E>, Cloneable, java.io.Serializable{}
  • List : 表明它是一个列表,支持添加、删除、查找等操作,并且可以通过下标进行访问。

  • Deque :继承自 Queue 接口,具有双端队列的特性,支持从两端插入和删除元素,方便实现栈和队列等数据结构。

  • Cloneable :表明它具有拷贝能力,可以进行深拷贝或浅拷贝操作。

  • Serializable : 表明它可以进行序列化操作,也就是可以将对象转换为字节流进行持久化存储或网络传输,非常方便。

为什么没有实现RandomAccess接口?
由于 LinkedList 底层数据结构是链表,内存地址不连续,只能通过指针来定位,不支持随机快速访问,所以不能实现 RandomAccess 接口。

LinkedList 特点
  1. 双向链表LinkedList 内部使用双向链表来存储元素,每个节点都包含一个指向前一个节点和后一个节点的引用。这使得在链表中添加、删除元素比较高效,因为只需要调整相邻节点的引用。

  2. 动态添加和删除LinkedList 提供了多个方法来添加和删除元素,如 add(element)addFirst(element)addLast(element)remove(element)removeFirst()removeLast() 等。添加和删除元素时,只需要调整节点的引用,不需要像数组那样移动元素。

  3. 支持队列和栈操作:由于 LinkedList 实现了 Deque 接口,可以将 LinkedList 作为队列(先进先出)或栈(后进先出)来使用。例如,可以使用 offer(element)poll() 方法来实现队列操作,使用 push(element)pop() 方法来实现栈操作。

  4. 随机访问效率较低:由于 LinkedList 是基于链表实现的,在随机访问时需要从头节点或尾节点开始依次遍历链表,因此访问效率相对较低。

  5. 不是线程安全的LinkedList 不是线程安全的,如果在多线程环境中使用 LinkedList 需要考虑线程同步的问题。

LinkedList 两种构造方法
  1. LinkedList():构造一个空的 LinkedList 对象。

  2. LinkedList(Collection col):构造一个和参数 col 相同元素的 LinkedList 对象

public LinkedList(Collection <? extends E> col){this();addAll(col);
}
LinkedList 内的元素

LinkedList 中的元素是通过 Node 定义的:

private static class Node<E> {E item;       // 节点值Node<E> next; // 后继节点Node<E> prev; // 前驱结点Node(Node<E> prev, E item, Node<E> next) {this.item = item;this.next = next;this.prev = prev;}
}
LinkedList 类的方法
方法功能说明
void addFirst(Object obj)在链表头部插入一个元素
void addLast(Object obj)在链表尾部添加一个元素
Object getFirst()获取第一个元素
Object getlast()获取最后一个元素
Object removeFirst()删除头元素
Object removeLast()删除尾元素
Object peek()获取但不移除第一个元素
Object poll()获取并移除第一个元素
LinkedList 中的栈操作
  • void push(element): 将指定的元素添加到链表的开头,作为栈的顶部元素。

  • void pop(): 移除并返回链表的第一个元素,即栈的顶部元素。

LinkedList 中的队列操作
  • boolean offer(element): 将指定的元素添加到链表的末尾,作为队列的尾部元素。

  • poll(): 移除并返回链表的第一个元素,即队列的头部元素。

LinkedList 使用示例
import java.util.LinkedList;
import java.util.List;public class LinkedListExample {public static void main(String[] args) {// 创建一个 LinkedListList<String> names = new LinkedList<>();// 添加元素names.add("Alice");names.add("Bob");names.add("Charlie");// 访问元素System.out.println(names.get(0));  // 输出: Alice// 修改元素names.set(1, "David");System.out.println(names);  // 输出: [Alice, David, Charlie]// 插入元素names.add(1, "Eve");System.out.println(names);  // 输出: [Alice, Eve, David, Charlie]// 删除元素names.remove(2);System.out.println(names);  // 输出: [Alice, Eve, Charlie]// 查找元素System.out.println(names.indexOf("Eve"));  // 输出: 1}
}
LinkedList 和 ArrayList 的区别
  • 是否保证线程安全ArrayListLinkedList 都是不同步的,也就是不保证线程安全;

  • 底层数据结构: ArrayList 底层使用的是 Object 数组;LinkedList 底层使用的是 双向链表 数据结构(JDK1.6 之前为循环链表,JDK1.7 取消了循环。)

  • 插入和删除是否受元素位置的影响

    • ArrayList 采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。 比如:执行add(E e)方法的时候, ArrayList 会默认在将指定的元素追加到此列表的末尾,这种情况时间复杂度就是 O(1)

      如果要在指定位置 i 插入和删除元素的话(add(int index, E element)),时间复杂度就为 O(n)。因为在进行上述操作的时候集合中第 i 和第 i 个元素之后的 (n-i) 个元素都要执行向后位/向前移一位的操作。

    • LinkedList 采用链表存储,所以在头尾插入或者删除元素不受元素位置的影响(add(E e)addFirst(E e)addLast(E e)removeFirst()removeLast()),时间复杂度为 O(1)

    如果是要在指定位置 i 插入和删除元素的话(add(int index, E element)remove(Object o),remove(int index)), 时间复杂度为 O(n) ,因为需要先移动到指定位置再插入和删除。

  • 是否支持快速随机访问LinkedList 不支持高效的随机元素访问, ArrayList(实现了 RandomAccess 接口) 支持。快速随机访问就是通过元素的序号快速获取元素对象(对应于get(int index)方法)。

  • 内存空间占用

    • ArrayList 的空间浪费主要体现在在 list 列表的结尾会预留一定的容量空间
    • LinkedList 的空间花费则体现在它的每一个元素都需要消耗比 ArrayList 更多的空间(因为要存放直接后继和直接前驱以及数据)。
Vector

VectorArrayList 类似,也是基于动态数组实现的 List,不同的是 Vector线程安全的。可以在多线程环境中可以安全地使用。

由于线程安全的需要,使用 Vector 可能会带来一些额外的开销,在性能要求较高的场景下或单线程环境下,可以优先选择 ArrayList

Vector 的四种构造方法
  1. Vector():构造一个构造一个元素个数为 0 的 Vector 对象,为其分配默认大小的容量。

  2. Vector(int size):构造一个构造一个元素个数为 0 的 Vector 对象,为其分配大小为 size 的初始容量。

  3. Vector(Collection c):构造一个和参数 c 相同元素的 Vector 对象

  4. Vector(int initalcapacity, int capacityincrement):构造一个构造一个元素个数为 0 的Vector对象,为其分配大小为 initalcapacity 的初始容量。并指定 vector 中的元素个数达到初始容量时,vector自动增加大小为 capacityincrement容量

Vector 底层源码

vector底层源码绝大数和ArrayList相同,但扩容机制略有区别,Vector 每次扩容是前一次容量的二倍

Vector 使用示例
import java.util.Vector;
import java.util.List;public class VectorExample {public static void main(String[] args) {// 创建一个 VectorList<String> names = new Vector<>();// 添加元素names.add("Alice");names.add("Bob");names.add("Charlie");// 访问元素System.out.println(names.get(0));  // 输出: Alice// 修改元素names.set(1, "David");System.out.println(names);  // 输出: [Alice, David, Charlie]// 插入元素names.add(1, "Eve");System.out.println(names);  // 输出: [Alice, Eve, David, Charlie]// 删除元素names.remove(2);System.out.println(names);  // 输出: [Alice, Eve, Charlie]// 查找元素System.out.println(names.indexOf("Eve"));  // 输出: 1}
}
Stack 类

在 Java 中,java.util.StackStack 类的具体实现。它是 Vector 类的一个子类,因此继承了 Vector 的所有特性,并在此基础上提供了一些额外的方法来支持栈的操作。

  1. 添加和删除元素:

    • push(element):将元素压入栈顶。
    • pop():弹出栈顶的元素,并将其从栈中删除。
  2. 获取栈顶元素:

    • peek():获取栈顶的元素,但不将其从栈中删除。
  3. 判断栈是否为空:

    • empty():检查栈是否为空,如果为空则返回 true,否则返回 false。
  4. 查询元素位置:

    • search(element):返回元素在栈中的位置(从栈顶开始计数),如果元素不存在,则返回 -1。

由于 Stack 是基于 Vector 实现的,它并不是完全线程安全的。

如果在多线程环境中使用栈,建议使用 java.util.concurrent.ConcurrentLinkedDeque 或其他线程安全的栈实现类,或者使用 synchronized 进行同步,以确保同一时间只有一个线程可以修改栈中的元素。

Stack 使用示例
import java.util.Stack;public class StackExample {public static void main(String[] args) {// 创建一个 StackStack<String> stack = new Stack<>();// 添加元素stack.push("Alice");stack.push("Bob");stack.push("Charlie");// 访问栈顶元素System.out.println("Top element: " + stack.peek());  // 输出: Top element: Charlie// 获取并移除栈顶元素String topElement = stack.pop();System.out.println("Popped element: " + topElement);  // 输出: Popped element: Charlie// 再次访问栈顶元素System.out.println("New top element: " + stack.peek());  // 输出: New top element: Bob// 检查栈是否为空System.out.println("Is the stack empty? " + stack.isEmpty());  // 输出: Is the stack empty? false// 获取栈的大小System.out.println("Size of the stack: " + stack.size());  // 输出: Size of the stack: 2// 遍历栈中的所有元素while (!stack.isEmpty()) {System.out.println(stack.pop());  // 依次输出: Bob, Alice}}
}

总结

List 接口提供了灵活的方式来处理有序的元素集合。根据具体的需求选择适当的实现类(如 ArrayListVectorLinkedList),可以优化程序的性能并简化代码。了解每种实现类的特点和适用场景对于有效利用 List 接口非常重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/408681.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

洛谷 P2569 [SCOI2010] 股票交易

题目来源于&#xff1a;洛谷 题目本质&#xff1a;动态规划&#xff0c;单调队列 解题思路&#xff1a; 方程f[i][j]表示第 i 天结束后&#xff0c;手里剩下 j 股的最大利润&#xff0c;则不买不卖&#xff1a;f[i][j]f[i-1][j]。 买入&#xff1a;f[i][j]max{f[i-w-1][k]k*…

vue3+ts+Go使用百度地图路书实现历史轨迹回放、轨迹回放进度、聚合点、自定义弹框和实时监控视频、多路视频轮巡播放

前言 分享一个刚做完项目集成技术&#xff0c;一个车辆行驶轨迹监控、行车视频监控、对特种车辆安全监管平台&#xff0c;今年政府单位有很多监管平台项目&#xff0c;例如&#xff1a;渣土车监控、租出车监管、危害气体运输车监管等平台&#xff0c;这些平台都有车辆行驶轨迹…

uniapp实现区域滚动、下拉刷新、上滑滚动加载更多

背景&#xff1a; 在uniapp框架中&#xff0c;有两种实现办法。第1种&#xff0c;是首先在page.json中配置页面&#xff0c;然后使用页面的生命周期函数&#xff1b;第2种&#xff0c;使用<scroll-view>组件&#xff0c;然后配置组件的相关参数&#xff0c;包括但不限于&…

Spring(一篇就懂)

Spring框架简介 Spring 是一个开源的Java企业级应用开发框架。 特点&#xff1a; 控制反转&#xff08;IoC&#xff09;&#xff1a;通过依赖注入&#xff08;DI&#xff09;减少组件间的耦合&#xff0c;由Spring容器负责对象的创建和绑定。 面向切面编程&#xff08;AOP&am…

企业高性能web服务器(nginx)

目录 Web服务器基础介绍 正常情况下的单次web服务器访问流程 Apache 经典的 Web服务端 Apache prefork 模型 Apache work模型 Apache event模型 服务端的I/O流程 服务器的I/O 磁盘I/O 网络I/O 网络I/O处理过程 I/O模型 I/O模型相关概念 同步/异步 阻塞/非阻塞 网…

面向对象06:super关键字详解

本节内容视频链接&#xff1a;面向对象10&#xff1a;Super详解_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV12J41137hu?p69&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 Java中的‌super关键字是一个特殊的引用&#xff0c;‌用于指代父类对象‌。‌在子…

鸿蒙HarmonyOS实战:IPC与RPC设备内进程通信

基本 IPC&#xff08;Inter-Process Communication&#xff09;与RPC&#xff08;Remote Procedure Call&#xff09;用于实现跨进程通信&#xff0c;不同的是前者使用Binder驱动&#xff0c;用于设备内的跨进程通信&#xff0c;后者使用软总线驱动&#xff0c;用于跨设备跨进…

学习yolo+Java+opencv简单案例(三)

主要内容&#xff1a;车牌检测识别&#xff08;什么颜色的车牌&#xff0c;车牌号&#xff09; 模型作用&#xff1a;车牌检测&#xff0c;车牌识别 文章的最后附上我的源码地址。 学习还可以参考我前两篇博客&#xff1a; 学习yoloJavaopencv简单案例&#xff08;一&#xff0…

Datawhale X 李宏毅苹果书 AI夏令营-深度学习入门班-task2

一开始假设的模型是ybw1&#xff0c;但在可视化预测值和真实值后&#xff0c;发现数据具有规律性&#xff0c;因此换成7天 额&#xff0c;不知道为什么要在这里这样引入sigmoid函数&#xff0c;有点怪怪的&#xff0c;但确实用无限多的分段函数就能拟合很多曲线 所以这里的意…

5步实现猫眼电影爬虫与k-means算法可视化分析

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

框架——特殊符号处理,模糊查询

1.特殊符号处理 在 mybatis 中的 xml 文件中&#xff0c;存在一些特殊的符号&#xff0c;比如&#xff1a;<、>、"、&、<>等&#xff0c;正常书写mybatis 会报错&#xff0c;需要对这些符号进行转义。具体转义如下所示&#xff1a; 特殊字符 转义字符 &…

【GNSS射频前端】MA2769初识

MAX2769 芯片概述&#xff1a; MAX2769是一款单芯片多系统GNSS接收器&#xff0c;采用Maxim的低功耗SiGe BiCMOS工艺技术。集成了包括双输入低噪声放大器&#xff08;LNA&#xff09;、混频器、图像拒绝滤波器、可编程增益放大器&#xff08;PGA&#xff09;、压控振荡器&#…

微信小游戏授权问题

微信小程序获取用户相关信息的接口&#xff0c;如wx.getUserCloudStorage&#xff0c;报错&#xff1a;please go to mp to announce your privacy usage。 需要在微信公众平台设置用户隐私保护。

(论文解读)Domain Adaptation via Prompt Learning

摘要 无监督域适应( UDA )旨在将从带有标签的源域数据中学习到的模型适应到未标注的目标域数据集。现有的UDA方法通过对齐源域和目标域特征空间来学习领域不变特征。这种对齐是通过约束实现的&#xff0c;例如统计差异最小化或对抗学习。 然而&#xff0c;这些约束会导致语义…

AudioNotes -将音频内容转 markdown

文章目录 一、关于 AudioNotes效果展示音视频识别和整理与音视频内容对话 二、使用方法1、安装 Ollama2、拉取模型3、部署服务3.1 Docker部署&#xff08;推荐&#xff09;&#x1f433;3.2 本地部署 &#x1f4e6; 一、关于 AudioNotes AudioNotes 能够快速提取音视频的内容&…

【C# 】使用List<实体类>

1. 使用List<实体类> 要在C#中使用List<EntityTemp>并实现查找数据输出&#xff0c;首先需要定义EntityTemp类&#xff0c;并创建一个List<EntityTemp>类型的列表。然后&#xff0c;你可以使用LINQ或其他方法来查找和输出数据。 假设EntityTemp类具有一个…

Kafka快速入门:Kafka驱动JavaApi的使用

生产者和消费者是Kafka的核心概念之一&#xff0c;它们在客户端被创建和使用&#xff0c;并且包含了许多与Kafka性能和机制相关的配置。虽然Kafka提供的命令行工具能够执行许多基本操作&#xff0c;但它无法实现所有可能的性能优化。相比之下&#xff0c;使用Java API可以充分利…

zigbee笔记、十五、组播通信原理

一、zigbee四种通讯 1、单播&#xff08;略&#xff09; 2、广播&#xff08;略&#xff09; 3、组播&#xff1a;在zigbee网络中&#xff0c;模块可以用分组来标记&#xff0c;发送的模块如果发送的组号和网络里面标记接收模块的组号相对应&#xff0c;那么这些模块就可以拿到…

C#/.NET/.NET Core技术前沿周刊 | 第 1 期(2024年8.12-8.18)

前言 C#/.NET/.NET Core技术前沿周刊&#xff0c;你的每周技术指南针&#xff01;记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿&#xff0c;助力技术成长与视野拓宽。 欢迎投稿&#xff0c;推荐…

innodb_buffer_pool_size在线缩小操作

一、背景 测试数据库内存32G&#xff0c;只有MySQL数据库&#xff0c;但是innodb_buffer_pool_size设置了24G&#xff0c;导致经常出现lack of memory问题、lack of swap问题。 因为使用了MySQL5.7.36版本&#xff0c;利用innodb_buffer_pool_size参数值可在线调整的新特性&…