javaSE(List集合ArrayList实现类与LinkedList实现类)day15

目录

 

List集合:

1、ArrayList类:

(1)数据结构:

(2)扩容机制

(3)ArrayList的初始化:

(4)ArrayList的添加元素方法

(5)快速生成集合列表

(6)集合的查看操作:

(7)集合的遍历:

(8)删除集合元素:

(9)修改元素:

 (10)其他方法:

(11)ArrayList的优缺点:

2、LinkedList类:

(1)数据结构:

(2)初始化:

(3)LinledList的常用方法:

(4)LinkedList的遍历:

(5)LinkList的优缺点:

二、ArrayList与LinkList的异同:

1、存储方式:

2、索引/指针:

3、增删元素本质:

4、随机访问性能:

5、适用场景:

总结:若需频繁通过索引访问元素(如查询操作多),优先选择 ArrayList。若需频繁在列表中间进行插入 / 删除操作,优先选择 LinkedList。


 

List集合:

        集合就是“由若干个确定的元素所构成的整体”,在程序中,一般代表保存若干个元素(数据)的某种容器类。在Java中,如果一个Java对象可以在内部持有(保存)若干其他Java对象,并对外提供访问接口,我们把这种Java对象的容器称为集合。很显然,Java的数组也可以看作是一种集合。

         List集合:在集合类中,List是最基础的一种集合:它是一种有序列表。List的行为和数组几乎完全相同:List内部按照放入元素的先后顺序存放,每个元素都可以通过索引确定自己的位置,List的索引和数组一样,从0开始。

1、ArrayList类:Arraylist 是List<E>接口的实现类,实现了List<接口>等一系列的方法,可以创建单列集合对象,并且ArrayList在内存中分配连续的空间,实现了长度可变的动态数组,有序集合(插入的顺序==输出的顺序),在进行插入删除时,休要对后面的每一个元素进行操作(前移或者后移)。

(1)数据结构:ArrayList的底层是基于数组实现的,随着元素的增加而动态扩容,每次扩容为原来的~1.5倍,存在在一定的空间浪费,推荐使用有参初始化,避免空间的浪费,适用于连续性遍历读多写少的场景。

(2)扩容机制:ArrayList的底层以数组存储,无参构造创建对象时默认初始容量为10,当调用add()方法添加元素时,首先会检查容量是否充足,充足,直接添加元素,如果当arraylist对象的size == elementData.length时,则除法扩容。遵循 新容量=旧容量+旧容量/2(扩容为元的1.5倍),若新容量仍小于所需最小容量,则直接使用所需最小容量作为新容量。再通过Arrays。copyOf()方法创建一个新的更大的数组,将原来的数组元素复制到新数组中,原数组elementData指向新数组,完成扩容。 

private void grow(int minCapacity) {int oldCapacity = elementData.length;// 扩容 1.5 倍int newCapacity = oldCapacity + (oldCapacity >> 1); // 若新容量仍不足,直接使用所需最小容量if (newCapacity - minCapacity < 0)newCapacity = minCapacity;// 复制到新数组elementData = Arrays.copyOf(elementData, newCapacity);
}

(3)ArrayList的初始化:

    (1.1)无参初始化:ArrayList<String> arrayList = new ArrayList<>();

    (1.2)单参初始化:ArrayList<String> arrayList1 = new ArrayList<>(20);

    (1.3)传入Collection集合对象初始化(Arrays.asList()为工具类提供的快速传入元素的方法):ArrayList<String> arrayList2 = new ArrayList<>(Arrays.asList("张三","李四")); 

(4)ArrayList的添加元素方法:

(4.1)boolean add(E,e)添加元素:添加指定元素到集合尾部.

(4.2)void add(int index,E element)添加新元素到集合指定的下标位置

(4.3)boolean addAll(Collection<?extendsE>c) 添加集合C内所有元素到当前集台

(4.4)boolean addAll(int index,Collection<?extends E>c):从指定的位置开始,将指定collection 中的所有元素插入到此列表中

        ArrayList<String> arrayList=new ArrayList<>();boolean b1 = arrayList.add("g关羽");boolean b2 = arrayList.add("z张飞");boolean b3 = arrayList.add("d大乔");boolean b4 = arrayList.add("g关");System.out.println("第一次添加:"+ b1);System.out.println("第二次添加:"+ b4);arrayList.add(2,"l李白");System.out.println(arrayList);List<String> list = Arrays.asList("a阿拉善","b北京","d丹东");boolean b6 =arrayList.addAll(0,list);System.out.println("添加集合是否成功:"+b6);System.out.println(arrayList);

(5)快速生成集合列表:使用工具类Arrays.asList()方法快速生成集合:List<String> list= Arrays.asList("李四","王麻子","王麻子","王五");

(6)集合的查看操作:

(6.1)int size() 查看集合的长度,具体元素的个数

(6.2)E get(int index):获取集合指定下标的元素

  (6.3)   int indexOf(Object c)查找指定元素的下标,如果不存在返回-1;

(6.4)boolean contains(object c)  判断集合中是否存在指定元素

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

(6.6)List<E> subList(int fromIndex, int toIndex) 截取指定下标的元素:

(6.7)boolean equals(object o) 判断两个集合的内容是否相同

        ArrayList<String> arrayList = new ArrayList<>();arrayList.add("张三");System.out.println(arrayList);//使用工具类生成List集合List<String> list= Arrays.asList("李四","王麻子","王麻子","王五");arrayList.addAll(list);System.out.println("集合的内容为:"+arrayList);//查看//1、int size() 查看集合的长度,具体元素的个数System.out.println("长度:"+arrayList.size());//2、E get(int index)String item =arrayList.get(0);System.out.println("首元素:"+item);System.out.println("尾元素:"+arrayList.get(arrayList.size()-1));//3、int indexOf(Object c)查找指定元素的下标,如果不存在返回-1;int index = arrayList.indexOf("王麻子");System.out.println("元素下标为:"+index);//4.boolean contains(object c)boolean b = arrayList.contains("王麻子");System.out.println("元系是否存在:"+b);//5.boolean isEmpty()boolean b1 = arrayList.isEmpty();System.out.println("是否为空:"+b1);//16.截取集合List<String> subArrayList = arrayList.subList(0,arrayList.size());System.out.println("载取后的集合为:"+subArrayList);//7.boolean equals(object o)boolean b2 =arrayList.equals(subArrayList);System.out.println("集合和截取后的集合是否相等:"+b2);

(7)集合的遍历:

(7.1)for 循环遍历  

(7.2)增强for(foreach)遍历

(7.3)Iterator<E> iterator():普通迭代器遍历

(7.4)ListIterator<E> listIterator() 和ListIterator<E> listIterator(int index)(带参数的可以逆序遍历)List迭代器遍历

package com.yuan.arraylistclass;import java.util.*;public class Demo05 {public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();//使用工具类生成List集合arrayList.addAll(Arrays.asList("张三", "李四", "王麻子", "王麻子", "王五"));System.out.println("集合的内容为:" + arrayList);//遍历集合:// 1.forfor (int i = 0; i < arrayList.size(); i++) {System.out.print(arrayList.get(i) + "");}System.out.println();//2.foreachfor (String str : arrayList) {System.out.print(str + "__");}System.out.println();//3、迭代器//3.1获取迭代器对象:Iterator<String> itor = arrayList.iterator();//判断是否有下一个while (itor.hasNext()) {//获取下一个String item = itor.next();System.out.println(item + "**");}System.out.println();//3.2获跟list送代器对象ListIterator<String> listIterator = arrayList.listIterator(arrayList.size());//判前是否有上一个元素while (listIterator.hasPrevious()) {//获取上一个String item = listIterator.previous();System.out.println(item);}}
}

(8)删除集合元素:

(8.1)E remove(int index):根据指定索引删除元素并把删除的元素返回.

(8.2)boolean remove(Object o):从集合中删除指定的元素,删除一个就返回

(8.3)void clear():删除集合中的所有元素,此集合仍旧存在,集合元素长度变0

(8.4)boolean removeAll(Collection<?> c)--- 差集:从集合中删除一个指定的集合元素:
删除A集合中存在B集合中的所有相同的元素,如果有删除返回True,谁调用操作的是就是谁

(8.5)boolean retainAll(Collection<?> c)   --交集:保留集合A和集合B中相同的元素,删除不同的元素,谁调用操作的是就是谁

        ArrayList<String> arrayList = new ArrayList<>();//使用工具类生成List集合arrayList.addAll(Arrays.asList("张三", "李四", "王麻子", "王麻子", "王五"));System.out.println("集合的内容为:" + arrayList);//E remove(int index):根据指定索引删除元素并把删除的元素返回String item = arrayList.remove( 0);System.out.println("删除的元素为:"+item);//boolean remove(Object o):从集合中删除指定的元素,删除一个就返回boolean b= arrayList.remove("王五");System.out.println("删除的元素是否成功:"+b);//void clear():删除集合中的所有元素,此集合仍旧存在,集合元素长度变0arrayList.clear();System.out.println("操作后的集合为:"+arrayList);
       //交集差集: ArrayList<String> list1 =new ArrayList<>();ArrayList<String> list2 = new ArrayList<>();list1.addAll(Arrays.asList("朱元璋","朱祁镇","朱祁镇","朱棣","朱高炽"));list2.addAll(Arrays.asList("孙皇后","朱祁镇","朱棣","李时珍","郑和"));System.out.println("list1:"+list1);System.out.println("list2:"+list2);//boolean retainAll(Collection<?> c)  --交集 谁调用谁修改
//        boolean b=list1.retainAll(list2);
//        System.out.println(b);
//        System.out.println("list1和list2的交集:"+list1);//boolean removeAll(Collection<?> c)  --差集 谁调用谁修改boolean b1=list1.removeAll(list2);System.out.println(b1);System.out.println("list1和list2的差集:"+list1);  

(9)修改元素:oldE    set(int index, E element):用指定的元素替代此列表中指定位置上的元素。

String str = arrayList.set(2,"小敏");

 (10)其他方法:

(10.1)Object clone() 克隆一个集合,得到的一个长度,个数,内容,顺序完全一致的集合,复制了一份

  (10.2) list.sort()对list中的内容进行排序

  (10.3) object[]toArray():将集合转为object类型数组

(10.4)T[] toArray(T[] a),返回的数组的长度以集合对象或者传入的参数的长度较长的那个为准。

package com.yuan.arraylistclass;import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;public class Demo08 {public static void main(String[] args) {//Object clone() 克隆一个集合,得到的一个长度,个数,内容,顺序完全一致的集合,复制了一份ArrayList<String> list1=new ArrayList<>();list1.addAll(Arrays.asList("shh孙皇后","zqz朱祁镇","zd朱棣","lsz李时珍","zh郑和"));//克隆Object obj=list1.clone();if(obj instanceof ArrayList){ArrayList<String>cloneList=(ArrayList<String>)obj;System.out.println(cloneList);}//list.sort()对list中的内容进行排序list1.sort(new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {//先按照字符串的长度排,长度相同按内容排if (o1.length() == o2.length())return o1.compareTo(o2);return o1.length() - o2.length();}});System.out.println("排序后的结果:"+list1);//object[]toArray()Object[] objs =list1.toArray();System.out.println("转数组后:"+Arrays.toString(objs));//T[] toArray(T[] a),返回的数组的长度以集合对象或者传入的参数的长度较长的那个为准String[]  strs =list1.toArray(new String[10]);System.out.println(Arrays.toString(strs));}
}

(11)ArrayList的优缺点:

优点:查效率高,增加和删除的效率比较低   

缺点:添加和删除需要大量移动元素效率,按照内容查询效率低,线程不安全

2、LinkedList类:

        Linkedlist 是List<E>接口的实现类,实现了List<接口>等一系列的方法,可以创建单列集合对象,并且LinkedList在底层是双链存储方式,以Node<E> 节点的方式进行存储Node(Node<E> prev, E element, Node<E> next):数据域:存储实际元素(E item)。前驱指针:指向当前节点的前一个节点(Node<E> prev)。后继指针:指向当前节点的后一个节点(Node<E> next)。在进行插入删除操作时,改变的只有相邻位置的指向,对其他元素不进行操作。

(1)数据结构:LinkedList 有三个成员变量:first :指代的是头节点,last:指代的尾节点,当链表为空时,first 和 last 均为 null。LinkedList可以双向访问,通过任意节点可快速找到其前驱和后继节点,便于双向遍历。增删元素时只需修改节点的指针指向,无需移动大量元素(与数组相比)。节点在内存中可分散存储,无需连续空间,避免数组扩容的性能开销(与ArrayList相比不需要扩容操作)。适合数据频繁的添加和删除操作,写多读少的场景。

(2)初始化:

(2.1)无参初始化:LinkedList<String> LinkedList= new LinkedList<>();

(2.2)传入Collection集合对象初始化(Arrays.asList()为工具类提供的快速传入元素的方法):LinkedList<String> linkedlist= new LinkedList<>(Arrays.asList("张三","李四")); 

        LinkedList<String> linkedlist= new LinkedList<>();//使用工具类生成List集合linklist.addAll(Arrays.asList("张三", "李四", "王麻子", "王麻子", "王五"));System.out.println("集合的内容为:" + linklist);

(3)LinledList的常用方法:

和ArrayListdou继承自List<E>接口,拥有list<E>的所有方法,跟ArrayList的用法一样,除此之外还有专属有LinkedList的方法。

(3.1)void addFirst(E e):在链表头部插入元素

(3.2)void addLast(E e):在链表尾部插入元素(等价于 add()

(3.3)E getFirst():获取头部元素(若为空则抛出异常)

(3.4)E getLast():获取尾部元素(若为空则抛出异常)

(3.5)E removeFirst():删除并返回头部元素(若为空则抛出异常)

(3.6)E removeLast():删除并返回尾部元素(若为空则抛出异常)

 //1、创建LinkedList集合对象LinkedList<String> list = new LinkedList<>();//2、添加元素list.add("孙答应");list.add(0, "狂徒");list.addAll(Arrays.asList("娘娘", "公公"));list.addAll(1, Arrays.asList("小主", "一文红"));list.addFirst("甄嬛");list.addLast("胖橘");System.out.println(list);//2、获取元素String item =list.get(4);System.out.println("获取元素"+item);System.out.println("首元素"+list.getFirst());System.out.println("尾元素"+list.getLast());//3、删除String item1 =list.remove(); //删除首元素System.out.println("删除首元素"+item1);System.out.println("删除首元素"+list.removeFirst());System.out.println("删除尾元素"+list.removeLast());

(4)LinkedList的遍历:

(4.1)   for 循环遍历  ---不推荐,链表使用for循环遍历,每遍历一个元素都需要从头开始查找。效率低。

(4.2)增强for(foreach)遍历

(4.3)Iterator<E> iterator():普通迭代器遍历

(4.4)ListIterator<E> listIterator() 和ListIterator<E> listIterator(int index)(带参数的可以逆序遍历)List迭代器遍历

  //1、创建LinkedList集合对象LinkedList<String> list = new LinkedList<>();//2、添加元素list.add("孙答应");list.add(0, "狂徒");list.addAll(Arrays.asList("娘娘", "公公"));list.addAll(1, Arrays.asList("小主", "一文红"));list.addFirst("甄嬛");list.addLast("胖橘");System.out.println(list);//2、获取元素String item =list.get(4);System.out.println("获取元素"+item);System.out.println("首元素"+list.getFirst());System.out.println("尾元素"+list.getLast());//3、删除String item1 =list.remove(); //删除首元素System.out.println("删除首元素"+item1);System.out.println("删除首元素"+list.removeFirst());System.out.println("删除尾元素"+list.removeLast());//4、遍历//---for循环  --不推荐
//        for (int i = 0; i < list.size(); i++) {
//            System.out.println(list.get(i));
//        }//----foreachfor (String str:list) {System.out.println(str);}//----普通迭代器Iterator<String> itor=list.iterator();while (itor.hasNext()){System.out.println(itor.next()+"-");}//----List迭代器ListIterator<String> listIterator=list.listIterator(3);  //从下表3开始从后往前遍历while (listIterator.hasPrevious()){System.out.println(listIterator.previous()+"*");}

(5)LinkList的优缺点:

优点:插入、删除元素效率高   

缺点:遍历和随机访问效率低下

二、ArrayList与LinkList的异同:

1、存储方式:

LinkedList:基于双向链表实现,节点通过指针连接,内存可不连续

ArrayList:   基于动态数组实现,需要连续的内存空间

2、索引/指针:

LinkedList:依赖节点的 prev/next 指针

ArrayList:    依赖数组索引(直接访问)

3、增删元素本质:

LinkedList:修改指针指向,增删只需修改指针,中间 / 头部操作效率高,需先定位节点。

ArrayList:    可能需要移动大量元素,在尾部增删效率高,但中间 / 头部增删需移动元素

4、随机访问性能:

LinkedList:差,需从表头 / 表尾遍历

ArrayList:    好,通过索引直接访问

5、适用场景:

LinkedList:读少写多

ArrayList:    读多写少

总结:若需频繁通过索引访问元素(如查询操作多),优先选择 ArrayList。若需频繁在列表中间进行插入 / 删除操作,优先选择 LinkedList。

 

         

 

 

 

 

 

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

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

相关文章

解决 WSL 中无法访问 registry-1.docker.io/v2/,无法用 docker 拉取 image

文章目录无法拉取docker镜像补充迁移 WSL 位置Install Docker无法拉取docker镜像 docker run hello-world Unable to find image hello-world:latest locally docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline excee…

【C++】简单学——list类

模拟实现之前需要了解的概念带头双向链表&#xff08;double-linked&#xff09;&#xff0c;允许在任何位置进行插入区别相比vector和string&#xff0c;多了这个已经没有下标[ ]了&#xff0c;因为迭代器其实才是主流&#xff08;要包头文件<list>&#xff09;方法构造…

Qt 国际化与本地化完整解决方案

在全球化的今天&#xff0c;软件支持多语言和本地化&#xff08;Internationalization & Localization&#xff0c;简称i18n & l10n&#xff09;已成为基本需求。Qt提供了一套完整的解决方案&#xff0c;帮助开发者轻松实现应用程序的国际化支持。本文将从原理到实践&a…

MNIST 手写数字识别模型分析

功能概述 这段代码实现了一个基于TensorFlow和Keras的MNIST手写数字识别模型。主要功能包括&#xff1a; 加载并预处理MNIST数据集构建一个简单的全连接神经网络模型训练模型并评估其性能使用训练好的模型进行预测保存和加载模型 代码解析 1. 导入必要的库 import matplot…

进阶系统策略

该策略主要基于价格动态分析,结合多种技术指标和数学计算来生成交易信号。其核心逻辑包括: 1. 价格极值计算:首先,策略计算给定周期(由`Var3`定义)内的最高价和最低价,分别存储在`Var12`和`Var13`中。这一步骤旨在捕捉价格的短期波动范围。 2. 相对位置计算:接着,策…

【Linux内核】Linux驱动开发

推荐书籍&#xff1a; 《Linux内核探秘&#xff1a;深入解析文件系统和设备驱动的架构与设计》 知识点 x86的IO地址空间和内存地址空间是独立的两套地址空间&#xff0c;并且使用不同的指令访问。MOV, IN, OUT。内存映射I/O可以将IO映射到内存。ARM等RISC采用统一编编址&#x…

MySQL用户管理(15)

文章目录前言一、用户用户信息创建用户修改密码删除用户二、数据库的权限MySQL中的权限给用户授权回收权限总结前言 其实与 Linux 操作系统类似&#xff0c;MySQL 中也有 超级用户 和 普通用户 之分 如果一个用户只需要访问 MySQL 中的某一个数据库&#xff0c;甚至数据库中的某…

react19相关问题和解答

目录 1. react19将ref放在了props中(不再需要 forwardRef),那么是不是可以通过ref获取子组件的全部变量了? 我的子组件的useImperativeHandle还需要定义吗? 1.1. ref 在 props 中的本质变化 1.2. 为什么不能访问全部变量? 2. In HTML,cannot be a descendant of. Thi…

Code Composer Studio:CCS 设置代码折叠

Code Composer Studio&#xff1a;设置代码折叠,可以按函数&#xff0c;if, 等把代码折叠起来。1.2.开启折叠选项3.开启后&#xff0c;如果文件已经打开&#xff0c;要关掉重新打开文件就可以开到折叠功能生效。

JMeter groovy 编译成.jar 文件

groovy 编译 一、windows 下手动安装Groovy 下载 Groovy 二进制包 前往官网&#xff1a;https://groovy.apache.org/download.html 下载 Binary release&#xff08; https://groovy.jfrog.io/ui/native/dist-release-local/groovy-zips/apache-groovy-sdk-4.0.27.zip &#xf…

使用maven-shade-plugin解决依赖版本冲突

项目里引入多个版本依赖时&#xff0c;最后只会使用其中一个&#xff0c;一般可以通过排除不使用的依赖处理&#xff0c;但是如果需要同时使用多个版本&#xff0c;可以使用maven-shade-plugin解决。以最典型的poi为例&#xff0c;poi版本兼容性很低&#xff0c;如果出现找不到…

[CH582M入门第十一步]DS18B20驱动

学习目标: 1、介绍DS18B20 2、学习单总线 3、学习DS18B20程序驱动一、DS18B20介绍 DS18B20 是一款由 Maxim Integrated(原Dallas Semiconductor) 推出的 数字温度传感器,以其单总线(1-Wire)通信协议、高精度和广泛应用而闻名。以下是其核心特点和应用介绍: 主要特性 数…

SGLang + 分布式推理部署DeepSeek671B满血版

部署设备&#xff1a;28A100 80G&#xff0c;两台机器&#xff0c;每台机器8张A100。 模型&#xff1a;deepseek-671B-int8 模型下载地址&#xff1a;https://huggingface.co/meituan/DeepSeek-R1-Block-INT8 模型参考&#xff1a; 1、SGLang Docker部署 github地址&#…

PCL 间接平差拟合球

目录 一、算法原理 1、计算流程 2、参考文献 二、代码实现 三、结果展示 本文由CSDN点云侠原创,首发于2025年7月24日。博客长期更新,本文最新更新时间为:2025年7月24日。 一、算法原理 1、计算流程 空间球方程: ( x − a ) 2 + ( y − b ) 2 + ( z − c ) 2 = R 2 (1) (…

基于 HAProxy 搭建 EMQ X 集群

负载均衡器&#xff08;LB&#xff09;负责分发设备的 MQTT 连接与消息到 EMQ X 集群&#xff0c;采用 LB 可以提高 EMQ X 集群可用性、实现负载平衡以及动态扩容。 HAProxy简介 HAProxy 是一款高性能的 开源负载均衡器 和 反向代理服务器&#xff0c;主要用于在多个服务器之…

RISC-V基金会Datacenter SIG月会圆满举办,探讨RAS、PMU性能分析实践和经验

一直以来&#xff0c;龙蜥社区在 RISC-V 生态建设中持续投入&#xff0c;并积极贡献上游社区。多位龙蜥社区成员在 RISC-V 国际基金会担任主席/副主席角色&#xff0c;与来自阿里云、阿里达摩院、中兴通讯、浪潮信息、中科院软件所、字节跳动、Google、 MIT、Akeana 等企业的专…

CloudComPy使用PyInstaller打包后报错解决方案

情况描述 笔者在spec文件中&#xff0c;datas变量设置如下。如果你的报错类似于“找不到cloudComPy”&#xff0c;先尝试如下的设置。 datas[(CloudCompare,cloudComPy)], 笔者在打包完成后&#xff0c;打开软件发现报错&#xff1a; from cloudComPy import* ModuleNotFoun…

node.js中的path模块

在 Node.js 中&#xff0c;path 模块提供了处理和操作文件路径的功能&#xff0c;其中 path.join 和 path.resolve 是两个常用的方法。它们在处理路径时有不同的行为和用途: 功能概述 path.join()&#xff1a; 该方法主要用于将多个路径片段拼接成一个完整的路径字符串。它会正…

将Scrapy项目容器化:Docker镜像构建的工程实践

引言&#xff1a;爬虫容器化的战略意义在云原生与微服务架构主导的时代&#xff0c;​​容器化技术​​已成为爬虫项目交付的黄金标准。据2023年分布式系统调查报告显示&#xff1a;92%的生产爬虫系统采用容器化部署容器化使爬虫环境配置时间​​减少87%​​Docker化爬虫的故障…

Unity × RTMP × 头显设备:打造沉浸式工业远控视频系统的完整方案

结合工业现场需求&#xff0c;探索如何通过大牛直播SDK打造可在 Pico、Quest 等头显设备中运行的 RTMP 低延迟播放器&#xff0c;助力构建沉浸式远程操控系统。 一、背景&#xff1a;沉浸式远程操控的新趋势 随着工业自动化、5G 专网、XR 技术的发展&#xff0c;远程操控正在从…