Java基礎day15

目錄

一、Java集合簡介

1.什么是集合?

2.集合接口

3.小結

二、List集合

1.List集合簡介

三、ArrayList容器類

1.初始化

1.1無參初始化

1.2有參初始化

2.數據結構

3.常用方法

3.1增加元素

3.2查找元素

3.3 修改元素

3.4 刪除元素

3.5 其他方法

4.擴容機制

5.總結特點

四、LinkedList類

1.初始化

2.數據結構

3.常用方法

3.1增加元素

3.2查找元素

3.3修改元素

3.4刪除元素

3.5轉換為數組

3.6元素的遍歷

4.總結特點


一、Java集合簡介

1.什么是集合?

什么是集合?集合就是“由若干個確定的元素所構成的整體”,在程序中,一般代表保存若干個元素(數據)的某種容器類。在數學中,我們經常遇到集合的概念。例如:

有限集合:

????????一個班所有的同學構成的集合;

????????一個網站所有的商品構成的集合;

????????...

無限集合:

????????全體自然數集合:1,2,3,……

????????有理數集合;

????????實數集合;

????????...

為什么要在計算機中引入集合呢?這是為了便于處理一組類似的數據,例如:

????????計算所有同學的總成績和平均成績;

????????列舉所有的商品名稱和價格;

????????……

Java中,如果一個Java對象可以在內部持有(保存)若干其他Java對象,并對外提供訪問接口,我們把這種Java對象的容器稱為集合。很顯然,Java的數組也可以看作是一種集合:

String[] ss = new String[10]; // 可以持有10個String對象
ss[0] = "Hello"; // 可以放入String對象
String first = ss[0]; // 可以獲取String

既然Java提供了數組這種數據類型,可以充當集合,那么,我們為什么還需要其他集合類?這是因為數組有如下限制:

????????數組初始化后大小不可變;

????????數組只能按索引順序存取;

因此,我們需要各種不同類型的集合類來處理不同的數據,例如:

????????可變大小的順序鏈表;

????????保證無重復元素的集合;

????????...

2.集合接口

Java標準庫自帶的java.util包提供了集合相關的接口和實現類:Collection接口,它是除Map接口外所有其他集合類的根接口。

collection特點:

(1)collection接口是單列集合的根接口,英文含義集中,收集。

(2)單列集合是將數據進行一個一個的存儲,存儲的是值

Javajava.util包主要提供了以下三種類型的集合:

??List:一種有序列表的集合;

??Set:一種保證沒有重復元素的集合;

??Map:一種通過鍵值(key-value)查找的映射表集合,例如,根據Studentname查找對應StudentMap

Java集合的設計有幾個特點:首先實現了接口和實現類相分離,例如,有序表的接口是List,具體的實現類有ArrayListLinkedList等;其次支持泛型,我們可以限制在一個集合中只能放入同一種數據類型的元素,例如:

List<String> list = new ArrayList<>(); // 只能放入String類型

最后,Java訪問集合總是通過統一的方式——迭代器(Iterator)來實現,它最明顯的好處在于無需知道集合內部元素是按什么方式存儲的。

另外,由于Java的集合設計非常久遠,中間經歷過大規模改進,我們要注意到有一小部分集合類是遺留類,不應該繼續使用:

? Hashtable:一種線程安全的Map實現;

? Vector:一種線程安全的List實現;

? Stack:基于Vector實現的LIFO的棧;

3.小結

(1)Java的集合類定義在java.util包中;

(2)支持泛型,主要提供了3種集合類,包括ListSetMap

(3)Java集合使用統一的Iterator遍歷,盡量不要使用遺留接口;

二、List集合

1.List集合簡介

在集合類中,List是最基礎的一種集合:它是一種有序列表。List的行為和數組幾乎完全相同:List內部按照放入元素的先后順序存放,每個元素都可以通過索引確定自己的位置,List的索引和數組一樣,從0開始。

List和數組類似,也是有序結構。還可重復。但是,如果我們使用數組,在添加和刪除元素的時候,會非常不方便。例如,從一個已有的數組{'A', 'B', 'C', 'D', 'E'}中刪除索引為2的元素:這個“刪除”操作實際上是把'C'后面的元素依次往前挪一個位置,而“添加”操作實際上是把指定位置以后的元素都依次向后挪一個位置,騰出來的位置給新加的元素。這兩種操作,用數組實現非常麻煩。

┌───┬───┬───┬───┬───┬───┐
│ A │ B │ C │ D │ E │   │
└───┴───┴───┴───┴───┴───┘│   │┌───┘   ││   ┌───┘│   │▼   ▼
┌───┬───┬───┬───┬───┬───┐
│ A │ B │ D │ E │   │   │
└───┴───┴───┴───┴───┴───┘

因此,在實際應用中,需要增刪元素的有序列表,我們使用最多的是ArrayList。實際上,ArrayList在內部使用了數組來存儲所有元素。例如,一個ArrayList擁有5個元素,實際數組大小為10(即有5個空位):

size=5
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
│ A │ B │ C │ D │ E │   │   │   │   │   │
└───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘0   1   2   3   4   5   6   7   8   9

當需要在指定索引位置(索引=2)添加一個元素(X)到ArrayList時,ArrayList自動移動需要移動的元素:

size=5
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
│ A │ B │   │ C │ D │ E │   │   │   │   │
└───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘0   1   2   3   4   5   6   7   8   9

然后,往內部指定索引的數組位置添加一個元素,然后把size1

size=6
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
│ A │ B │ X │ C │ D │ E │   │   │   │   │
└───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘0   1   2   3   4   5   6   7   8   9

當繼續添加元素,但是數組已滿,沒有空閑位置的時候,ArrayList先創建一個更大的新數組(新數組長度為原數組的1.5倍),然后把舊數組的所有元素復制到新數組,緊接著用新數組取代舊數組:

size=10
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
│ A │ B │ X │ C │ D │ E │ F │ G │ H │ I │   │   │   │   │   │
└───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘0   1   2   3   4   5   6   7   8   9   10  11  12  13  14

現在,新數組就有了空位,可以繼續添加一個元素到數組末尾,同時size1

size=11
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
│ A │ B │ X │ C │ D │ E │ F │ G │ H │ I │ J │   │   │   │   │
└───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘0   1   2   3   4   5   6   7   8   9   10  11  12  13  14

可見,ArrayList把添加和刪除的操作封裝起來,讓我們操作List類似于操作數組,卻不用關心內部元素如何移動。我們觀察List<E>接口,可以看到幾個主要的接口方法:

(1)在末尾添加一個元素:boolean add(E e)

(2)在指定索引添加一個元素:boolean add(int index, E e)

(3)刪除指定索引的元素:E remove(int index)

(4)刪除某個元素:boolean remove(Object e)

(5)獲取指定索引的元素:E get(int index)

(6)獲取鏈表大小(包含元素的個數):int size()

三、ArrayList容器類

ArrayList是List接口的實現類。

1.初始化

初始化分為無參初始化和有參初始化兩種。

1.1無參初始化

public ArrayList() {this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;}

底層elementData數組指向DEFAULTCAPACITY_EMPTY_ELEMENTDATA數組,默認為空數組時,第一次添加元素,擴容為10。

擴充:泛型只是在編譯的時候進行規則校驗,不將代碼只有轉換為對應的數據類型。

//泛型類型:一定是引用數據類型
//泛型使用好處:幫助我們建立類型安全的結合,使用時傳入具體的類型
//代碼的可讀性增強,程序更安全

1.2有參初始化

(1)ArrayList (int initialCapacity)

初始化時根據數字,如果>0則是對應數字內存;

== 0 是EMPTY_ELEMENTDATA數組;

< 0 時報錯;

可以根據預估規模,設置初始值,可以減少擴容頻次。

(2)ArrayList (Collection <? extends E >c)

2.數據結構

底層是基于數組實現的,隨著元素的增加而動態擴容;

使用場景:適合數據連續性遍歷,讀多寫少的場景。

3.常用方法

3.1增加元素

(1)boolean add(E e) 添加指定元素到集合尾部

ArrayList<String> arrayList=new ArrayList<>();
//添加元素boolean add(E,e)添加指定元素到集合尾部
boolean b1=arrayList.add("g關羽");
boolean b2=arrayList.add("z張飛");
System.out.println(arrayList);

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

arrayList.add(2,"rosie");
System.out.println(arrayList);

(3)boolean addAll(Collection<? extends E> c) 添加集合C 內所有元素到當前集合

List<String> list=Arrays.asList("lisa","jisoo","rosie","jennie");
arrayList.addAll(list);
System.out.println("集合內容為:"+arrayList);

(4)boolean addAll(int index,Collection<? extends E> c) 從指定的位置開始,將指定 collection 中的所有元素插入到此列表中

 //使用Arrays快速生成一個List類型的集合
List<String> list= Arrays.asList("a阿拉善","b北京","d丹東");
//boolean addAll(int index,Collection<? extends E> c)
//從指定的位置開始,將指定Collection中的所有元素插入到此列表中
boolean b6=arrayList.addAll(0,list);
System.out.println("添加集合是否成功:"+b6);
System.out.println(arrayList);

3.2查找元素

(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("rosie");
System.out.println("元素下標為: " + index);

(4)boolean contains(Object c)--判斷集合中是否存在元素

boolean b = arrayList.contains("rosie");
System.out.println("元素是否存在: " + b);

(5)boolean isEmpty()--判斷集合是否為空

boolean b1 = arrayList.isEmpty();
System.out.println("是否為空: " + b1);

(6)List<E> SubList(int fromindex,int toIndex)--按照指定下標區間截取子集合 如果下標越界,則IndexOutOfBoundsException

不要強制類型轉化為ArrayList,可能會出現類型轉換異常;

對父類集合元素的增加或者刪除,均會導致列表的遍歷、增加、刪除產生ConcurrentModificationException異常;

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);

(8)使用for循環遍歷

普通for循環和增強for循環。

ArrayList<String> arrayList=new ArrayList<>();
arrayList.addAll(Arrays.asList("rosie","lisa","jisoo","rosie","jennie"));
System.out.println("集合內容為:"+arrayList);
//遍歷集合
//1.for
for (int i = 0; i <arrayList.size() ; i++) {System.out.println(arrayList.get(i)+" ");
}
System.out.println();
//2.foreach
for (String str:arrayList) {System.out.println(str+"__");
}System.out.println();

(9)使用迭代器進行遍歷

? ? ? ? Iterator<E> iterator{}--該迭代器僅提供向后遍歷

? ? ? ??ListIterator{}

//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);
}

迭代器詳細解釋:

定義:是訪問數據的模型,主要是用來遍歷Collection集合。

Iterator接口詳細方法:

(1)hasNext():判斷當前指針位置的下一個位置是否有元素,有則返回true,沒有則返回false。

(2)next():移動指針到下一個位置,并返回該位置的元素。

(3)remove():①在使用迭代器的remove()操作時,會將更新后的modCount給expectedModCount,兩者會得到同步,但是在調用集合的remove()方法后,兩個不會進行同步,進而導致在checkForComodification()校驗時不通過,拋出java.util.ConcurrentModificationException異常。

②所以,在單線程下使用迭代器是沒有問題的,但是在多線程下同時操作集合就不允許了,可以通過fail-fast快速失敗機制,快速判斷是否存在同時操作問題。因此,集合在多線程下使用是不安全的。

迭代器總結:

(1)對任何集合都采用同一種訪問模型

(2)調用者對集合內部結構可以不清楚

(3)迭代器類返回的迭代器對象清楚要怎么進行集合內部訪問

3.3 修改元素

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

ArrayList<String> arrayList=new ArrayList<>();
arrayList.addAll(Arrays.asList("朱元璋","朱祁鎮","朱棣","朱棣","朱高熾"));
System.out.println("集合內容為:"+arrayList);
//1.oldE    set(int index, E element):用指定的元素替代此列表中指定位置上的元素。
String str=arrayList.set(2,"烏薩奇");
int index=arrayList.indexOf("朱元璋");
if(index>=0){arrayList.set(index,"鄭和");
}
System.out.println("修改后的元素為:"+str);

3.4 刪除元素

(1)E remove(int index)--根據指定索引刪除元素,并把刪除的元素返回

????????如果下標超過集合的最大下標,輸出IndexOutOfBoundsException

//E remove(int index):根據指定索引刪除元素,并把刪除的元素返回
String item =arrayList.remove(0);
System.out.println("刪除的元素為:"+item);

(2)boolean remove(Object o):從集合中刪除指定的元素,刪除一個就返回(有多個就只刪除一個)

????????如果查到或者刪除1個就返回,并不是刪除所有相同的集合元素

//boolean remove(Object o):從集合中刪除指定的元素,刪除一個就返回
boolean b=arrayList.remove("朱棣");
System.out.println("刪除的元素是否成功:"+b);

(3)void clear():刪除集合中的所有元素,此集合仍舊存在,集合元素長度變0。

//void clear():刪除集合中的所有元素,此集合仍舊存在,集合元素長度變0
arrayList.clear();
System.out.println("操作后的集合為:"+arrayList);

(4)boolean removeAll(Collection<?> c)--- 差集

????????從集合中刪除一個指定的集合元素: 刪除A集合中存在B集合中的所有相同的元素,如果有刪除返回True。

ArrayList<String> arrayList1=new ArrayList<>();
ArrayList<String> arrayList2=new ArrayList<>();
arrayList1.addAll(Arrays.asList("朱元璋","朱祁鎮","朱棣","朱棣","朱高熾"));
arrayList2.addAll(Arrays.asList("孫皇后","朱祁鎮","朱棣","李時珍","朱高熾"));
System.out.println("arraylist1:"+arrayList1);
System.out.println("arraylist2:"+arrayList2);//boolean removeAll(Collection<?> c)--- 差集 誰調用修改誰
boolean b1=arrayList1.removeAll(arrayList2);
System.out.println(b1);
System.out.println("arrayList1和arrayList2的差集為:"+arrayList1);

(5)boolean retainAll(Collection<?> c) --交集

????????保留集合A和集合B中相同的元素,刪除不同的元素,誰調用操作的是就是誰

//boolean retainAll(Collection<?> c)   --交集 誰調用修改誰
boolean b=arrayList1.retainAll(arrayList2);
System.out.println(b);
System.out.println("arrayList1和arrayList2的交集為:"+arrayList1);

3.5 其他方法

(1)list.clone()克隆一個集合,得到的一個長度,個數,內容,順序完全一致的集合,單是復制了一份。

//Object clone() 克隆一個集合,得到一個長度,個數,內容,順序完全一致的集合,單是復制了一份
ArrayList<String> list1=new ArrayList<>();
list1.addAll(Arrays.asList("zyz朱元璋","zqz朱祁鎮","zd朱棣","lsz李時珍","zgc朱高熾","shh孫皇后"));//克隆
Object obj=list1.clone();
if (obj instanceof ArrayList){ArrayList<String> cloneList=(ArrayList<String>)obj;System.out.println(cloneList);
}

(2)list.sort() 對list中的內容進行排序,需要自定義排序規則。

//list.sort() 對list中的內容進行排序,需要自定義排序規則
list1.sort(new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {//先按照字符串的長度排,長度相同按照內容排序if (o1.length()==o2.length()){return o1.compareTo(o2);}else{return o1.length()-o2.length();}}
});
System.out.println("排序后的結果為:"+list1);

(3)轉換--Object[] toArray()--T[] toArray(T[] a)

//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));

4.擴容機制

(1)無參構造的對象初始容量為0,第一次添加元素時,擴容內存大小容量為10。

(2)有參構造時,根據參數設置內存大小

在進行 arrayList1.add()時,如果數組容量不足時,按照原容量的1.5倍進行擴容增長。

(3)最大容量為:Integer.MAX_VALUE - 8 到 Inter.Max_Value之間,如果超出。則輸出OutMemoryError錯誤。

5.總結特點

(1)在內存中分配連續的空間,實現了長度可變的動態數組,有序集合(插入的順序==輸出的順序)。

(2)優點:查效率高,增加和刪除的效率比較低。

(3)缺點:添加和刪除需要大量移動元素效率,按照內容查詢效率低,線程不安全。

四、LinkedList類

1.初始化

(1)無參初始化--LinkedList() 構造一個空列表。

(2)有參初始化--LinkedList(Collection<? extends E> c)。

2.數據結構

(1)是雙向鏈表:鏈表由若干個Node對象組成,在每個節點里存了上一個節點和下一個節點的地址。

(2)擴容:由于采用鏈表結構,每次添加元素,都在創建新的Node節點并進行分配空間,所以不存在擴容。

3.常用方法

3.1增加元素

(1)boolean add(E,e) --添加到列表的尾部

(2)add(int index, E element) --在此列表中的指定位置插入指定的元素。

(3)void addFirst(E,e)--添加到列表的頭部。

(4)void addlast(E,e)--添加到列表的尾部。

(5)boolean addAll(Collection<? extends E> c)--按照指定集合的迭代器返回的順序將指定集合中的所有元素追加到此列表的末尾。

(6)boolean addAll(int index, Collection<? extends E> c)--將指定集合中的所有元素插入到此列表中,從指定的位置開始。

3.2查找元素

(1)int size()--查集合的長度,具體的元素個數。

(2)E get(int index)--查詢某個下標對應的元素。

(3)E getLast()獲取列表的尾元素。

(4)E getFirst() 獲取列表的頭元素。

(5)int indexOf(Object c) 查詢列表中的指定元素的下標,如果不存在,則刪除-1。

(6)boolean contains(Object o) 如果此列表包含指定的元素,則返回 true。

3.3修改元素

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

3.4刪除元素

(1)E remove():刪除鏈表的頭元素。

(2)E remove(int index) :刪除鏈表中的指定下表的元素。

(3)boolean remove(Object o):刪除指定內容的元素。

(4)removeFirst() :從此列表中刪除并返回第一個元素。

(5)E removeLast() : 刪除鏈表中的尾元素。

3.5轉換為數組

(1)T[] toArray(T[] a)

3.6元素的遍歷

(1)for循環:普通、foreach。

(2)迭代器:iterator、listIterator。

//底層:雙鏈表
public class Demo01 {public static void main(String[] args) {//創建LinkedList的集合對象LinkedList<String> list=new LinkedList<>();//1.添加元素list.add("rosie");list.add(0,"lisa");list.addAll(Arrays.asList("jisoo","jennie"));list.addAll(1,Arrays.asList("hank","black"));list.addFirst("blackpink");list.addLast("pink");System.out.println(list);//2.獲取元素String item=list.get(4);System.out.println("獲取元素為:"+item);System.out.println("首元素為:"+list.getFirst());System.out.println("尾元素為:"+list.getLast());System.out.println(list);//3.刪除String item1=list.remove();System.out.println("刪除元素為:"+item1);System.out.println("刪除首元素為:"+list.removeFirst());System.out.println("刪除尾元素為:"+list.removeLast());System.out.println(list);//        //1.遍歷1--不推薦
//        for (int i = 0; i <list.size() ; i++) {
//            System.out.println(list.get(i));
//        }
//
//        //2.遍歷 增強for
//        for (String str: list) {
//            System.out.println(str);
//        }//3.普通迭代器
//        Iterator<String> itor = list.iterator();
//        while(itor.hasNext()){
//            System.out.println(itor.next()+"-");
//        }//3.list迭代器
//        ListIterator<String> itor1 = list.listIterator(3);
//        while(itor1.hasPrevious()){
//            System.out.println(itor1.previous()+"*");
//        }}
}

4.總結特點

(1)采用雙向鏈表存儲方式

(2)優點:插入、刪除元素效率高

(3)缺點:遍歷和隨機訪問效率低下

(4)適用場景:適合數據頻繁的添加和刪除操作,寫多讀少的場景

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/90588.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/90588.shtml
英文地址,請注明出處:http://en.pswp.cn/web/90588.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

React Three Fiber 實現晝夜循環:從光照過渡到日月聯動的技術拆解

在 3D 場景中用 React Three Fiber 實現自然的晝夜循環&#xff0c;核心難點在于光照的平滑過渡、日月運動的聯動邏輯、晝夜狀態下的光影差異處理&#xff0c;以及性能與視覺效果的平衡。本文以一個 ReactThree.js 的實現為例&#xff0c;詳細解析如何通過三角函數計算日月位置…

進階向:基于Python的簡易屏幕畫筆工具

用Python打造你的專屬屏幕畫筆工具&#xff1a;零基礎也能輕松實現你是否曾在觀看網課或參加遠程會議時&#xff0c;想要直接在屏幕上標注重點&#xff1f;或者作為設計師&#xff0c;需要快速繪制創意草圖&#xff1f;現在&#xff0c;只需幾行Python代碼&#xff0c;你就能輕…

Elasticsearch-ik分析器

CLI 安裝步驟 1、停止 Elasticsearch&#xff08;如果正在運行&#xff09;&#xff1a; 在安裝插件之前&#xff0c;確保 Elasticsearch 沒有在運行。 命令&#xff1a; systemctl stop elasticsearch2、安裝插件&#xff1a; 使用 elasticsearch-plugin 命令安裝 IK 插件。進…

MySQL八股篇

查詢關鍵字執行先后順序FROM&#xff08;及 JOIN)WHEREGROUP BYHAVINGSELECTDISTINCTORDER BYLIMIT / OFFSETCHAR 和 VARCHAR 的區別&#xff1f;使用場景&#xff1f;特性CHARVARCHAR?存儲方式??定長&#xff0c;存儲時填充空格至定義長度變長&#xff0c;存儲實際數據 長…

QT RCC 文件

RCC (Qt Resource Compiler) 是 Qt 框架中的一個工具&#xff0c;用于將資源文件&#xff08;如圖像、音頻、翻譯文件等&#xff09;編譯成二進制格式&#xff0c;并嵌入到應用程序可執行文件中。RCC 文件基本概念作用&#xff1a;將應用程序所需的資源文件編譯成 C 代碼&#…

數據湖典型架構解析:2025 年湖倉一體化解決方案

數據湖架構概述&#xff1a;從傳統模型到 2025 年新范式數據湖作為存儲海量異構數據的中央倉庫&#xff0c;其架構設計直接影響企業數據價值的釋放效率。傳統數據湖架構主要關注數據的存儲和管理&#xff0c;而 2025 年的數據湖架構已經演變為更加智能化、自動化的綜合性數據平…

繪圖庫 Matplotlib Search

關于Pathon的繪圖庫的認識和基本操作的學習 這里學習了兩款常用便捷的繪圖庫去學習使用Matplotlib介紹是最受歡迎的一種數據可視化包 是常用的2D繪圖庫 一般常于Numpy和Pandas使用 是數據分析中非常重要的工具可以自定義XY軸 繪制線形圖 柱狀圖 直方圖 密度圖 散點圖 更清晰的展…

Docker詳解及實戰

&#x1f389; Docker 簡介和安裝 - Docker 快速入門 Docker 簡介 Docker是一個開源的平臺&#xff0c;用于開發、交付和運行應用程序。它能夠在Windows&#xff0c;macOS&#xff0c;Linux計算機上運行&#xff0c;并將某一應用程序及其依賴項打包至一個容器中&#xff0c;這…

嵌入式學習的第三十三天-進程間通信-UDP

一、網絡1.定義不同主機間進程通信主機間在硬件層面互聯互通主機在軟件層面互聯互通2.國際網絡體系結構OSI模型&#xff08;7層&#xff09;: open system interconnect -------理論模型------定義了網絡通信中不同層的協議1977 國際標準化組織各種不同體系結構的計算機能在世…

4、Spring AI_DeepSeek模型_結構化輸出

一、前言 Spring AI 提供跨 AI 供應商&#xff08;如 OpenAI、Hugging Face 等&#xff09;的一致性 API, 通過分裝的ChatModel或ChatClient即可輕松調動LLM進行流式或非流式對話。 本專欄主要圍繞著通過OpenAI兼容接口調用各種大語言模型展開學習&#xff08;因為大部分模型…

Spring Data Redis 從入門到精通:原理與實戰指南

一、Redis 基礎概念 Redis&#xff08;Remote Dictionary Server&#xff09;是開源的內存鍵值對數據庫&#xff0c;以高性能著稱。它支持多種數據結構&#xff08;String、Hash、List、Set、ZSet&#xff09;&#xff0c;并提供持久化機制&#xff08;RDB、AOF&#xff09;。 …

免費版酒店押金原路退回系統——仙盟創夢IDE

項目介紹?東方仙盟開源酒店押金管理系統是一款面向中小型酒店、民宿、客棧的輕量級前臺管理工具&#xff0c;專注于簡化房態管理、訂單處理和押金跟蹤流程。作為完全開源的解決方案&#xff0c;它無需依賴任何第三方服務&#xff0c;所有數據存儲在本地瀏覽器中&#xff0c;確…

10. isaacsim4.2教程-RTX Lidar 傳感器

1. 前言RTX Lidar 傳感器Isaac Sim的RTX或光線追蹤Lidar支持通過JSON配置文件設置固態和旋轉Lidar配置。每個RTX傳感器必須附加到自己的視口或渲染產品&#xff0c;以確保正確模擬。重要提示&#xff1a; 在運行RTX Lidar仿真時&#xff0c;如果你在Isaac Sim UI中停靠窗口&…

QT6 源,七章對話框與多窗體(14)棧式窗體 QStackedWidget:本類里代碼很少。舉例,以及源代碼帶注釋。

&#xff08;1&#xff09;這不是本章節要用到的窗體組件&#xff0c;只是跟著標簽窗體 QTabWidget 一起學了。這也是 QT 的 UI 界面里的最后幾個容器了。而且本類也很簡單。就了解一下它。 本類的繼承關系如下 &#xff1a; UI 設計界面 &#xff1a;運行效果 &#xff1a;&…

魔百和M401H_國科GK6323V100C_安卓9_不分地區免拆卡刷固件包

魔百和M401H_國科GK6323V100C_安卓9_不分地區免拆卡刷固件包刷機說明&#xff1a;1&#xff0c;進機頂盒設置&#xff08;密碼10086&#xff09;&#xff0c;在其他里&#xff0c;一直按左鍵約32下&#xff0c;打開調試模式2&#xff0c;進網絡設置&#xff0c;查看IP地址。3&a…

MySQL基礎02

一. 函數在 MySQL 中&#xff0c;函數是用于對數據進行特定處理或計算的工具&#xff0c;根據作用范圍和返回結果的不同&#xff0c;主要分為單行函數和聚合函數&#xff08;又稱分組函數&#xff09;。以下是詳細介紹&#xff1a;1.單行函數單行函數對每一行數據單獨處理&…

LabVIEW 視覺檢測SIM卡槽

針對SIM 卡槽生產中人工檢測效率低、漏檢誤檢率高的問題&#xff0c;設計了基于 LabVIEW 機器視覺的缺陷檢測系統。該系統通過光學采集與圖像處理算法&#xff0c;實現對卡槽引腳折彎、變形、漏銅等缺陷的自動檢測&#xff0c;誤報率為 0&#xff0c;平均檢測時間小于 750ms&am…

RocketMQ5.3.1的安裝

1、下載安裝 RocketMQ 的安裝包分為兩種&#xff0c;二進制包和源碼包。1 下載 Apache RocketMQ 5.3.1的源碼包后上傳到linux https://dist.apache.org/repos/dist/release/rocketmq/5.3.1/rocketmq-all-5.3.1-source-release.zip2 解壓編譯 $ unzip rocketmq-all-5.3.1-source…

FunASR實時多人對話語音識別、分析、端點檢測

核心功能&#xff1a;FunASR是一個基礎語音識別工具包&#xff0c;提供多種功能&#xff0c;包括語音識別&#xff08;ASR&#xff09;、語音端點檢測&#xff08;VAD&#xff09;、標點恢復、語言模型、說話人驗證、說話人分離和多人對話語音識別等。FunASR提供了便捷的腳本和…

opencv--day01--opencv基礎知識及基礎操作

文章目錄前言一、opencv基礎知識1.opencv相關概念1.1背景1.2特點1.3主要功能與應用1.4.opencv-python2.計算機中的圖像概念2.1圖像表示2.2圖像存儲彩色圖像二、opencv基礎操作1.圖像的讀取2.圖像的顯示3.保存圖像4.創建黑白圖及隨機像素彩圖5. 圖像切片&#xff08;圖片剪裁&am…