文章目錄
Collection
概念
單列集合的頂級接口,不能直接new對象。通過實現類去new 如:ArrayList
常用方法
- boolean add(E e) 將指定對象添加到集合中
- void clear(E e) 清空集合元素
- boolean remove(E e) 把給定對象在當前集合刪除
- boolean contains(Object obj) 判斷當前集合中是否包含給定對象
- boolean isEmpty() 判斷當前集合是否爲空
- int size() 返回集合長度
- Object[] toArray() 把集合中的元素,存到數組中
迭代器
概念
- 本身是一個Iterator接口
- 在程序開發過程中 經常要遍歷集合的元素,於是 JDK就提供了Iterator接口
- 是Collection集合的通用遍歷方式
獲取迭代器
- Iterator iterator()
獲取元素
- boolean hasNext() -->判斷集合中有沒有下一個元素
- E next() -->獲取下一個元素
使用步驟
//創建集合
ArrayList list = new ArrayList();
list.add("第一個元素");
list.add("第二個元素");
list.add("第三個元素");
//獲取迭代器
//*其實Iterator指向的是ArrayList的內部類Itr*
Iterator<String> iterator = 集合.iterator();
//由於我們要循環判斷集合中有沒有下一個元素,利用while循環
while(iterator.hasNext()){
String element = iterator.next();
System.out.print(element )
}
注意事項
先來一個需求:使用迭代器遍歷集合,判斷集合中是否有元素 “2”,如果有再爲集合中添加一個元素“4”。
public static void main(String[] args) {
//創建集合
Collection<String> collection = new ArrayList<>();
//給集合添加數據
collection.add("1");
collection.add("2");
collection.add("3");
//獲取迭代器
Iterator<String> iterator = collection.iterator();
//使用迭代器循環
while(iterator.hasNext()){
String str = iterator.next();
//判斷 如果集合中有 “2” 在爲集合添加元素 “4”
if("2".equals(str))
collection.add("4");
}
}
看了上面的代碼,你可能覺得沒有任何問題,但是一運行就會報一個ConcurrentModificationException(併發修改異常)異常。至於爲什麼還要研究一下底層實現源碼。
所以:使用迭代器去操作元素的過程中,不要修改元素長度!!
解決辦法
可以使用ListIterator這個接口:允許程序員按任一方向遍歷列表、迭代期間修改列表,並獲得迭代器在列表中的當前位置。
ListIterator中的方法
- void add(E e) 添加元素
- boolean hasNext() 判斷有沒有下一個元素
- E next() 獲取下一個元素
演示
public static void main(String[] args) {
//創建集合
Collection<String> collection = new ArrayList<>();
//給集合添加數據
collection.add("1");
collection.add("2");
collection.add("3");
//獲取ListIterator迭代器
ListIterator<String> iterator = ((ArrayList<String>) collection).listIterator();
//使用ListIterator迭代器循環
while(iterator.hasNext()){
String str = iterator.next();
//判斷 如果集合中有 “2” 在爲集合添加元素 “4”
if("2".equals(str))
iterator.add("4");//這裏必須使用ListIterator這個接口重寫的add方法
}
}
增強for – foreach
概念
遍歷數組和集合 使用方法比迭代器簡單,但是他遍歷集合的時候底層也是迭代器,遍歷數組不是!!
格式
for(容器中元素的類型 變量名 :要變遍歷的容器的名字){
變量名就是要接受的元素;
}
例:
//創建集合
ArrayList<String> list = new ArrayList();
list.add("1");
list.add("2");
list.add("3");
//利用迭代器遍歷
Iterator iterator = list.Iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
//利用增強for簡歷
for(String element:list){
System.out.println(element:list);
}
注意事項
- 使用foreach去操作元素的過程中,也不要修改元素長度!!
- foreach在遍歷集合的時候底層原理是迭代器。
- 在遍歷數組的時候底層原理不是迭代器。
泛型
好處
定義的時候:讓代碼更通用,接收任意引用數據類型
使用的時候:可以規定數據類型,防止類型轉換異常
定義
1.定義類
格式 :
修飾符 class 類名<代碼泛型變量一般用E表示>{}
創建對象的時候確定具體類型。
2.定義方法
格式:
修飾符<代碼泛型變量一般用E表示> 返回值類型 方法名(參數){}
調用方法的時候確定泛型的類型
3.定義接口
格式:
修飾符 interface 接口名{}
實現類的時候確定泛型類型,如果在實現類的時候泛型沒有確定,那麼就要在new對象的時候確定了。
泛型通配符(瞭解)
一般使用在方法的參數上
格式:
修飾符 返回值類型 方法名(類型名稱<?> 對象名){}
可以存Object類型
受限泛型
上限:
格式:
類型名稱<? extent 類>對象名
意義:
?只能接受extends後面類型的本身及它的子類類型
下限:
格式
類型名稱<? suoer 類>對象名
意義:
?只能接受super後面類型的本身及它的父類類型
數據結構(簡單介紹)
棧
採用該數據結構集合的特點:先進後出(舉例:壓子彈)
隊列
採用該數據結構集合的特點:先進先出(舉例:排隊)
數組
採用該數據結構集合的特點:有序的元素序列,查詢快(下標直接定位),增刪慢(要想給數組添加元素,需要創建新數組。)
鏈表
單向鏈表
概念
- 就是把多個節點鏈接起來
- 一個節點它是由兩個部分組成,數據域(存儲的數值),指針域(存儲的地址)
- 第二部分存的是下一個節點的地址。
- 上一個節點保存着下一個節點的地址
- 下一個節點沒有保存上一個節點的地址
- 不能保證元素的順序
採用該數據結構集合的特點:查詢慢,增刪快
雙向鏈表
概念
- 有兩個指針域
- 一個節點它是由三個部分組成,上一個節點地址,數據域,下一個節點地址
- 上一個節點記錄下一個節點地址
- 下一個節點記錄着上一個節點地址
- 可以保證元素的順序