Java-常用集合

Jva常用集合

  • 一、Java 集合框架體系
  • 二、Collection接口和方法
    • 1. List接口
      • List 接口主要實現類:ArrayList
      • List 的實現類之二:LinkedList
      • List 的實現類之三:Vector
    • 2. Set接口
      • Set 主要實現類:HashSet
      • Set 實現類之二:LinkedHashSet
      • Set 實現類之三:TreeSet
  • 三、Map的接口和方法
    • 1. Map中Key和Value的特點
    • 2. Map接口的常用方法
    • 3. Map 的主要實現類:HashMap
    • 4. Map 實現類之二:LinkedHashMap
    • 5. Map 實現類之三:TreeMap
    • 6. Map 實現類之四:Hashtable
      • Hashtable 和 HashMap 的區別
    • 7. Map 實現類之五:Properties
  • 四、Collections工具類

一、Java 集合框架體系

Java 集合可分為 Collection 和 Map 兩大體系:

  • Collection 接口:用于存儲一個一個的數據,也稱單列數據集合。
    • List 子接口:用來存儲有序的、可以重復的數據(主要用來替換數組,"動態"數組)
      實現類:ArrayList(主要實現類)、LinkedList、Vector
    • Set 子接口:用來存儲無序的、不可重復的數據(類似于高中講的"集合")
      實現類:HashSet(主要實現類)、LinkedHashSet、TreeSet
  • Map 接口:用于存儲具有映射關系“key-value 對”的集合,即一對一對的數據,也稱雙列數據集合。(類似于高中的函數、映射。(x1,y1) —> y = f(x) )
    • 實現類:HashMap(主要實現類)、LinkedHashMap、TreeMap、Hashtable、Properties

Collection接口的繼承樹:
在這里插入圖片描述


Map接口的繼承樹:
在這里插入圖片描述


二、Collection接口和方法

JDK 不提供此接口的任何直接實現,而是提供更具體的子接口(如:SetList)去實現。

Collection 接口是 ListSet 接口的父接口,該接口里定義的方法既可用于操作 Set 集合,也可用于操作 List 集合。

  • Collection接口方法:
    • 添加:
      • add(E obj):添加元素對象到當前集合中
      • addAll(Collection other):添加other集合的所有元素到當前集合中,即 this = this ∪ other
    • 在這里插入圖片描述
    • 判斷:
      • int size():獲取當前集合中實際存儲的元素個數
      • boolean isEmpty():判斷當前集合是否為空集合
      • boolean contains(Object obj):判斷當前集合中是否存在與 obj 對象equals返回true的元素
      • boolean containsAll(Collection coll):判斷 coll 集合中的元素是否在當前集合中都存在。即 coll 集合是否是當前集合的“子集”
      • boolean equals(Object obj):判斷當前集合與 obj 是否相等
    • 刪除:
      • void clear():清空集合元素
      • boolean remove(Object obj) :從當前集合中刪除第一個找到的與 obj 對象 equals 返回 true 的元素。
      • boolean removeAll(Collection coll):從當前集合中刪除所有與 coll 集合中相同的元素。即 this = this - this ∩ coll
      • boolean retainAll(Collection coll):從當前集合中刪除兩個集合中不同的元素,使得當前集合僅保留與 coll 集合中的元素相同的元素,即當前集合中僅保留兩個集合的交集,即 this = this ∩ coll
    • 其他:
      • Object[] toArray():返回包含當前集合中所有元素的數組
      • hashCode():獲取集合對象的哈希值
      • iterator():返回迭代器對象,用于集合遍歷

1. List接口

List 集合類中元素有序、且可重復,集合中的每個元素都有其對應的順序索引。

List集合可以理解為一個可擴展的數組。

List 集合存儲數據,就像銀行門口客服,給每一個來辦理業務的客戶分配序號:第一個來的是“張三”,客服給他分配的是 0;第二個來的是“李四”,客服給他分配的 1;以此類推,最后一個序號應該是“總人數-1”。
在這里插入圖片描述

  • JDK API 中 List 接口的實現類常用的有:ArrayList、LinkedList 和 Vector。

以下是一些List接口操作集合元素的方法:

  • 插入元素:
    • void add(int index, Object ele):在 index 位置插入 ele 元素
    • boolean addAll(int index, Collection eles):從 index 位置將 eles 中的所有元素添加進來
  • 獲取元素:
    • Object get(int index):獲取指定 index 位置的元素
    • List subList(int fromIndex, int toIndex):返回從 fromIndex 到 toIndex 位置的子集合
  • 獲取元素索引:
    • int indexOf(Object obj):返回 obj 在集合中首次出現的位置
    • int lastIndexOf(Object obj):返回 obj 在當前集合中末次出現的位置
  • 刪除和替換元素:
    • Object remove(int index):移除指定 index 位置的元素,并返回此元素
    • Object set(int index, Object ele):設置指定 index 位置的元素為ele
package com.example.list;
import java.util.ArrayList;
import java.util.List;
public class TestListMethod {public static void main(String[] args) {// 創建 List 集合對象List<String> list = new ArrayList<String>();// 往 尾部添加 指定元素list.add("圖圖");list.add("小美");list.add("不高興");System.out.println(list); // ["圖圖","小美","不高興"]// add(int index,String s) 往指定位置添加list.add(1,"沒頭腦"); // ["圖圖","沒頭腦","小美","不高興"]System.out.println(list);// String remove(int index) 刪除指定位置元素 返回被刪除元素System.out.println("刪除索引位置為 2 的元素");System.out.println(list.remove(2));System.out.println(list); // ["圖圖","沒頭腦","不高興"]// String set(int index,String s)// 在指定位置 進行 元素替代(改)list.set(0, "三毛");System.out.println(list);// String get(int index) 獲取指定位置元素// 跟 size() 方法一起用 來 遍歷的for(int i = 0;i<list.size();i++){System.out.println(list.get(i));}//還可以使用增強 forfor (String string : list) {System.out.println(string);}}
}

List 接口主要實現類:ArrayList

  • ArrayList 是 List 接口的主要實現類
  • 本質上,ArrayList 是對象引用的一個”變長”數組
  • Arrays.asList(…) 方法返回的 List 集合,既不是 ArrayList 實例,也不是 Vector 實例。Arrays.asList(…) 返回值是一個固定長度的 List 集合
    在這里插入圖片描述

List 的實現類之二:LinkedList

  • 對于頻繁的插入或刪除元素的操作,建議使用 LinkedList 類,效率較高。這是由底層采用鏈表(雙向鏈表)結構存儲數據決定的。
  • 特有方法:
    • void addFirst(Object obj) 在鏈表表頭添加元素
    • void addLast(Object obj) 在鏈表末尾添加元素
    • Object getFirst() 獲取鏈表第一個元素
    • Object getLast() 獲取鏈表最后一個元素
    • Object removeFirst() 刪除鏈表第一個元素
    • Object removeLast() 刪除鏈表最后一個元素

ArraryList和LinkedList的優缺點:

ArrayList 的優缺點:
優點:

  1. 隨機訪問快速: ArrayList基于數組實現,可以通過索引進行快速隨機訪問元素。
  2. 適合讀取操作: 適合對列表進行頻繁的讀取操作,因為它可以快速訪問任何位置的元素。
  3. 節約空間: 相對于LinkedList,ArrayList在存儲元素時通常占用更少的空間。

缺點:

  1. 插入和刪除操作慢:對于大型列表,插入和刪除操作的性能較低,因為需要移動元素來維護連續性。
  2. 擴容: 當ArrayList達到其容量限制時,需要進行擴容操作,這可能導致性能損失。
  3. 不適合頻繁的插入和刪除操作: 如果需要頻繁執行插入和刪除操作,ArrayList的性能可能會受到影響。

LinkedList 的優缺點:
優點:

  1. 插入和刪除操作快速: LinkedList基于鏈表實現,在插入和刪除操作時效率較高,因為只需要改變指針而不需要移動元素。
  2. 適合頻繁的插入和刪除操作: 如果需要頻繁執行插入和刪除操作,LinkedList可能比ArrayList更適合。
  3. 迭代器性能: 在迭代器遍歷過程中,LinkedList的性能優于ArrayList。

缺點

  1. 隨機訪問慢: LinkedList不支持隨機訪問,訪問特定位置的元素可能需要遍歷列表,因此隨機訪問效率較低。
  2. 占用更多空間: 相對于ArrayList,LinkedList在存儲元素時可能占用更多的空間,因為需要額外的指針來連接節點。

List 的實現類之三:Vector

  • Vector 是一個古老的集合,JDK1.0 就有了。大多數操作與 ArrayList 相同,區別之處在于 Vector 是線程安全的。

  • 在各種 List 中,最好把 ArrayList 作為默認選擇。當插入、刪除頻繁時,使用LinkedList;Vector 總是比 ArrayList 慢,所以盡量避免使用。

  • 特有方法:

    • void addElement(Object obj)
    • void insertElementAt(Object obj,int index)
    • void setElementAt(Object obj,int index)
    • void removeElement(Object obj)
    • void removeAllElements()

2. Set接口

  • Set 接口是 Collection 的子接口,Set 接口相較于 Collection 接口沒有提供額外的方法
  • Set 集合不允許包含相同的元素,如果試把兩個相同的元素加入同一個 Set 集合中,則添加操作失敗。
  • Set 集合支持的遍歷方式和 Collection 集合一樣:foreach 和 Iterator。
  • Set 的常用實現類有:HashSet、TreeSet、LinkedHashSet。

Set 主要實現類:HashSet

  • HashSet 是 Set 接口的主要實現類,大多數時候使用 Set 集合時都使用這個實現類。
  • HashSet 按 Hash 算法來存儲集合中的元素,因此具有很好的存儲、查找、刪除性能。
  • HashSet 具有以下特點:
    • 不能保證元素的排列順序(使用元素的Hashcode值作為index存儲)
    • HashSet 不是線程安全的
    • 集合元素可以是 null
  • HashSet 集合判斷兩個元素相等的標準:兩個對象通過 hashCode() 方法得到的哈希值相等,并且兩個對象的 equals()方法返回值為 true。
  • 對于存放在 Set 容器中的對象,對應的類一定要重寫 hashCode()和 equals(Object obj)方法,以實現對象相等規則。即:“相等的對象必須具有相等的散列碼”。
  • HashSet 集合中元素的無序性,不等同于隨機性。這里的無序性與元素的添加位置有關。具體來說:我們在添加每一個元素到數組中時,具體的存儲位置是由元素的hashCode()調用后返回的 hash 值決定的。導致在數組中每個元素不是依次緊密存放的,表現出一定的無序性。

HashSet添加元素的過程:

第 1 步:當向 HashSet 集合中存入一個元素時,HashSet 會調用該對象的hashCode() 方法得到該對象的 hashCode 值,然后根據 hashCode 值,通過某個散列函數決定該對象在 HashSet 底層數組中的存儲位置。

第 2 步:如果要在數組中存儲的位置上沒有元素,則直接添加成功。元素會保存在底層數組中。

第 3 步:如果要在數組中存儲的位置上有元素,則繼續比較:

  • 如果兩個元素的 hashCode 值不相等,則添加成功;
  • 如果兩個元素的 hashCode()值相等,則會繼續調用 equals()方法:
    • 如果 equals()方法結果為 false,則添加成功。由于該底層數組的位置已經有元素
      了,則會通過鏈表的方式繼續鏈接,存儲。
    • 如果 equals()方法結果為 true,則添加失敗

重寫 hashCode() 方法的基本原則:

  1. 在程序運行時,同一個對象多次調用 hashCode() 方法應該返回相同的值。
  2. 當兩個對象的 equals() 方法比較返回 true 時,這兩個對象的 hashCode() 方法的返回值也應相等。
  3. 對象中用作 equals() 方法比較的 Field,都應該用來計算 hashCode 值。

重寫 equals()方法的基本原則:

  1. 重寫 equals 方法的時候一般都需要同時復寫 hashCode 方法。通常參與計算hashCode 的對象的屬性也應該參與到 equals()中進行計算。
  2. 推薦:開發中直接調用 Eclipse/IDEA 里的快捷鍵自動重寫 equals()和 hashCode()方法即可。

為什么用 Eclipse/IDEA 復寫 hashCode 方法,有 31 這個數字?
首先,選擇系數的時候要選擇盡量大的系數。因為如果計算出來的 hash 地址越大,所謂的“沖突”就越少,查找起來效率也會提高。(減少沖突)

其次,31 只占用 5bits,相乘造成數據溢出的概率較小。

再次,31 可以 由 i*31== (i<<5)-1 來表示,現在很多虛擬機里面都有做相關優化。(提高算法效率)

最后,31 是一個素數,素數作用就是如果我用一個數字來乘以這個素數,那么最終出來的結果只能被素數本身和被乘數還有 1 來整除!(減少沖突)

Set 實現類之二:LinkedHashSet

LinkedHashSet 是 HashSet 的子類,不允許集合元素重復。

LinkedHashSet 根據元素的 hashCode 值來決定元素的存儲位置,但它同時使用雙向鏈表維護元素的次序,這使得元素看起來是以添加順序保存的。

LinkedHashSet 插入性能略低于 HashSet,但在迭代訪問 Set 里的全部元素時有很好的性能。

在這里插入圖片描述

Set 實現類之三:TreeSet

  • TreeSet 是 SortedSet 接口的實現類,TreeSet 可以按照添加的元素的指定的屬性的大小順序進行遍歷。

  • TreeSet 底層使用紅黑樹結構存儲數據

  • TreeSet 特點:不允許重復、實現排序(自然排序或定制排序)

  • TreeSet 兩種排序方法:自然排序和定制排序。默認情況下,TreeSet 采用自然排序。

    • 自然排序:TreeSet 會調用集合元素的 compareTo(Object obj) 方法來比較元素之間的大小關系,然后將集合元素按升序(默認情況)排列。
      • 如果試圖把一個對象添加到 TreeSet 時,則該對象的類必須實現Comparable 接口。
      • 實現 Comparable 的類必須實現 compareTo(Object obj) 方法,兩個對象即通過 compareTo(Object obj) 方法的返回值來比較大小。
    • 定制排序:如果元素所屬的類沒有實現 Comparable 接口,或不希望按照升序(默認情況)的方式排列元素或希望按照其它屬性大小進行排序,則考慮使用定制排序。定制排序,通過 Comparator接口來實現。需要重寫compare(T o1,T o2)方法。
      • 利用 int compare(T o1,T o2)方法,比較 o1 和 o2 的大小:如果方法返回正整數,則表示 o1 大于 o2;如果返回 0,表示相等;返回負整數,表示 o1 小于 o2。
      • 要實現定制排序,需要將實現 Comparator 接口的實例作為形參傳遞給 TreeSet 的構造器。
  • 因為只有相同類的兩個實例才會比較大小,所以向 TreeSet 中添加的應該是同一個類的對象。

  • 對于 TreeSet 集合而言,它判斷兩個對象是否相等的唯一標準是:兩個對象通過compareTo(Object obj) 或 compare(Object o1,Object o2)方法比較返回值。返回值為 0,則認為兩個對象相等。

三、Map的接口和方法

  • Map 與 Collection 并列存在。用于保存具有映射關系的數據:key-value
    • Collection 集合稱為單列集合,元素是孤立存在的(理解為單身)。
    • Map 集合稱為雙列集合,元素是成對存在的(理解為夫妻)。
  • Map 中的 key 和 value 都可以是任何引用類型的數據。但常用 String 類作為 Map的“鍵”。
  • Map 接口的常用實現類:HashMap、LinkedHashMap、TreeMap 和Properties。其中,HashMap 是 Map 接口使用頻率最高的實現類。
    在這里插入圖片描述

1. Map中Key和Value的特點

這里主要以 HashMap 為例說明。HashMap 中存儲的 key、value 的特點如下:
在這里插入圖片描述
Map 中的 key 用 Set 來存放,不允許重復,即同一個 Map 對象所對應的類,須重寫 hashCode()和 equals()方法
在這里插入圖片描述

  • key 和 value 之間存在單向一對一關系,即通過指定的 key 總能找到唯一的、確定的 value,不同 key 對應的 value 可以重復。value 所在的類要重寫 equals()方法。
  • key 和 value 構成一個 entry。所有的 entry 彼此之間是無序的、不可重復的。

2. Map接口的常用方法

  • 添加、修改操作:
    • Object put(Object key,Object value):將指定 key-value 添加到(或修改)當前map 對象中
    • void putAll(Map m):將 m 中的所有 key-value 對存放到當前 map 中
  • 刪除操作:
    • Object remove(Object key):移除指定 key 的 key-value 對,并返回 value
    • void clear():清空當前 map 中的所有數據
  • 元素查詢的操作:
    • Object get(Object key):獲取指定 key 對應的 value
    • boolean containsKey(Object key):是否包含指定的 key
    • boolean containsValue(Object value):是否包含指定的 value
    • int size():返回 map 中 key-value 對的個數
    • boolean isEmpty():判斷當前 map 是否為空
    • boolean equals(Object obj):判斷當前 map 和參數對象 obj 是否相等
  • 元視圖操作的方法:
    • Set keySet():返回所有 key 構成的 Set 集合
    • Collection values():返回所有 value 構成的 Collection 集合
    • Set entrySet():返回所有 key-value 對構成的 Set 集合

3. Map 的主要實現類:HashMap

  • HashMap 是 Map 接口使用頻率最高的實現類。
  • HashMap 是線程不安全的。允許添加 null 鍵和 null 值。
  • 存儲數據采用的哈希表結構,底層使用一維數組+單向鏈表+紅黑樹進行 key-value數據的存儲。與 HashSet 一樣,元素的存取順序不能保證一致。
  • HashMap 判斷兩個 key 相等的標準是:兩個 key 的 hashCode 值相等,通過equals() 方法返回 true。
  • HashMap 判斷兩個 value 相等的標準是:兩個 value 通過 equals() 方法返回true。

舉栗說明:

public static void main(String[] args) {HashMap map = new HashMap();map.put("許仙", "白娘子");map.put("董永", "七仙女");map.put("牛郎", "織女");map.put("許仙", "小青");System.out.println("所有的 key:");Set keySet = map.keySet();for (Object key : keySet) {System.out.println(key);}System.out.println("所有的 value:");Collection values = map.values();for (Object value : values) {System.out.println(value);}System.out.println("所有的映射關系:");Set entrySet = map.entrySet();for (Object mapping : entrySet) {//System.out.println(entry);Map.Entry entry = (Map.Entry) mapping;System.out.println(entry.getKey() + "->" + entry.getValue());}
}

4. Map 實現類之二:LinkedHashMap

? LinkedHashMap 是 HashMap 的子類
? 存儲數據采用的哈希表結構+鏈表結構,在 HashMap 存儲結構的基礎上,使用了一對雙向鏈表來記錄添加元素的先后順序,可以保證遍歷元素時,與添加的順序一致。

  • 通過哈希表結構可以保證鍵的唯一、不重復,需要鍵所在類重寫 hashCode()方法、equals()方法。

5. Map 實現類之三:TreeMap

  • TreeMap 存儲 key-value 對時,需要根據 key-value 對進行排序。TreeMap 可以保
    證所有的 key-value 對處于有序狀態。
  • TreeSet 底層使用紅黑樹結構存儲數據
  • TreeMap 的 Key 的排序:
    • 自然排序:TreeMap 的所有的 Key 必須實現 Comparable 接口,而且所有的 Key 應該是同一個類的對象,否則將會拋出 ClasssCastException
    • 定制排序:創建 TreeMap 時,構造器傳入一個 Comparator 對象,該對象負責對 TreeMap 中的所有 key 進行排序。此時不需要 Map 的 Key 實現 Comparable 接口
    • TreeMap 判斷兩個 key 相等的標準:兩個 key 通過 compareTo()方法或者 compare()方法返回 0。

舉個栗子:

public class TestTreeMap {/** 自然排序舉例* */@Testpublic void test1(){TreeMap map = new TreeMap();map.put("CC",45);map.put("MM",78);map.put("DD",56);map.put("GG",89);map.put("JJ",99);Set entrySet = map.entrySet();for(Object entry : entrySet){System.out.println(entry);}}/** 定制排序** */@Testpublic void test2(){//按照 User 的姓名的從小到大的順序排列TreeMap map = new TreeMap(new Comparator() {@Overridepublic int compare(Object o1, Object o2) {if(o1 instanceof User && o2 instanceof User){User u1 = (User)o1;User u2 = (User)o2;return u1.name.compareTo(u2.name);}throw new RuntimeException("輸入的類型不匹配");}});map.put(new User("Tom",12),67);map.put(new User("Rose",23),"87");map.put(new User("Jerry",2),88);map.put(new User("Eric",18),45);map.put(new User("Tommy",44),77);map.put(new User("Jim",23),88);map.put(new User("Maria",18),34);Set entrySet = map.entrySet();for(Object entry : entrySet){System.out.println(entry);}}
}
class User implements Comparable{String name;int age;public User(String name, int age) {this.name = name;this.age = age;}public User() {}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}/*舉例:按照 age 從小到大的順序排列,如果 age 相同,則按照 name 從大到小的
順序排列* */@Overridepublic int compareTo(Object o) {if(this == o){return 0;}if(o instanceof User){User user = (User)o;int value = this.age - user.age;if(value != 0){return value;}return -this.name.compareTo(user.name);}throw new RuntimeException("輸入的類型不匹配");}
}

6. Map 實現類之四:Hashtable

  • Hashtable 是 Map 接口的古老實現類,JDK1.0 就提供了。不同于 HashMap,Hashtable 是線程安全的
  • Hashtable 實現原理和 HashMap 相同,功能相同。底層都使用哈希表結構(數組+單向鏈表),查詢速度快。
  • 與 HashMap 一樣,Hashtable 也不能保證其中 Key-Value 對的順序。
  • Hashtable 判斷兩個 key 相等、兩個 value 相等的標準,與 HashMap 一致。
  • 與 HashMap 不同,Hashtable 不允許使用 null 作為 key 或 value。

Hashtable 和 HashMap 的區別

HashMap:底層是一個哈希表(jdk7:數組+鏈表;jdk8:數組+鏈表+紅黑樹),是一個線程不安全的集合,執行效率高
Hashtable:底層也是一個哈希表(數組+鏈表),是一個線程安全的集合,執行效率低

HashMap 集合:可以存儲 null 的鍵、null 的值
Hashtable 集合,不能存儲 null 的鍵、null 的值
Hashtable 和 Vector 集合一樣,在 jdk1.2 版本之后被更先進的集合(HashMap,Arra
yList)取代了。所以 HashMap 是 Map 的主要實現類,Hashtable 是 Map 的古老實現類。

Hashtable 的子類 Properties(配置文件)依然活躍在歷史舞臺
Properties 集合是一個唯一和 IO 流相結合的集合

7. Map 實現類之五:Properties

  • Properties 類是 Hashtable 的子類,該對象用于處理屬性文件
  • 由于屬性文件里的 key、value 都是字符串類型,所以 Properties 中要求 key 和value 都是字符串類型
  • 存取數據時,建議使用 setProperty(String key,String value)方法和 getProperty(String key)方法

舉個栗子:

@Test
public void test01() {Properties properties = System.getProperties();String fileEncoding = properties.getProperty("file.encoding");//
當前源文件字符編碼System.out.println("fileEncoding = " + fileEncoding);
}
@Test
public void test02() {Properties properties = new Properties();properties.setProperty("user","songhk");properties.setProperty("password","123456");System.out.println(properties);
}
@Test
public void test03() throws IOException {Properties pros = new Properties();pros.load(new FileInputStream("jdbc.properties"));String user = pros.getProperty("user");System.out.println(user);
}

四、Collections工具類

Collections 中提供了一系列靜態的方法對集合元素進行排序、查詢和修改等操作,還提供了對集合對象設置不可變、對集合對象實現同步控制等方法(均為static 方法):

  • 排序操作

    • reverse(List):反轉 List 中元素的順序
    • shuffle(List):對 List 集合元素進行隨機排序
    • sort(List):根據元素的自然順序對指定 List 集合元素按升序排序
    • sort(List,Comparator):根據指定的 Comparator 產生的順序對 List 集合元素進行排序
    • swap(List,int, int):將指定 list 集合中的 i 處元素和 j 處元素進行交換
  • 查找

    • Object max(Collection):根據元素的自然順序,返回給定集合中的最大元素
    • Object max(Collection,Comparator):根據 Comparator 指定的順序,返回給定集合中的最大元素
    • Object min(Collection):根據元素的自然順序,返回給定集合中的最小元素
    • Object min(Collection,Comparator):根據 Comparator 指定的順序,返回給定集合中的最小元素
    • int binarySearch(List list,T key)在 List 集合中查找某個元素的下標,但是 List 的元素必須是 T 或 T 的子類對象,而且必須是可比較大小的,即支持自然排序的。而且集合也事先必須是有序的,否則結果不確定。
    • int frequency(Collection c,Object o):返回指定集合中指定元素的出現次數
  • 復制、替換

    • void copy(List dest,List src):將 src 中的內容復制到 dest 中
    • boolean replaceAll(List list,Object oldVal,Object newVal):使用新值替換 List 對象的所有舊值
    • 提供了多個 unmodifiableXxx()方法,該方法返回指定 Xxx 的不可修改的視圖。
  • 添加

    • boolean addAll(Collection c,T… elements)將所有指定元素添加到指定 collection 中。
  • 同步

    • Collections 類中提供了多個 synchronizedXxx() 方法,該方法可使將指定集合包裝成線程同步的集合,從而可以解決多線程并發訪問集合時的線程安全問題:
      在這里插入圖片描述

舉個大栗子:

package com.atguigu.collections;
import org.junit.Test;
import java.text.Collator;
import java.util.*;
public class TestCollections {@Testpublic void test01(){/*public static <T> boolean addAll(Collection<? super T> c,T... 
elements)將所有指定元素添加到指定 collection 中。Collection 的集合的元素類
型必須>=T 類型*/Collection<Object> coll = new ArrayList<>();Collections.addAll(coll, "hello","java");Collections.addAll(coll, 1,2,3,4);Collection<String> coll2 = new ArrayList<>();Collections.addAll(coll2, "hello","java");//Collections.addAll(coll2, 1,2,3,4);//String 和 Integer 之間沒
有父子類關系}
@Testpublic void test02(){
/*
* public static <T extends Object & Comparable<? super T>> T max(Col
lection<? extends T> coll)
* 在 coll 集合中找出最大的元素,集合中的對象必須是 T 或 T 的子類對象,而且支
持自然排序
* 
* public static <T> T max(Collection<? extends T> coll,Comparator<? 
super T> comp)
* 在 coll 集合中找出最大的元素,集合中的對象必須是 T 或 T 的子類對象,按照比
較器 comp 找出最大者
*
*/List<Man> list = new ArrayList<>();list.add(new Man("張三",23));list.add(new Man("李四",24));list.add(new Man("王五",25));/** Man max = Collections.max(list);//要求 Man 實現 Comparable 接
口,或者父類實現* System.out.println(max);*/Man max = Collections.max(list, new Comparator<Man>() {@Overridepublic int compare(Man o1, Man o2) {return o2.getAge()-o2.getAge();}});System.out.println(max);}
@Testpublic void test03(){/** public static void reverse(List<?> list)* 反轉指定列表 List 中元素的順序。*/List<String> list = new ArrayList<>();Collections.addAll(list,"hello","java","world");System.out.println(list);Collections.reverse(list);System.out.println(list);}
@Testpublic void test04(){/* public static void shuffle(List<?> list) * List 集合元素進行隨機排序,類似洗牌,打亂順序*/List<String> list = new ArrayList<>();Collections.addAll(list,"hello","java","world");Collections.shuffle(list);System.out.println(list);}
@Testpublic void test05() {/* public static <T extends Comparable<? super T>> void sort(L
ist<T> list)* 根據元素的自然順序對指定 List 集合元素按升序排序* public static <T> void sort(List<T> list,Comparator<? super
T> c)* 根據指定的 Comparator 產生的順序對 List 集合元素進行排序*/List<Man> list = new ArrayList<>();list.add(new Man("張三",23));list.add(new Man("李四",24));list.add(new Man("王五",25));Collections.sort(list);System.out.println(list);Collections.sort(list, new Comparator<Man>() {@Overridepublic int compare(Man o1, Man o2) {return Collator.getInstance(Locale.CHINA).compare(o1.g
etName(),o2.getName());}});System.out.println(list);}
@Testpublic void test06(){/* public static void swap(List<?> list,int i,int j)* 將指定 list 集合中的 i 處元素和 j 處元素進行交換*/List<String> list = new ArrayList<>();Collections.addAll(list,"hello","java","world");Collections.swap(list,0,2);System.out.println(list);}
@Testpublic void test07(){/* public static int frequency(Collection<?> c,Object o)* 返回指定集合中指定元素的出現次數*/List<String> list = new ArrayList<>();Collections.addAll(list,"hello","java","world","hello","hello
");int count = Collections.frequency(list, "hello");System.out.println("count = " + count);}
@Testpublic void test08(){/* public static <T> void copy(List<? super T> dest,List<? ext
ends T> src)* 將 src 中的內容復制到 dest 中*/List<Integer> list = new ArrayList<>();for(int i=1; i<=5; i++){//1-5list.add(i);}List<Integer> list2 = new ArrayList<>();for(int i=11; i<=13; i++){//11-13list2.add(i);}Collections.copy(list, list2);System.out.println(list);List<Integer> list3 = new ArrayList<>();for(int i=11; i<=20; i++){//11-20list3.add(i);}
//java.lang.IndexOutOfBoundsException: Source does not fit in 
dest//Collections.copy(list, list3);//System.out.println(list);}
@Testpublic void test09(){/*public static <T> boolean replaceAll(List<T> list,T oldVa
l,T newVal)* 使用新值替換 List 對象的所有舊值*/List<String> list = new ArrayList<>();Collections.addAll(list,"hello","java","world","hello","hello
");Collections.replaceAll(list, "hello","song");System.out.println(list);}
}

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

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

相關文章

HCIA-Datacom實驗指導手冊:7 構建簡單 IPv6 網絡

HCIA-Datacom實驗指導手冊&#xff1a;7 構建簡單 IPv6 網絡 一、實驗介紹&#xff1a;二、實驗拓撲&#xff1a;三、實驗目的&#xff1a;四、配置步驟&#xff1a;步驟 1 設備基礎配置設備命名 步驟 2 配置設備及接口 IPv6 功能步驟 3 配置接口的 link-local 地址&#xff0c…

《C++進階--10.多態》

目錄 10. 多態 10.1 多態的基本概念 10.2 多態案例一-計算器類 10.3 純虛函數和抽象類 10.4 多態案例二-制作飲品 10.5 虛析構和純虛析構 10.6 多態案例三-電腦組裝 10. 多態 10.1 多態的基本概念 多態是C面向對象三大特性之一 多態分為兩類 靜態多態: 函數重載 和 運算…

全網爆火的 MBTI 測試,是隱藏的割韭菜工具?

小伙伴們&#xff0c;誰能想到&#xff0c;作為一名沖浪老手&#xff0c;果子在網上又被騙了。 事情是這樣的&#xff0c;前幾天&#xff0c;我刷微博&#xff0c;看到一個推薦&#xff0c;大概如下圖&#xff0c;是一個 MBTI 人格測試。 MBTI 測試&#xff0c;果子早就做過了…

UCSF DOCK 分子對接詳細案例(01)- rigid, fixed anchor, flexible dock

歡迎瀏覽我的CSND博客&#xff01; Blockbuater_drug …點擊進入 文章目錄 前言一、操作環境二、研究背景三、受體-配體結構文件準備3.1準備文件夾DOCK_workdir, 下載晶體結構3.1.1 來自濕實驗的受體配體共晶結構&#xff1a;3.1.2 來自深度學習和語言模型推理預測的蛋白結構&a…

Spring Boot整合Kafka

文章目錄 1. 介紹2. Kafka基礎2.1. 安裝KafKakafka集群搭建_kafka交流群-CSDN博客 3. Spring Boot整合Kafka3.1. 引入Kafka依賴3.2.編寫配置文件 4. 生產者&#xff08;produced&#xff09;4.1. 生產者基礎案例(基礎測試) 5. 消費者5.1.消費者基本案例(基礎測試) 6.Kafka常用配…

【LLM RAG】GritLM:統一嵌入和生成的大語言模型淺談

前言 目前&#xff0c;所有基于文本的語言問題都可以歸結為生成問題&#xff0c;并通過單一的LLM來處理。然而&#xff0c;使用嵌入的任務&#xff08;如聚類或檢索&#xff09;在這種視角下往往被忽視了。文本嵌入在許多關鍵的實際應用中扮演著重要角色。如RAG&#xff0c;在…

AIGC下一步:如何用AI再度重構或優化媒體處理?

讓媒資中“沉默的大多數”再次煥發光彩。 鄒娟&#xff5c;演講者 編者按 AIGC時代下&#xff0c;媒體內容生產領域隨著AI的出現也涌現出更多的變化與挑戰。面對AI的巨大沖擊&#xff0c;如何優化或重構媒體內容生產技術架構&#xff1f;在多樣的應用場景中媒體內容生產技術又…

Oracle case when end和decode的區別

Oracle中的CASE WHEN和DECODE都是條件表達式&#xff0c;但它們在某些方面有所不同。 CASE WHEN&#xff1a; CASE WHEN是一個條件表達式&#xff0c;允許您基于條件返回不同的值。它具有以下結構&#xff1a; sql CASE WHEN condition1 THEN result1 WHEN condition2 THE…

JavaScript 基本數據類型的詳解

JavaScript的基本數據類型 以下都是JS內置的幾種類型 數據類型描述number數字&#xff0c;不區分整數和小數string字符串類型booleantrue 真, false 假undefined表示未定義的值null只有唯一的值 null&#xff0c;表示空值 number 數字類型 JavaScript 中不區分整數和浮點數&…

itertools, 一個超好用的Python庫

前言 Python用來處理迭代器的工具你想到了啥&#xff1f;itertools 就是一個特別有用的庫&#xff0c;它提供了一系列用于創建和操作迭代器的工具&#xff0c;以下是10個常用的操作&#xff0c;可用在實際工作中&#xff0c;熟練掌握這些操作&#xff0c;將極大提升你在 Pytho…

棧(順序棧)實現Language C

###王道考研的學習領悟&#xff0c;個人喜好講解清晰 何為棧&#xff1f; 定義:棧&#xff08;stack&#xff09;是只允許在一端進行插入或刪除的線性表。 其重要術語&#xff1a;棧頂&#xff0c;棧底&#xff0c;空棧。 我們只需要把這個圖看明白了&#xff0c;理解起來就…

學校機房Dev c++解決中文亂碼問題

工具->編譯選項->勾選 編譯時加入以下命令 -fexec-charsetGBK -finput-charsetUTF-8 顯示中文&#xff1a;工具->編輯器選項->去掉第一個的勾勾。

vue+node對接支付寶沙箱

目錄 一、準備工作 二、后端node 1、添加支付寶配置文件 2、開始寫支付提交接口 3、前端部分&#xff08;點擊提交訂單&#xff09;3.1、寫axios請求 3.2、點擊提交訂單按鈕后發送網絡請求 3.3、付款成功跳轉的頁面的路徑是下面這樣的&#xff1a; 4、后端向支付寶發請求…

Github上最值得學習的10個Android開源項目,安卓面試題

1.Java語言進階與Android相關技術核 Android應用是由Java語言進行開發的&#xff0c;SDK也是由Java語言編寫&#xff0c;對于Android來說&#xff0c;只要SDK沒有用Kotlin重寫&#xff0c;那么Java語言是都需要學習的。而且Android APK的后臺服務器程序大概率是Java語言構建&a…

【計算機網絡】應用層自定義協議

自定義協議 一、為什么需要自定義協議&#xff1f;二、網絡版計算器1. 基本要求2. 序列化和反序列化3. 代碼實現&#xff08;1&#xff09;封裝 socket&#xff08;2&#xff09;定制協議和序列化反序列化&#xff08;3&#xff09;客戶端&#xff08;4&#xff09;計算器服務端…

Javaweb之SpringBootWeb案例之自動配置以及常見方案的詳細解析

3.2 自動配置 我們講解了SpringBoot當中起步依賴的原理&#xff0c;就是Maven的依賴傳遞。接下來我們解析下自動配置的原理&#xff0c;我們要分析自動配置的原理&#xff0c;首先要知道什么是自動配置。 3.2.1 概述 SpringBoot的自動配置就是當Spring容器啟動后&#xff0c…

OLLAMA 本地模型調用

Ollama 網址下載 再cmd&#xff0c;用 library 里面的庫 英文對話&#xff1a; Gemma is available in both 2b and 7b parameter sizes: ollama run gemma:2bollama run gemma:7b (default) 中文對話 ollama run qwen:0.5bollama run qwen:1.8b 用vscode而不是cmd調用 …

【論文筆記】An Effective Adversarial Attack on Person Re-Identification ...

原文標題&#xff08;文章標題處有字數限制&#xff09;&#xff1a; 《An Effective Adversarial Attack on Person Re-Identification in Video Surveillance via Dispersion Reduction》 Abstract 通過減少神經網絡內部特征圖的分散性攻擊reid模型。 erbloo/Dispersion_r…

強化學習嵌入Transformer(代碼實踐)

這里寫目錄標題 ChatGPT的答案GPT4.0 ChatGPT的答案 # 定義Transformer模塊 class Transformer(nn.Module):def __init__(self, input_dim, hidden_dim, num_heads, num_layers):super(Transformer, self).__init__()self.encoder_layer nn.TransformerEncoderLayer(d_modeli…

Vue3中組件通訊的方式

Vue3中組件通訊的方式 1 &#x1f916;GPT&#x1f916;: (答案有點問題混淆了vue2的內容) 父組件向子組件傳遞數據 props 子組件通過 props 屬性從父組件接收數據。emit事件子組件通過emit 事件 子組件通過 emit事件子組件通過emit 發射事件向父組件發送消息。provide / in…