文章目錄
一、數據結構
本部分只介紹和集合相關的數據結構:棧、隊列、數組、鏈表、紅黑樹
1. 棧
- 特點: 先進後出
- 存儲數據: 稱爲入棧,壓棧
- 取出數據: 稱爲出棧,彈棧
2. 隊列
- 特點: 先進先出
3. 數組
- 特點: 查詢快,增刪慢
- 查詢快: 順序存儲,每一部分的地址都可以由數組地址及對應索引根據公式推出。所以,複雜度爲
- 增刪慢: 增刪一個元素,需要進行復制操作,然後源數組被垃圾回收。所以,複雜度爲
4. 鏈表
- 特點: 查詢慢,增刪快
- 查詢慢: 鏈式存儲,要確定某一元素內存地址,必須知道它的直接前節點。所以,複雜度爲
- 增刪快: 增刪一個元素,只要將直接前置節點的指針改變一下即可。所以,複雜度爲
5. 紅黑數
5.1 樹
5.2 二叉數
分支不能超過兩個
5.3 排序樹
在二叉樹基礎上
左子數小,右子數大
5.4 平衡樹
左孩子數=右孩子數
(當然,不相等就叫不平衡樹)
5.5 紅黑樹
特點: 相當於平衡樹,查詢速度非常快。查詢葉子節點的最快與最慢速度之間,不能超過兩倍
約束:
- 節點可以是紅色的,或是黑色的
- 根節點是黑色的
- 葉子節點(空節點)是黑色的
- 每個紅色的節點的子節點都是黑色的
- 任何一個節點,到其每一個葉子節點的所有路徑上的黑色節點數相同
二、List接口
- 有序
- 有索引
- 元素允許重複
1. 常用方法&遍歷方法
常用方法:add, get, remove, set
遍歷方法:for, Iterator, foreach
注意: 注意不要索引越界異常
三、List實現類
Vector
是單列集合的共同父接口(它是Collection
的父接口),它是單列的,有自己特殊的方法。
1. ArrayList
- 底層: 數組
- 特點: 此實現不是同步的(異步,多線程)
2. LinkedList
- 底層: 鏈表
- 特點: 此實現不是同步的(異步,多線程)
鏈表的中間操作的複雜度是,二兩端是,所以LinkedList
有大量針對頭尾的方法
四、Set實現類
- 不能存儲重複值
- 沒有索引 (不能使用帶索引的方法,也不能使用普通的for循環遍歷)
1. HashSet
1.1 HashSet特點
- 底層是哈希表(實際爲HashMap),哈希表查詢的速度相當快
- 是一個無序的集合
- 允許使用null元素
從圖中,我們可以看出:
- 重複的元素,未被存儲(但存儲時不報錯)
- 遍歷的順序和存儲的順序不一致
1.2 Hash值
哈希值: 對象的地址值,是一個邏輯地址值(是模擬出來得到地址,不是數據實際存儲的物理地址)是一個十進制的整數,由系統隨機給出。
Object
類中有一個方法,可以得到Hash值,用法:,返回一個int值
1.2.1 哈希值的注意事項
toString
直接打印引用對象,返回的地址值,就是對哈希值進行了進制轉化
2. 可以重寫hashCode()
方法,String
重寫了該方法
(兩個一樣的數組,哈希值不同)
(String
重寫了hashCode()
,所以哈希值會相等。這是由於常量池的原因,如果是用new創建,也是不會相等的。)
(有個小彩蛋,重地 & 通話 的hashCode
值相等,這叫哈希衝突 )
1.3 哈希表
哈希表:
- 在
JDK1.8
之前:
- 在
JDK1.8
之後:
(鏈表長度超過八位,就會轉爲紅黑樹結構)
- 數組結構: 把元素進行了分組,相同哈希值是一組
- 鏈表/紅黑樹結構: 把相同哈希數值的元素鏈接到一起
1.4 集合不允許重複元素的原理
add()
方法會調用hashCode()
方法,計算存儲元素的哈希值- 與集合中已有元素的哈希值進行比對,如果有相同的(哈希衝突),進行第3步。沒有則存儲。
- 新存的元素,會調用
equals()
和衝突的元素進行比較。如果不相同,存儲
1.5 存儲自定義對象
爲了讓自定義的類,能夠區分重複元素,需要重寫hashCode()
和equal()
方法(可以用Alt Insert
快速插入)
注: 如果不需要進行區分,就不要使用這兩個方法了
可以讓屬性一致的多個對象hashCode一致
2. LinkedHashed
- 底層: 哈希表(數組 + 鏈表/紅黑樹) + 鏈表
- 鏈表: 用來記錄順序的鏈表
3. 可變參數
可以傳遞個參數
格式:
限制符 返回值類型 方法名(數據類型... 形參名) {
// 方法體
}
說明:
- 可變參數的底層是一個數組
- 在傳入時,動態地創建一個數組
注意事項: - 一個方法的可變列表,只能有一個可變參數
- 如果有多個參數,可變參數必須在參數列表的末尾
- Demo: 計算整數和
五、Collections
Collections
是一個操作集合的工具類,提供了大量的靜態方法
1. 批量添加&打亂
- addAll: 批量添加元素
Collections.addAll(集合名, 參數列表...)
- shuffle: 打亂集合中元素
Collections.shuffle(集合名)
2. sort排序(默認升序)
sort: 按照默認(升序)方法排序,只能用於list,不能用於set
Comparable
裏的compareTo
方法被重寫,才能進行排序(比如下圖的String)
重寫compareTo方法(以Person爲例):
- 實現
Comparable
接口
- 重寫方法(return 0 認爲元素都是相同的)
升序: 調用 - 參數
降序: 參數 - 調用
3. sort(指定排序規則)
comparable
需要重寫方法,相當於自己this
和別人o
的比較
Comparator
相當於找了一個裁判(第三方的規則),進行o1
和o2
的比較
可以使用一個匿名類
來指定排序規則
升序: o1 - o2
降序: o2 - o1
4. 組合排序
可以使用if來進行組合排序