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
英文地址,請注明出處:http://en.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;遠程操控正在從…