>[success] # List集合
1. `java.util.List`集合是**Collection集合的子集合**,該集合中允許**有重復的元素**并且有先后放入次序
2. 該集合的主要實現類有:`ArrayList類`、`LinkedList類`、`Stack類`、`Vector類`
3. `ArrayList`類的底層是采用動態數組進行數據管理的,支持下標訪問,數組結構,支持自動擴容
~~~
import java.util.ArrayList;
import java.util.List;
public class ListTest {
public static void main(String[] args) {
// 創建ArrayList 實現了接口List ,因此一個List接口類型的引用指向ArrayList類型的對象,形成了多態
// 由源碼可知:當new對象時并沒有申請數組的內存空間
List lt1 = new ArrayList();
// 第一次增加會申請ArrayList的默認初始容量為10,當然也可以自定義指定初始容量,隨著動態的向其中添加元素,
// 其容量可能會動態的增加,那么擴容的公式為:新容量 = 舊容量/2 + 舊容量
// 比如:初始容量為4,其容量的每次擴充后的新容量為:4->6->9->13->19->…即每次擴充至原有基礎的1.5倍
lt1.add("one");
}
}
~~~
4. `LinkedList`類的底層是采用雙向鏈表進行數據管理的,鏈表數據結構更適合于插入和刪除
5. `Stack`類的底層是采用動態數組進行數據管理的,該類主要用于描述一種具有**后進先出**特征的數據結構,叫做棧(last in fifirst out LIFO)
~~~
import java.util.Stack;
public class StackTest {
public static void main(String[] args) {
// 1.準備一個Stack類型的對象并打印
Stack s1 = new Stack();
Stack s2 = new Stack();
System.out.println("s1 = " + s1); // [啥也沒有]
System.out.println("s2 = " + s2); // [啥也沒有]
System.out.println("-----------------------------------------------");
// 2.將數據11、22、33、44、55依次入棧并打印
for (int i = 1; i <= 5; i++) {
Object obj = s1.push(i * 11);
System.out.println("入棧的元素是:" + obj);
//System.out.println("棧中的元素有:" + s1); // 11 22 33 44 55
}
System.out.println("-----------------------------------------------");
// 3.查看棧頂元素值并打印
//Object obj2 = s1.peek();
//System.out.println("獲取到的棧頂元素是:" + obj2); // 55
System.out.println("-----------------------------------------------");
// 4.對棧中所有元素依次出棧并打印
int len = s1.size();
for (int i = 1; i <= len; i++) {
Object to = s1.pop();
//System.out.println("出棧的元素是:" + to); // 55 44 33 22 11
s2.push(to);
}
System.out.println("-----------------------------------------------");
// 5.最終打印棧中的所有元素
//System.out.println("s1 = " + s1); // [啥也沒有]
System.out.println("-----------------------------------------------");
len = s2.size();
for (int i = 1; i <= len; i++) {
Object to = s2.pop();
System.out.println("出棧的元素是:" + to); // 11 22 33 44 55
}
}
}
~~~
6. `Vector`類的底層是采用動態數組進行數據管理的,該類與ArrayList類相比屬于線程安全的類,效率比較低,以后開發中基本不用
>[danger] ##### List 常用api
|方法聲明 |功能介紹|
|--|--|
|void add(int index, E element) |向集合中指定位置添加元素|
|boolean addAll(int index, Collection<? extends E> c)| 向集合中添加所有元素|
|E get(int index)| 從集合中獲取指定位置元素|
|int indexOf(Object o) |查找參數指定的對象|
|int lastIndexOf(Object o) |反向查找參數指定的對象|
|E set(int index, E element) |修改指定位置的元素|
|E remove(int index)| 刪除指定位置的元素|
|List subList(int fromIndex, int toIndex) |用于獲取子List|
~~~
import java.util.ArrayList;
import java.util.List;
public class ListTest {
public static void main(String[] args) {
// 1.創建一個list 集合
List ls = new ArrayList();
// add 向集合中添加元
ls.add("1"); // 末尾插入
ls.add(0, "w"); // 指定插入元素位置 集合頭部
// addAll 向集合中添加所有元素
List ls1 = new ArrayList();
ls1.add("1");
ls1.add("2");
ls.addAll(ls1);
System.out.print(ls); // [w, 1, 1, 2]
// get 根據下標獲取元素
Object o = ls.get(0);
System.out.print(o); // w
// 向下轉型 獲取 實際存儲的類型值
String str = (String) ls.get(0);
System.out.print(str); // w
// 使用 get 實現 toString 效果
StringBuffer strB = new StringBuffer();
strB.append('[');
for (int i = 0; i < ls.size(); i++) {
strB.append(ls.get(i));
if (ls.size() - 1 == i) {
strB.append(']');
} else {
strB.append(',');
}
}
System.out.print(strB);
// indexOf 根據值獲取索引
int index = ls.indexOf("1");
System.out.print(index); // 1
// lastIndexOf 從后往前找
index = ls.lastIndexOf("1");
System.out.print(index); // 2
// set 修改指定位置元素
String s = (String) ls.set(0, "wwwww");
System.out.print("被修改位置元素" + s); // w // w 被修改為 wwwww
System.out.print(ls); // [wwwww, 1, 1, 2]
// remove 刪除元素
ls.remove("wwwww");
System.out.print(ls); // [1, 1, 2]
// 刪除全部 元素
// for (int i = 0; i < ls.size(); ) { // 利用刪除元素 size 改變來刪除
/*
* for (int i = ls.size()-1; i >= 0; i--) { // 倒序刪除
* //System.out.println("被刪除的元素是:" + ls.remove(i));
* 刪除元素后,后面的元素補位
* //System.out.println("被刪除的元素是:" + ls.remove(0));
* System.out.println("被刪除的元素是:" + ls.remove(i));
* }
*/
// subList 獲取當前集合中的子集合,也就是將集合中的一部分內容獲取出來,子集合和當前集合共用同一塊內存空間
List lt2 = ls.subList(1, 3);
System.out.println("lt2 = " + lt2); // [1, 2]
}
}
~~~
- windows -- 環境變量
- Vscode -- 編寫java
- 初始java
- java -- 關鍵字
- 編寫第一個java程序
- java -- 注釋
- 計算機存儲 -- 進制
- java -- 類型
- java -- 變量
- 數字類型
- 布爾類型
- 字符類型
- 類型轉換
- 雙等比較是什么
- java -- 運算符
- 算數運算符
- 字符串拼接
- 關系/比較運算符
- 自增減運算符
- 邏輯運算符
- 三目運算
- 賦值運算符
- 移位運算符
- 位運算符
- 運算符優先級
- java -- 流程控制語句
- if /else if /if -- 判斷
- switch case分支結構
- for -- 循環
- 用雙重for循環
- while -- 循環
- do while -- 循環
- 案例練習
- java -- 數組
- 數組的存儲
- 數組的增刪改查
- 數組的特點
- 數組案例
- 二維數組
- 數組的工具方法
- java -- 方法
- java -- 方法的重載
- java -- 方法的調用流程
- java -- 類方法傳參注意事項
- java -- 方法練習案例
- 對比 return break continue
- for each循環
- java -- 基礎練習
- java -- 面向對象
- java -- 創建類和對象
- java -- 訪問控制符
- java -- 類成員方法
- java -- 構造方法
- java -- this
- java -- 封裝
- java -- 對象內存圖
- java -- 創建對象案例
- java -- static
- java -- 繼承
- super -- 關鍵字
- java -- 構造塊和靜態代碼塊
- java -- 重寫
- java -- final
- java -- 多態
- java -- 抽象類
- java -- 接口
- 引用類型數據轉換
- 綜合案例
- java -- 內部類
- java -- 回調模式
- java -- 枚舉類型
- java -- switch 使用枚舉
- java -- 枚舉方法使用
- java -- 枚舉類實現接口
- java -- javaBean
- java -- package 包
- java -- import
- java -- 遞歸練習
- java -- 設計模式
- 單例模式
- java -- 注解
- java -- 元注解
- Java -- 核心類庫
- java -- 處理字符串
- Java -- String
- String -- 常用方法
- String -- 正則
- Java -- StringBuilder 和 StringBuffer
- 知識點
- Java -- StringJoiner 字符串拼接
- 練習題
- 字符串的總結
- Java -- 包裝類
- Integer
- Double
- Boolean
- Character
- java -- 集合類
- java -- util.Collection
- Iterator接口
- java -- util.List
- java -- ArrayList
- java -- util.Queue
- java -- util.Set
- java -- util.Map
- java -- util.Collections
- Java -- Math
- Java -- java.lang
- Java -- Object
- Java -- 獲取當前時間戳
- Java -- 異常
- Java -- java.util
- java -- Date
- java -- Calender
- Java -- java.text
- Java -- SimpleDateFormat
- Java -- java.time
- Java -- java.io
- java -- io.File
- java -- 泛型
- IDEA -- 用法