Java語言進階 #集合 #Day14 #數據結構 #List #Set #哈希 #Collections #組合排序

一、數據結構

本部分只介紹和集合相關的數據結構:棧、隊列、數組、鏈表、紅黑樹

1. 棧

  • 特點: 先進後出
  • 存儲數據: 稱爲入棧,壓棧
  • 取出數據: 稱爲出棧,彈棧
    在這裏插入圖片描述

2. 隊列

  • 特點: 先進先出
    在這裏插入圖片描述

3. 數組

  • 特點: 查詢快,增刪慢
  • 查詢快: 順序存儲,每一部分的地址都可以由數組地址及對應索引根據公式推出。所以,複雜度爲O(1)O(1)
  • 增刪慢: 增刪一個元素,需要進行復制操作,然後源數組被垃圾回收。所以,複雜度爲O(n)O(n)
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述

4. 鏈表

  • 特點: 查詢慢,增刪快
  • 查詢慢: 鏈式存儲,要確定某一元素內存地址,必須知道它的直接前節點。所以,複雜度爲O(n)O(n)
  • 增刪快: 增刪一個元素,只要將直接前置節點的指針改變一下即可。所以,複雜度爲O(1)O(1)
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述

5. 紅黑數

5.1 樹

在這裏插入圖片描述

5.2 二叉數

分支不能超過兩個
在這裏插入圖片描述

5.3 排序樹

在二叉樹基礎上
左子數小,右子數大
在這裏插入圖片描述

5.4 平衡樹

左孩子數=右孩子數
(當然,不相等就叫不平衡樹
在這裏插入圖片描述

5.5 紅黑樹

在這裏插入圖片描述
特點: 相當於平衡樹,查詢速度非常快。查詢葉子節點的最快與最慢速度之間,不能超過兩倍


約束:

  1. 節點可以是紅色的,或是黑色的
  2. 根節點是黑色的
  3. 葉子節點(空節點)是黑色的
  4. 每個紅色的節點的子節點都是黑色的
  5. 任何一個節點,到其每一個葉子節點的所有路徑上的黑色節點數相同

二、List接口

  • 有序
  • 有索引
  • 元素允許重複

1. 常用方法&遍歷方法

常用方法:add, get, remove, set
遍歷方法:for, Iterator, foreach

注意: 注意不要索引越界異常
在這裏插入圖片描述

三、List實現類

Vector是單列集合的共同父接口(它是Collection的父接口),它是單列的,有自己特殊的方法。

1. ArrayList

  • 底層: 數組
  • 特點: 此實現不是同步的(異步,多線程)

2. LinkedList

  • 底層: 鏈表
  • 特點: 此實現不是同步的(異步,多線程)

鏈表的中間操作的複雜度是O(n)O(n),二兩端是O(1)O(1),所以LinkedList有大量針對頭尾的方法
在這裏插入圖片描述

四、Set實現類

  • 不能存儲重複值
  • 沒有索引 (不能使用帶索引的方法,也不能使用普通的for循環遍歷)

1. HashSet

1.1 HashSet特點

  • 底層是哈希表(實際爲HashMap),哈希表查詢的速度相當快
  • 是一個無序的集合
  • 允許使用null元素
    在這裏插入圖片描述
    從圖中,我們可以看出:
  1. 重複的元素,未被存儲(但存儲時不報錯)
  2. 遍歷的順序和存儲的順序不一致

1.2 Hash值

哈希值: 對象的地址值,是一個邏輯地址值(是模擬出來得到地址,不是數據實際存儲的物理地址)是一個十進制的整數,由系統隨機給出。

Object類中有一個方法,可以得到Hash值,用法:.hashCode().hashCode(),返回一個int值
在這裏插入圖片描述

1.2.1 哈希值的注意事項

  1. toString直接打印引用對象,返回的地址值,就是對哈希值進行了進制轉化
    在這裏插入圖片描述
    在這裏插入圖片描述2. 可以重寫hashCode()方法,String重寫了該方法
    (兩個一樣的數組,哈希值不同)
    在這裏插入圖片描述
    String重寫了hashCode(),所以哈希值會相等。這是由於常量池的原因,如果是用new創建,也是不會相等的。)
    在這裏插入圖片描述
    (有個小彩蛋,重地 & 通話hashCode值相等,這叫哈希衝突

1.3 哈希表

哈希表:

  • JDK1.8之前:
    =+哈希表 = 數組 + 鏈表
  • JDK1.8之後:
    =+哈希表 = 數組 + 鏈表 (鏈表長度超過八位,就會轉爲紅黑樹結構)
    =+哈希表 = 數組 + 紅黑樹(提高查詢結構)

  • 數組結構: 把元素進行了分組,相同哈希值是一組
  • 鏈表/紅黑樹結構: 把相同哈希數值的元素鏈接到一起

1.4 集合不允許重複元素的原理

  1. add()方法會調用hashCode()方法,計算存儲元素的哈希值
  2. 與集合中已有元素的哈希值進行比對,如果有相同的(哈希衝突),進行第3步。沒有則存儲。
  3. 新存的元素,會調用equals()和衝突的元素進行比較。如果不相同,存儲

1.5 存儲自定義對象

爲了讓自定義的類,能夠區分重複元素,需要重寫hashCode()equal()方法(可以用Alt Insert快速插入)

注: 如果不需要進行區分,就不要使用這兩個方法了

在這裏插入圖片描述
可以讓屬性一致的多個對象hashCode一致

2. LinkedHashed

  • 底層: 哈希表(數組 + 鏈表/紅黑樹) + 鏈表
  • 鏈表: 用來記錄順序的鏈表

3. 可變參數

可以傳遞0~(0 \text{\textasciitilde} \infin)個參數
格式:

限制符 返回值類型 方法名(數據類型... 形參名) {
  // 方法體
}

說明:

  1. 可變參數的底層是一個數組
  2. 在傳入時,動態地創建一個數組
    注意事項:
  3. 一個方法的可變列表,只能有一個可變參數
  4. 如果有多個參數,可變參數必須在參數列表的末尾

  • Demo: 計算整數和
    在這裏插入圖片描述

五、Collections

Collections是一個操作集合的工具類,提供了大量的靜態方法

1. 批量添加&打亂

  • addAll: 批量添加元素
Collections.addAll(集合名, 參數列表...)

在這裏插入圖片描述

  • shuffle: 打亂集合中元素
Collections.shuffle(集合名)

在這裏插入圖片描述

2. sort排序(默認升序)

sort: 按照默認(升序)方法排序,只能用於list,不能用於set
在這裏插入圖片描述


Comparable裏的compareTo方法被重寫,才能進行排序(比如下圖的String)
在這裏插入圖片描述


重寫compareTo方法(以Person爲例):

  1. 實現Comparable接口
    在這裏插入圖片描述
  2. 重寫方法(return 0 認爲元素都是相同的)
    在這裏插入圖片描述
    升序: 調用 - 參數
    降序: 參數 - 調用

在這裏插入圖片描述
在這裏插入圖片描述

3. sort(指定排序規則)

comparable需要重寫方法,相當於自己this和別人o的比較
Comparator相當於找了一個裁判(第三方的規則),進行o1o2的比較


可以使用一個匿名類來指定排序規則
在這裏插入圖片描述
在這裏插入圖片描述
升序: o1 - o2
降序: o2 - o1

4. 組合排序

可以使用if來進行組合排序

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章