List 接口的实现类

在 Java 中,List 是一个非常常用的接口,提供了有序、可重复的元素集合。List 接口有多个实现类,每个实现类都有其特定的特性和适用场景。以下是 Java 中主要实现了 List 接口的类及其详细介绍。

1. 常见的 List 实现类

1.1 ArrayList

  • 简介

    • 基于动态数组实现。
    • 提供快速的随机访问(getset 操作时间复杂度为 O(1))。
    • 适合频繁的读取操作,但在插入和删除时可能较慢,尤其是在列表中间位置。
  • 特点

    • 动态扩容:当数组容量不足时,会自动扩展(通常是当前容量的 1.5 倍)。
    • 允许 null 元素
    • 非同步:不适合多线程环境下的并发访问,除非外部同步。
  • 示例

    import java.util.ArrayList;
    import java.util.List;public class ArrayListExample {public static void main(String[] args) {List<String> arrayList = new ArrayList<>();arrayList.add("Apple");arrayList.add("Banana");arrayList.add("Cherry");arrayList.add("Apple"); // 允许重复元素System.out.println("ArrayList: " + arrayList);}
    }
    

    输出

    ArrayList: [Apple, Banana, Cherry, Apple]
    

1.2 LinkedList

  • 简介

    • 基于双向链表实现。
    • 适合频繁的插入和删除操作,特别是在列表的开头和中间位置。
    • 支持作为队列(FIFO)和双端队列(Deque)的实现。
  • 特点

    • 插入和删除效率高:在已知位置的插入和删除操作时间复杂度为 O(1)。
    • 随机访问较慢getset 操作时间复杂度为 O(n),因为需要遍历链表。
    • 允许 null 元素
  • 示例

    import java.util.LinkedList;
    import java.util.List;public class LinkedListExample {public static void main(String[] args) {List<String> linkedList = new LinkedList<>();linkedList.add("Apple");linkedList.add("Banana");linkedList.add("Cherry");linkedList.add("Apple"); // 允许重复元素System.out.println("LinkedList: " + linkedList);}
    }
    

    输出

    LinkedList: [Apple, Banana, Cherry, Apple]
    

1.3 Vector

  • 简介

    • 类似于 ArrayList,也是基于动态数组实现。
    • 是同步的,线程安全的。
    • 适合需要线程安全的场景,但由于同步开销,性能略低于 ArrayList
  • 特点

    • 同步:所有的公开方法都是同步的,适用于多线程环境。
    • 动态扩容:默认扩容策略与 ArrayList 略有不同(通常是当前容量的两倍)。
    • 允许 null 元素
  • 示例

    import java.util.List;
    import java.util.Vector;public class VectorExample {public static void main(String[] args) {List<String> vector = new Vector<>();vector.add("Apple");vector.add("Banana");vector.add("Cherry");vector.add("Apple"); // 允许重复元素System.out.println("Vector: " + vector);}
    }
    

    输出

    Vector: [Apple, Banana, Cherry, Apple]
    

1.4 Stack

  • 简介

    • 继承自 Vector,表示后进先出(LIFO)的堆栈。
    • 提供了额外的方法,如 pushpoppeek
  • 特点

    • 继承自 Vector:具备线程安全性。
    • LIFO 结构:适用于需要堆栈行为的场景。
    • 已过时:由于继承自 Vector,不推荐使用。Java 推荐使用 Deque 接口及其实现类(如 ArrayDeque)来实现堆栈。
  • 示例

    import java.util.Stack;public class StackExample {public static void main(String[] args) {Stack<String> stack = new Stack<>();stack.push("Apple");stack.push("Banana");stack.push("Cherry");System.out.println("Stack: " + stack);String top = stack.pop();System.out.println("Popped element: " + top);System.out.println("Stack after pop: " + stack);}
    }
    

    输出

    Stack: [Apple, Banana, Cherry]
    Popped element: Cherry
    Stack after pop: [Apple, Banana]
    

1.5 CopyOnWriteArrayList

  • 简介

    • 线程安全的 List 实现,适用于读多写少的并发场景。
    • 基于“写时复制”机制,每次修改操作都会创建一个新的数组副本。
  • 特点

    • 线程安全:无需外部同步。
    • 高效的迭代:迭代时不会抛出 ConcurrentModificationException,适合并发读取。
    • 写操作开销大:每次写操作都会复制整个数组,适合读多写少的场景。
  • 示例

    import java.util.List;
    import java.util.concurrent.CopyOnWriteArrayList;public class CopyOnWriteArrayListExample {public static void main(String[] args) {List<String> cowList = new CopyOnWriteArrayList<>();cowList.add("Apple");cowList.add("Banana");cowList.add("Cherry");System.out.println("CopyOnWriteArrayList: " + cowList);}
    }
    

    输出

    CopyOnWriteArrayList: [Apple, Banana, Cherry]
    

1.6 StackDeque 的对比

尽管 StackList 的一个实现类,但 Java 推荐使用 Deque 接口及其实现类(如 ArrayDeque)来替代 Stack,因为它们提供了更全面和灵活的堆栈和队列操作。

  • 示例(使用 ArrayDeque 作为堆栈)

    import java.util.ArrayDeque;
    import java.util.Deque;public class ArrayDequeExample {public static void main(String[] args) {Deque<String> stack = new ArrayDeque<>();stack.push("Apple");stack.push("Banana");stack.push("Cherry");System.out.println("ArrayDeque as Stack: " + stack);String top = stack.pop();System.out.println("Popped element: " + top);System.out.println("Stack after pop: " + stack);}
    }
    

    输出

    ArrayDeque as Stack: [Cherry, Banana, Apple]
    Popped element: Cherry
    Stack after pop: [Banana, Apple]
    

2. List 实现类的选择依据

选择合适的 List 实现类取决于具体的使用场景和性能需求。以下是一些常见的选择依据:

  • 需要快速的随机访问

    • 选择ArrayList
    • 理由ArrayList 基于动态数组,实现了 O(1) 时间复杂度的随机访问。
  • 需要频繁的插入和删除操作,特别是在列表中间

    • 选择LinkedList
    • 理由LinkedList 基于双向链表,在已知位置的插入和删除操作时间复杂度为 O(1)。
  • 需要线程安全的列表

    • 选择VectorCopyOnWriteArrayList
    • 理由
      • Vector:适用于需要同步访问且写操作较多的场景。
      • CopyOnWriteArrayList:适用于读多写少的并发场景。
  • 需要作为堆栈或队列使用

    • 选择Deque 的实现类(如 ArrayDeque
    • 理由Deque 提供了比 Stack 更灵活和高效的堆栈和队列操作。

3. List 实现类的性能对比

3.1 ArrayListLinkedList

特性ArrayListLinkedList
随机访问快速(O(1))较慢(O(n))
插入和删除末尾插入和删除较快(O(1)),中间位置较慢(O(n))快速(O(1))
内存使用较低(仅存储元素)较高(存储元素及前后节点的引用)
迭代性能良好良好
适用场景需要频繁随机访问的场景需要频繁插入和删除的场景

3.2 VectorCopyOnWriteArrayList

特性VectorCopyOnWriteArrayList
同步性方法级别同步基于写时复制的同步机制
性能较低(由于同步开销)适用于读多写少的场景
迭代安全性在迭代期间修改会抛出 ConcurrentModificationException迭代期间修改不会影响当前迭代
适用场景需要线程安全且写操作频繁的场景需要线程安全且读操作频繁的场景

4. List 接口的常用方法

以下是 List 接口的一些常用方法及其说明:

方法描述
add(E e)在列表末尾添加一个元素。
add(int index, E element)在指定位置插入一个元素。
get(int index)返回指定位置的元素。
set(int index, E element)替换指定位置的元素。
remove(int index)移除指定位置的元素。
remove(Object o)移除第一个匹配的元素。
size()返回列表中的元素个数。
isEmpty()检查列表是否为空。
contains(Object o)检查列表是否包含指定元素。
clear()移除列表中的所有元素。
indexOf(Object o)返回首次出现指定元素的索引,如果不存在则返回 -1。
lastIndexOf(Object o)返回最后一次出现指定元素的索引,如果不存在则返回 -1。
subList(int fromIndex, int toIndex)返回列表的一个子视图,包含从 fromIndex(包含)到 toIndex(不包含)的元素。

4.1 示例:List 的常用操作

import java.util.List;
import java.util.ArrayList;public class ListMethodsExample {public static void main(String[] args) {List<String> fruits = new ArrayList<>();// 添加元素fruits.add("Apple");fruits.add("Banana");fruits.add("Cherry");fruits.add("Date");fruits.add("Elderberry");System.out.println("Initial List: " + fruits);// 插入元素fruits.add(2, "Coconut");System.out.println("After inserting Coconut at index 2: " + fruits);// 获取元素String fruitAt3 = fruits.get(3);System.out.println("Element at index 3: " + fruitAt3);// 修改元素fruits.set(1, "Blueberry");System.out.println("After setting index 1 to Blueberry: " + fruits);// 删除元素(按索引)fruits.remove(4);System.out.println("After removing element at index 4: " + fruits);// 删除元素(按对象)fruits.remove("Date");System.out.println("After removing 'Date': " + fruits);// 查询操作System.out.println("List size: " + fruits.size());System.out.println("List contains 'Apple': " + fruits.contains("Apple"));System.out.println("List contains 'Date': " + fruits.contains("Date"));// 获取子列表List<String> subFruits = fruits.subList(1, 3);System.out.println("Sublist from index 1 to 3: " + subFruits);// 清空列表fruits.clear();System.out.println("After clearing, is list empty? " + fruits.isEmpty());}
}

输出

Initial List: [Apple, Banana, Cherry, Date, Elderberry]
After inserting Coconut at index 2: [Apple, Banana, Coconut, Cherry, Date, Elderberry]
Element at index 3: Cherry
After setting index 1 to Blueberry: [Apple, Blueberry, Coconut, Cherry, Date, Elderberry]
After removing element at index 4: [Apple, Blueberry, Coconut, Cherry, Elderberry]
After removing 'Date': [Apple, Blueberry, Coconut, Cherry, Elderberry]
List size: 5
List contains 'Apple': true
List contains 'Date': false
Sublist from index 1 to 3: [Blueberry, Coconut]
After clearing, is list empty? true

5. List 与其他集合的对比

5.1 List vs Set

特性ListSet
元素重复性允许重复元素不允许重复元素
元素顺序保持元素的插入顺序,并支持按索引访问一般不保证元素的顺序(某些实现如 LinkedHashSet 保持插入顺序,TreeSet 按自然顺序或自定义顺序排序)
实现类ArrayListLinkedListVectorHashSetLinkedHashSetTreeSet
适用场景需要有序且可重复的元素集合需要确保元素唯一性且不关心顺序(或有特定顺序要求)

5.2 List vs Queue

特性ListQueue
元素访问方式支持按索引访问元素主要支持FIFO(先进先出)或其他特定的访问顺序
常用实现类ArrayListLinkedListLinkedListPriorityQueueArrayDeque
适用场景需要按任意顺序访问和操作元素需要按特定顺序处理元素,如任务调度、消息队列等

6. 线程安全的 List 实现

在多线程环境下,选择合适的 List 实现类和同步机制非常重要,以确保数据的一致性和避免并发问题。

6.1 使用 Collections.synchronizedList

通过 Collections.synchronizedList 方法可以将任何 List 实现类包装为线程安全的列表。

  • 示例

    import java.util.List;
    import java.util.ArrayList;
    import java.util.Collections;public class SynchronizedListExample {public static void main(String[] args) {List<String> syncList = Collections.synchronizedList(new ArrayList<>());syncList.add("Apple");syncList.add("Banana");syncList.add("Cherry");// 迭代时需要手动同步synchronized (syncList) {for (String fruit : syncList) {System.out.println(fruit);}}}
    }
    

6.2 使用 CopyOnWriteArrayList

CopyOnWriteArrayList 是一个线程安全的 List 实现,适用于读多写少的并发场景。

  • 示例

    import java.util.List;
    import java.util.concurrent.CopyOnWriteArrayList;public class CopyOnWriteArrayListThreadSafeExample {public static void main(String[] args) {List<String> cowList = new CopyOnWriteArrayList<>();cowList.add("Apple");cowList.add("Banana");cowList.add("Cherry");// 迭代时无需额外同步for (String fruit : cowList) {System.out.println(fruit);}}
    }
    

6.3 性能考虑

  • Collections.synchronizedList

    • 优点:适用于需要全面同步的场景。
    • 缺点:需要手动同步迭代操作,可能导致性能瓶颈。
  • CopyOnWriteArrayList

    • 优点:读操作无需同步,迭代时不会抛出 ConcurrentModificationException
    • 缺点:写操作开销较大,每次写操作都会复制整个数组。

7. List 的泛型与类型安全

List 接口是泛型接口,可以指定存储的元素类型,从而在编译时提供类型安全,避免类型转换错误。

7.1 使用泛型的优势

  • 类型安全:在编译时检查元素类型,避免运行时类型错误。

  • 无需类型转换:获取元素时无需进行显式的类型转换。

  • 示例

    import java.util.List;
    import java.util.ArrayList;public class GenericListExample {public static void main(String[] args) {List<String> stringList = new ArrayList<>();stringList.add("Hello");stringList.add("World");// stringList.add(123); // 编译错误for (String str : stringList) {System.out.println(str.toUpperCase());}}
    }
    

7.2 未使用泛型的风险

如果不使用泛型,List 将存储 Object 类型,可能导致运行时类型错误,需要进行类型转换。

  • 示例

    import java.util.List;
    import java.util.ArrayList;public class RawListExample {public static void main(String[] args) {List list = new ArrayList();list.add("Hello");list.add(123); // 允许添加不同类型的元素for (Object obj : list) {String str = (String) obj; // 可能抛出 ClassCastExceptionSystem.out.println(str.toUpperCase());}}
    }
    

    输出

    HELLO
    Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Stringat RawListExample.main(RawListExample.java:10)
    

8. 综合示例:List 的各种操作

以下是一个综合示例,展示了 List 的常用操作,包括添加、插入、删除、修改、查询和遍历等。

import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;public class ComprehensiveListExample {public static void main(String[] args) {// 创建一个 ArrayListList<String> fruits = new ArrayList<>();// 添加元素fruits.add("Apple");fruits.add("Banana");fruits.add("Cherry");fruits.add("Date");fruits.add("Elderberry");System.out.println("Initial List: " + fruits);// 插入元素fruits.add(2, "Coconut");System.out.println("After inserting Coconut at index 2: " + fruits);// 获取元素String fruitAt3 = fruits.get(3);System.out.println("Element at index 3: " + fruitAt3);// 修改元素fruits.set(1, "Blueberry");System.out.println("After setting index 1 to Blueberry: " + fruits);// 删除元素(按索引)fruits.remove(4);System.out.println("After removing element at index 4: " + fruits);// 删除元素(按对象)fruits.remove("Date");System.out.println("After removing 'Date': " + fruits);// 查询操作System.out.println("List size: " + fruits.size());System.out.println("List contains 'Apple': " + fruits.contains("Apple"));System.out.println("List contains 'Date': " + fruits.contains("Date"));// 获取子列表List<String> subFruits = fruits.subList(1, 3);System.out.println("Sublist from index 1 to 3: " + subFruits);// 遍历列表(使用增强的 for 循环)System.out.println("Iterating using enhanced for loop:");for (String fruit : fruits) {System.out.println(fruit);}// 遍历列表(使用 Iterator)System.out.println("Iterating using Iterator:");Iterator<String> iterator = fruits.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}// 使用 Lambda 表达式和 forEach 方法遍历System.out.println("Iterating using forEach and Lambda:");fruits.forEach(fruit -> System.out.println(fruit));// 清空列表fruits.clear();System.out.println("After clearing, is list empty? " + fruits.isEmpty());}
}

输出

Initial List: [Apple, Banana, Cherry, Date, Elderberry]
After inserting Coconut at index 2: [Apple, Banana, Coconut, Cherry, Date, Elderberry]
Element at index 3: Cherry
After setting index 1 to Blueberry: [Apple, Blueberry, Coconut, Cherry, Date, Elderberry]
After removing element at index 4: [Apple, Blueberry, Coconut, Cherry, Elderberry]
After removing 'Date': [Apple, Blueberry, Coconut, Cherry, Elderberry]
List size: 5
List contains 'Apple': true
List contains 'Date': false
Sublist from index 1 to 3: [Blueberry, Coconut]
Iterating using enhanced for loop:
Apple
Blueberry
Coconut
Cherry
Elderberry
Iterating using Iterator:
Apple
Blueberry
Coconut
Cherry
Elderberry
Iterating using forEach and Lambda:
Apple
Blueberry
Coconut
Cherry
Elderberry
After clearing, is list empty? true

9. 性能优化与最佳实践

9.1 预设容量

在已知大致元素数量时,可以在创建 ArrayList 时预设初始容量,以减少扩容次数,提升性能。

  • 示例

    List<String> largeList = new ArrayList<>(1000); // 预设初始容量为 1000
    

9.2 使用接口类型声明

在声明变量时,使用接口类型(如 List)而不是具体实现类(如 ArrayList),提高代码的灵活性和可维护性。

  • 示例

    List<String> list = new ArrayList<>();
    // 未来可以轻松切换为其他实现类,如 LinkedList
    list = new LinkedList<>();
    

9.3 避免频繁的自动装箱与拆箱

对于存储基本数据类型的 List,使用其包装类(如 IntegerDouble)时,应注意避免频繁的自动装箱与拆箱,以提升性能。

  • 示例

    List<Integer> numbers = new ArrayList<>();
    for (int i = 0; i < 1000; i++) {numbers.add(i); // 自动装箱
    }
    

    优化:如果需要大量的数值数据处理,考虑使用 IntStream 或其他专用的数据结构。

10. 总结

List 接口在 Java 集合框架中占据重要地位,提供了有序、可重复的元素集合。通过了解不同 List 实现类的特性、性能和适用场景,可以在项目中选择最合适的实现类,从而优化代码的性能和可维护性。以下是关键要点:

  • 选择合适的实现类

    • ArrayList:适用于需要快速随机访问和较少插入删除操作的场景。
    • LinkedList:适用于需要频繁插入和删除操作,尤其是在列表中间位置的场景。
    • Vector:适用于需要线程安全的场景,但由于同步开销,性能较低。
    • CopyOnWriteArrayList:适用于读多写少的并发场景。
  • 使用泛型:提高类型安全,避免运行时类型错误。

  • 遵循接口编程:使用接口类型声明变量,增强代码的灵活性和可维护性。

  • 性能优化:根据具体需求预设容量,避免不必要的装箱与拆箱。

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

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

相关文章

信号与系统初识---信号的分类

文章目录 0.引言1.介绍2.信号的分类3.关于周期大小的求解4.实信号和复信号5.奇信号和偶信号6.能量信号和功率信号 0.引言 学习这个自动控制原理一段时间了&#xff0c;但是只写了一篇博客&#xff0c;其实主要是因为最近在打这个华数杯&#xff0c;其次是因为在补这个数学知识…

解决winodws server iis 下的php mkdir(): Permission denied 问题

这个问题报错原因是权限不够&#xff0c;解决办法如下&#xff1a; 1.在php安装目录下&#xff0c;打开配置文件php.ini 把upload_tmp_dir 前面的分号去掉。 2.给上传的文件夹添加权限 在网站的相应目录&#xff0c;比如目录为tmp&#xff0c;添加IUSR用户&#xff0c;并给所…

如何在本地部署大模型并实现接口访问( Llama3、Qwen、DeepSeek等)

如何在本地部署大模型并实现接口访问&#xff08; Llama3、Qwen、DeepSeek等&#xff09; 如何在本地部署大模型并实现接口访问&#xff08; Llama3、Qwen、DeepSeek等&#xff09;模型地址模型下载模型部署指定显卡运行app.py 运行环境requirements 调用接口代码调用 结语 如何…

数据库增量备份和全量备份

数据库增量备份和全量备份 1.修改配置 首先打开配置文件my.ini 添加以下配置 #log-bin"JSSM-20230617FY-bin" log-bin"mysql-bin"# Server Id. server-id1#指令指定写入二进制日志的事件格式 binlog_formatMIXED添加完之后对MySQL服务进行重启 重启之后…

用 Python 从零开始创建神经网络(十九):真实数据集

真实数据集 引言数据准备数据加载数据预处理数据洗牌批次&#xff08;Batches&#xff09;训练&#xff08;Training&#xff09;到目前为止的全部代码&#xff1a; 引言 在实践中&#xff0c;深度学习通常涉及庞大的数据集&#xff08;通常以TB甚至更多为单位&#xff09;&am…

使用 Debug 类的 Assert 方法查找 C# 中的错误

Debug类提供了几种用于调试代码的方法。其Assert方法采用布尔值&#xff0c;如果值为false则抛出异常。第二个参数给出异常应显示的错误消息。如果在调试器中运行时断言失败&#xff0c;您可以选择打开调试器到抛出异常的 Debug.Assert语句。 通常&#xff0c;您使用Debug.Ass…

Windows图形界面(GUI)-QT-C/C++ - Qt图形绘制详解

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 Qt绘图基础 QPainter概述 基本工作流程 绘图事件系统 paintEvent事件 重绘机制 文字绘制技术 基本文字绘制 ​编辑 高级文字效果 基本图形绘制 线条绘制 ​编辑 形状绘制 …

《计算机网络》课后探研题书面报告_网际校验和算法

网际校验和算法 摘 要 本文旨在研究和实现网际校验和&#xff08;Internet Checksum&#xff09;算法。通过阅读《RFC 1071》文档理解该算法的工作原理&#xff0c;并使用编程语言实现网际校验和的计算过程。本项目将对不同类型的网络报文&#xff08;包括ICMP、TCP、UDP等&a…

浅谈计算机网络02 | SDN控制平面

计算机网络控制平面 一、现代计算机网络控制平面概述1.1 与数据平面、管理平面的关系1.2 控制平面的发展历程 二、控制平面的关键技术剖析2.1 网络层协议2.1.1 OSPF协议2.1.2 BGP协议 2.2 SDN控制平面技术2.2.1 SDN架构与原理2.2.2 OpenFlow协议2.2.3 SDN控制器 一、现代计算机…

网络层协议-----IP协议

目录 1.认识IP地址 2.IP地址的分类 3.子网划分 4.公网IP和私网IP 5.IP协议 6.如何解决IP地址不够用 1.认识IP地址 IP 地址&#xff08;Internet Protocol Address&#xff09;是指互联网协议地址。 它是分配给连接到互联网的设备&#xff08;如计算机、服务器、智能手机…

我国无人机新增实名登记110.3 万架,累计完成飞行2666万小时

据央视新闻从中国民航局了解到&#xff0c;2024 年我国全年新增通航企业 145 家、通用机场 26 个&#xff0c;颁发无人驾驶航空器型号合格证 6 个、新增实名登记无人机 110.3 万架&#xff0c;无人机运营单位总数超过 2 万家&#xff0c;累计完成无人机飞行 2666 万小时&#x…

【Linux】正则表达式

正则表达式是一种可供Linux工具过滤文本的自定义模板&#xff0c;Linux工具&#xff08;如sed、gawk&#xff09;会在读取数据时使用正则表达式对数据进行模式匹配。 正则表达式使用元字符来描述数据流中的一个或多个字符。它是由正则表达式引擎实现的。正则表达式引擎是一种底…

数据平台浅理解

定义 数据平台架构是指用于收集、存储、处理和分析数据的一系列组件、技术和流程的整体架构设计。它就像是一个复杂的数据生态系统的蓝图&#xff0c;旨在高效地管理数据从产生源头到产生价值的整个生命周期。 主要层次 数据源层 这是数据的起点&#xff0c;包含各种类型的数据…

Python入门10:高阶函数

一、什么是高阶函数 1.1、高阶函数的概念和作用&#xff1a; 高阶函数是指 接受函数作为参数 或者 返回函数 作为结果的函数。它在函数式编程中是一个重要概念&#xff08;函数式编程&#xff08;Functional Programming &#xff0c; FP &#xff09;是一 种编程范式&#xf…

浅谈云计算12 | KVM虚拟化技术

KVM虚拟化技术 一、KVM虚拟化技术基础1.1 KVM虚拟化技术简介1.2 KVM虚拟化技术架构1.2.1 KVM内核模块1.2.2 用户空间工具&#xff08;QEMU、Libvirt等&#xff09; 二、KVM虚拟化技术原理2.1 硬件辅助虚拟化2.2 VMCS结构与工作机制 三、KVM虚拟化技术面临的挑战与应对策略3.1 性…

GO:GO程序如何处理缓存加载和大数据缓存

如果我们会在程序启动时&#xff0c;需要加载所有数据&#xff0c;最简单的方式就是程序启动&#xff0c;通过轮训从数据库拉取所有数据&#xff0c;并写入到本地缓存中。 问题&#xff1a;数据量较大的时候&#xff0c;程序加载慢&#xff0c;启动时间长&#xff0c;遇到问题不…

【优选算法篇】:分而治之--揭秘分治算法的魅力与实战应用

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;优选算法篇–CSDN博客 文章目录 一.什么是分治算法1.分治算法的基本概念2.分治算法的三个步…

OpenAI Whisper:语音识别技术的革新者—深入架构与参数

当下语音识别技术正以前所未有的速度发展&#xff0c;极大地推动了人机交互的便利性和效率。OpenAI的Whisper系统无疑是这一领域的佼佼者&#xff0c;它凭借其卓越的性能、广泛的适用性和创新的技术架构&#xff0c;正在重新定义语音转文本技术的规则。今天我们一起了解一下Whi…

python+playwright自动化测试(一):安装及简单使用,截图录屏

目录 基本使用 浏览器调用 启用浏览器 创建窗口对象 访问URL 页面的刷新、返回、前进 关闭 截图、录屏、保存pdf 截图 录屏 保存为pdf 设置窗口大小 调试模式 手机模式及new_context的更多参数 手机模式 new_context的其他参数 设置语言和时区 设置和修改位置…

初识C++(二)

六、引用 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同一块内存空间。 通俗地讲&#xff0c;可以理解为一个人能够拥有多个称呼&#xff0c;这些所有的称呼都是表示这一…