主頁 > 後端開發 > Collection單列集合總結

Collection單列集合總結

2023-03-20 07:22:48 後端開發

這篇文章記錄了Collection集合,List集合,Set集合

在文章第七點總結了兩大系列集合的五種實作類的區別,有需要的小伙伴可以直接去查看

一、什么是集合

集合是Java中存盤物件資料的一種容器

二、集合有什么特點

  1. 大小不固定,型別也可以不固定(通常需要泛型約束)
  2. 集合只能存盤參考資料型別
  3. 集合適合對容器中的元素進行增刪操作

三、體系結構

Collection單列集合,每個元素(資料)只包含一個值,

Map雙列集合,每個元素包含兩個值(鍵值對),

四、Collection

1. 什么是Collection

官方的解釋

  • Collection是集合層次結構中的根介面, 集合表示一組物件,稱為其元素 , 有些集合允許重復元素而其他集合則不允許, 有些是有序的,有些是無序的,
  • JDK不提供此介面(Collection)的任何直接實作:它提供了更具體的子介面的實作,如 Set 和 List
  • 此介面通常用于傳遞集合并在需要最大通用性的情況下對其進行操作,

說的通俗一點就是

  • Collection是根介面,所有集合都來自Collection
  • jdk不提供該介面實作類物件,但提供了更具體的實作類
  • 就好比父類和子類,你可以用父類物件接收一個子類的實體化物件

???例如:Father f = new Sun(); // Sun類繼承了Father類

2. Collection的體系結構

3. 常用方法

方法名稱

說明

public boolean add(E e)

把給定的物件添加到當前集合中

public void clear()

清空集合中所有的元素

public boolean remove(Object o)

把給定的物件在當前集合中出現的第一個位置洗掉,如果洗掉失敗回傳false

public boolean contains(Object obj)

判斷當前集合中是否包含給定的物件

public boolean isEmpty()

判斷當前集合是否為空

public int size()

回傳集合中元素的個數,

public Object[] toArray()

把集合中的元素,存盤到陣列中

4. 集合的遍歷方式

4.1 迭代器

Iterator是集合專用的迭代方法,只能集合呼叫

Iterator中常用方法

  • next():回傳迭代中的下一個元素
  • hasNext():如果迭代具有更多元素,則回傳true
Collection<Integer> list = new ArrayList<>();
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()){
    Integer next = iterator.next();
    System.out.println(next);
}

注意事項

  1. 迭代器只能使用一次
  2. next()移動指標到下一個元素,如果沒有拋例外
  3. hasNext()檢查下一個元素是否為空,但不移動指標
  4. 迭代器迭代元素越界出現:NoSuchElementException

4.2 普通for

只適用于List系列集合,因為他有序

通過呼叫集合的get方法,根據索引取值

4.3 增強for

List<Integer> list = new ArrayList<>();
list.add(1);
list.add(3);
list.add(2);
//增強for
for (int i : list) {
    if (i == 3) {
        i = 5;//增強for中如果對取出的這個元素修改,將不會對集合產生影響
    }
    System.out.println(i);
}

4.4 Lambda迭代

// 使用lambda運算式集合的迭代 
colStr.forEach(new Consumer() { 
    @Override public void accept(String s) { 
        System.out.println(s); 
    } 
}); 
// 簡化寫法 
System.out.println("-------------------------"); 
colStr.forEach(s-> System.out.println(s)); 
System.out.println("-------------------------"); 
// 再次簡化 
colStr.forEach(System.out::println);

五、List

Collection的子介面

1. 特點

有序,有索引(是獨有的),可重復,可存盤null值,此實作不同步,執行緒不安全

存盤和取出順序一致

2. 特有方法

方法名稱

說明

注意

void add(int index, E element)

將給定的元素插入到指定位置

索引不能越界,否則報錯

 

E get(int index)

回傳該索引位置的元素,沒找到回傳-1

E set(int index, E element)

對給定位置的元素進行替換

E remove(int index)

洗掉指定位置的元素

int lastIndexOf(Object o)

回傳特定元素在集合中最后一次出現的位置

沒找到回傳-1

int indexOf(Object o)

回傳特定元素在集合中第一次出現的位置

ListIterator<E> listIterator()

List集合特有的迭代器

 

List<E> subList(int fromIndex, int toIndex)

根據開始索引和結束索引(左閉右開)回傳一個新的集合,該集合是原集合的子集

 

ListIterator叫做串列迭代器,將在第3.2解釋

3. 迭代方式

和Collection一樣的:迭代器、增強for、Lambda運算式

List獨有的:listIterator、普通for(因為有索引)

3.1 并發修改例外

迭代器在迭代集合,但是集合本身被修改,換而言之:就是在同一時刻只能有一個物件來操作集合,否則就會出現并發修改例外

下面兩種情況會出現并發修改例外

??1. 迭代器和集合方法都會對集合進行操作

List<String> list = new ArrayList<>();
list.add("java");
list.add("css");
list.add("python");

while(stringListIterator.hasNext()){ 
    String ele = stringListIterator.next(); 
    if("css".equals(ele)){ 
        stringListIterator.remove();//允許 
        //list.remove("css");// 不允許 出現 ConcurrentModificationException 
    } 
    System.out.println(ele); 
}

??2. 增強for本身也是一個Iterator迭代器,同樣不能使用

List<String> list = new ArrayList<>();
list.add("java");
list.add("css");
list.add("python");

for (String s : list) {
    if("css".equals(s)){
        list.remove("css");//不允許,并發修改例外
    }
    System.out.println(s);
}

不會出現并發修改例外

List<String> list = new ArrayList<>();
list.add("java");
list.add("css");
list.add("python");

for (int i= 0; i < list.size();i++){ 
    String ele = list.get(i); 
    if("css".equals(ele)){ 
        list.remove("css");// 允許 
    } 
} 
System.out.println(list);

并發修改例外總結

  1. 同一時間只能有一個物件操作集合
  2. 使用迭代器要保證集合不在改變
  3. 出現例外的原因:
    1. 迭代器在進行遍歷程序中,如果對陣列進行操作,會導致迭代器的實際修改值和集合的預期修改值不對應,就會出例外
    2. 迭代器是一次性的,如果對集合進行操作,沒有及時更新迭代器就會引發例外
  4. 如何解決并發修改例外
    1. 使用普通for:用索引取值,同一時間只有一個物件對集合操作
    2. 使用串列迭代器ListIterator

3.2 ListIterator

  • ListIterator的兩個遍歷方法

boolean hasNext()

從前往后遍歷

boolean hasPrevious()

從后往前遍歷,前提是先得從前往后遍歷一遍,讓迭代器指標走到末尾

List<String> list = new ArrayList<>();
ListIterator<String> listIterator = list.listIterator();
  • ListIterator和Iterator的區別
    1. ListIterator每進行一次迭代都會把實際修改值重新賦值給預期修改值,但是Iterator不行
    2. ListIterator是List集合特有的,Iterator是所有集合都有的

4. 兩個主要的介面實作類

4.1 特點

List的介面實作類,List的特點就是ArrayList、LinkedList的特點

4.2 ArrayList

  • 使用的是陣列,默認容量為10
  • 一旦陣列滿了,則創建一個新的陣列,新陣列的容量是原陣列的容量的1.5倍,并且會將原陣列內容復制到新陣列
  • 因為底層是陣列,具有陣列的特點:查詢快,增刪慢

  • 可存盤null值
  • 此實作不同步,執行緒不安全

4.3 LinkedList

  • 底層是雙向鏈表
  • 具有鏈表的特點:查詢慢,增刪快
  • 此實作不同步,執行緒不安全
  • 常用方法

六、Set

1. 特點

元素唯一,無序,沒有索引,最多只能一個null

三個主要的介面實作類

HashSet、TreeSet、LinkedHashSet

2. HashSet

2.1 特點:無序(HashSet只是不保證有序,并不是保證無序),不重復,無索引,此實作不同步

2.2 底層實作:哈希表,是一種對增刪改查性能都較好的結構

  • 哈希表組成

??jdk8之前:陣列+鏈表

??jdk8之后:陣列+鏈表+紅黑樹

  • 哈希值

  • 哈希值是jdk根據物件計算得出的記憶體地址,根據某個規則算出來的int型別數值
  • 物件可以通過呼叫hashCode()回傳物件的哈希值
  • 同一個物件的哈希值是相同的
  • 在默認情況下,不同物件的哈希值是相同的(除非重寫了hashCode方法

2.3 HashSet底層存盤結構

  1. 當呼叫無參hashSet構造器,會默認創建一個長度為16的陣列
  2. 添加元素,元素哈希值陣列長度根據哈希演算法計算元素存盤位置
  3. 判斷該位置是否為空,如果為空直接存陣列
  4. 如果位置不為空,判斷哈希值,如果不同直接存鏈表
  5. 如果哈希值相同,判斷equals是否相同,如果不同直接存鏈表
  6. 如果都相同就不存
  • 版本差異

??jdk8之前:新元素占據舊元素位置,指向舊元素,當元素鏈表掛載元素過多會造成查詢性能下降,

??jdk8之后:新元素掛在舊元素下面,當鏈表長度超過8時,自動將鏈表轉換為紅黑樹,進一步提高性能

  • 元素去重原理(面試會問

  1. 判斷hashcode值是否相同,如果不同,則不重復
  2. 如果hashcode相同,呼叫equals比較,如果為true,則重復,否則掛在元素下邊
  3. 在類中可以重寫equals和hashCode方法,進行自定義特征比較
//假設這是一個學生類,有name和age兩個屬性
//重寫equals和hashCode方法
@Override 
public boolean equals(Object o) { 
    if (this == o) 
        return true; 
    if (o == null || getClass() != o.getClass()) 
        return false; 
    Student student = (Student) o; 
    return Objects.equals(name, student.name); //例如這里
    //可以自定義比較物件中的哪一個特征,比如就比較名字是否一樣,不在乎年齡是否一樣
} 
@Override 
public int hashCode() { 
    return Objects.hash(name); //例如這里
    //可以自定義要進行計算哈希的物件,比如只想判斷名字哈希是否一樣,
    //名字哈希一樣就認為這倆物件哈希一樣,不在乎年齡哈希是否一樣
}

3. TreeSet

3.1 特點:默認自然升序排序,不重復,無索引,可排序

3.2 排序方式

  • 自然排序

  1. 必須實作Comparable介面,重寫compareTo,定義排序規則
  2. Integer、String這些類默認已經實作了Comparable介面,可以直接去呼叫
  3. 英文按照字母順序,中文按照Unicode碼大小升序
  • 比較器排序(定制排序):

??創建集合時候就實作Comparator介面

??如何理解排序呢

??首先要知道這倆的區別

  • Comparable是比較介面,Comparator是比較器
  • 實作比較介面(Comparable)就意味著該類支持排序
  • 實作比較器(Comparator)就意味著該集合要使用自定義的比較方法
  • Comparable相當于“內部比較器”,而Comparator相當于“外部比較器”,

??通俗一點,用人話說就是:

  • 使用Comparable就是支持排序,意思是我這個類支持排序
  • 使用了Comparator就是比較器,不管類支不支持,想要排序就得按照我比較器的規矩排序

LinkedHashSet

  1. 特點:有序(存入和取出順序一樣),不重復,無索引
  2. 底層存盤結構:哈希表和雙向鏈表,雙向鏈表用來記錄存盤的順序

七、所有集合最全面總結

  List Set
實作類 ArrayList LinkedList HashSet TreeSet LinkedHashSet
順序 有序 有序 無序 有序 有序
重復 可重復 可重復 不可重復 不可重復 不可重復
空值 允許多個null 允許多個null 最多一個null 最多一個null 最多一個null
索引 有索引 有索引 無索引 無索引 無索引
排序 存入順序就是取出順序 存入順序就是取出順序 不能排序 自然排序和比較器排序 存入順序就是取出順序
特點 查詢快 增刪首尾操作快 增刪改查都快的五邊形戰士 唯一可以自定義排序 增刪改查都快的五邊形戰士
底層 陣列 鏈表 哈希表 紅黑樹 哈希表和雙鏈表
凡是帶list都可重復、有索引 凡是帶set都不可重復、無索引
凡是帶hash都是五邊形戰士,增刪改查都快 只有HashSet無序、不能排序

八、集合工具類Collections

Collections 不屬于集合,是用來操作集合的工具類

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/547376.html

標籤:其他

上一篇:JAVA -01(簡單知識介紹)

下一篇:Java專案是不是分布式,真有那么重要嗎?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more