目錄
?編輯
一、什么是UML
二、集合框架
三、List集合
1.特點
2.遍歷方式
3.刪除
4.優化
四、迭代器原理
五、泛型
六、裝拆箱
七、ArrayList、LinkedList和Vector的區別
?ArrayList和Vector的區別
LinkedList和Vector的區別?
一、什么是UML
UML(Unified Modeling Language)是一種用于軟件系統設計和建模的標準化語言。它提供了一種統一的方法來描述系統的結構和行為,以便于開發人員、設計師和其他利益相關者之間的溝通和理解。
UML包括多種圖形符號,如用例圖、類圖、時序圖、活動圖等,每種圖形符號都用于表示系統的不同方面和視圖。通過使用這些圖形符號,開發人員可以更好地理解系統的需求、結構和行為,從而更好地進行系統設計和開發。
- UML官方網站:Welcome To UML Web Site!
- UML教程:UML Tutorial
二、集合框架
三、List集合
1.特點
-
有序:List集合數據存進去的順序和取出來的順序一致
List lst=new ArrayList(); lst.add(2); lst.add(1); lst.add(5); lst.add(8); System.out.println(lst);
-
不唯一:List集合數據允許添加重復數據
List lst=new ArrayList(); lst.add(2); lst.add(1); lst.add(5); lst.add(8); lst.add(8); System.out.println(lst);
2.遍歷方式
-
for
List lst=new ArrayList(); lst.add("zs"); lst.add("ls"); lst.add("ww"); for (int i = 0; i < lst.size(); i++) {System.out.println(lst.get(i)); }
-
foreach
List lst=new ArrayList(); lst.add("zs"); lst.add("ls"); lst.add("ww"); for (String str : lst) {System.out.println(str); }
-
迭代器
List lst=new ArrayList(); lst.add("zs"); lst.add("ls"); lst.add("ww"); Iterator iterator = lst.iterator(); while(iterator.hasNext())System.out.println(iterator.next());
3.刪除
-
for正向刪除
List lst=new ArrayList<>(); lst.add(12); lst.add(13); lst.add(14); lst.forEach(System.out::println); System.out.println("刪除之前集合大小:"+lst.size()); int size = lst.size(); for (int i = 0; i <size; i++) {lst.remove(0); } System.out.println("刪除之后集合大小:"+lst.size());
-
for逆向刪除
List lst=new ArrayList<>(); lst.add(12); lst.add(13); lst.add(14); lst.forEach(System.out::println); System.out.println("刪除之前集合大小:"+lst.size()); int size = lst.size()-1; for (int i = size; i >=0; i--) {lst.remove(i); } System.out.println("刪除之后集合大小:"+lst.size());
-
迭代器刪除
List lst=new ArrayList<>(); lst.add(12); lst.add(13); lst.add(14); lst.forEach(System.out::println); System.out.println("刪除之前集合大小:"+lst.size()); Iterator<String> iterator = lst.iterator(); //判斷下一個元素是否存在 while(iterator.hasNext()) {//若存在,移動到下一個元素位置//易出錯iterator.next();//刪除元素iterator.remove(); } System.out.println("刪除之后集合大小:"+lst.size());
4.優化
List集合優化目的在于利用合理的存儲空間存下所有元素數據,不多不少,不造成空間浪費。
概念:初始化大小10、負載因子1.5、向下取整
公式:容器大小*1.5倍
例如:10*1.5=15、15*1.5=22、22*1.5=33 ...
public static void main(String[] args) {List lst=new ArrayList<>();for (int i = 0; i < 50; i++) {lst.add(i);System.out.println(i);getLen(lst);}
}public static void getLen(List lst){try {Class<? extends List> lstClass = lst.getClass();Field field = lstClass.getDeclaredField("elementData");field.setAccessible(true);Object[] obj = (Object[]) field.get(lst);System.out.println("集合的大小是:"+obj.length);} catch (Exception e) {e.printStackTrace();}
}
四、迭代器原理
List集合迭代器是用來遍歷List集合中的元素的工具。它可以按順序訪問List中的每個元素,而不需要知道List的內部結構。迭代器通常包含hasNext()和next()兩個方法,前者用來判斷是否還有下一個元素,后者用來獲取下一個元素。
關于List集合迭代器的原理,它通常是基于List的數據結構實現的。在遍歷過程中,迭代器會維護一個指向當前元素的指針,每次調用next()方法時,指針會移動到下一個元素。迭代器還會記錄遍歷的狀態,以便正確地返回hasNext()方法的結果。
五、泛型
?JDK1.5版本以上才有
- 以類型為參數的類叫做泛型
- 泛型的默認類型為Object
- 作用:提高程序的健壯性、簡化代碼
使用 List 集合時,可以通過指定泛型來限制集合中存儲的元素類型。這樣可以在編譯時就能發現類型不匹配的錯誤,提高代碼的穩定性和可讀性。
例如,我們可以創建一個存儲整數類型的 List 集合:
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);for (Integer num : list) {System.out.println(num);
}
這樣就可以確保集合中只能存儲整數類型的元素,如果嘗試存儲其他類型的元素會在編譯時報錯。
六、裝拆箱
當我們將基本數據類型(如int、float等)存儲在List集合中時,會發生裝箱操作,即將基本數據類型轉換為對應的包裝類(如Integer、Float等)。而當我們從List集合中取出包裝類并轉換為基本數據類型時,會發生拆箱操作。
示例:送快遞,寄快遞時需要對物品進行包裹,收快遞后就需要對包裹進行拆包。
-
裝箱(值類型到引用類型 )
int a=10; Integer b=new Integer(a);
-
拆箱(引用類型到值類型 )
Integer c=new Integer(10); int d=c.intValue();
七、ArrayList、LinkedList和Vector的區別
?ArrayList和Vector的區別
ArrayList和Vector都是實現了List接口的動態數組,它們之間的主要區別在于線程安全性和性能。
- 線程安全性:
- ArrayList是非線程安全的,即在多線程環境下使用ArrayList可能會導致并發訪問異常(ConcurrentModificationException)。
- Vector是線程安全的,它的方法都是同步的,可以在多線程環境下安全地使用。
- 性能:
- ArrayList相對于Vector在性能上更好,因為Vector的方法都是同步的,會帶來額外的開銷。
- 在單線程環境下,ArrayList的性能更優。
?代碼示例:
// ArrayList的使用
List<String> arrayList = new ArrayList<>();
arrayList.add("A");
arrayList.add("B");
arrayList.add("C");// Vector的使用
List<String> vector = new Vector<>();
vector.add("X");
vector.add("Y");
vector.add("Z");
LinkedList和Vector的區別?
LinkedList和Vector都是Java中的集合類,但它們有一些區別:
-
數據結構:LinkedList是基于鏈表實現的,而Vector是基于數組實現的。
-
線程安全性:Vector是線程安全的,而LinkedList不是線程安全的。
-
擴容機制:Vector在擴容時會增加原數組大小的一半,而LinkedList在插入元素時只需要調整相鄰節點的指針。
-
遍歷性能:LinkedList在遍歷時需要遍歷整個鏈表,而Vector在遍歷時可以通過索引直接訪問元素。
-
插入和刪除操作:LinkedList在任意位置插入和刪除元素的性能更好,而Vector在中間插入和刪除元素時需要移動其他元素。
?代碼示例:?
// 創建一個LinkedList
LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("A");
linkedList.add("B");
linkedList.add("C");// 創建一個Vector
Vector<String> vector = new Vector<>();
vector.add("X");
vector.add("Y");
vector.add("Z");// 遍歷LinkedList
for(String str : linkedList) {System.out.println(str);
}// 遍歷Vector
for(String str : vector) {System.out.println(str);
}