目錄
一.集合概述
二. 集合體系概述
1. Collection接口
1.1?List接口
1.2 Set接口
2. Map接口
三. ArrayList
1.ArrayList常用方法
2.ArrayList遍歷
2.1 for循環
2.2 增強for循環
2.3 迭代器遍歷
一.集合概述
我們經常需要存儲一些數據類型相同的元素,之前我們學過的容器就是數組,但是數組存在一個問題
1.數組的長度一旦確定就不能改變
但是我們在實際開發中,往往需要動態增長的容器來幫我們存儲數據,顯然只用數組的話需要自己去創建新數組并拷貝元素,這大大降低了開發效率,所以java提供了底層不同實現的數據結構的容器稱為集合
二. 集合體系概述
1. Collection接口
Collection是一個接口,里面可以定義抽象方法,常量,靜態方法,默認方法(jdk8及之后),該接口是單列集合的父接口,其中主要用于定義一些單列集合通用的方法,例如:單列集合的增刪改查
1.1?List接口
?List接口繼承了Collection接口,List接口下的實現類允許出現重復元素,可以用索引和迭代器訪問,主要有ArrayList,LinkedList,Vector等實現類
1.2 Set接口
Set接口同樣繼承了Collection接口,Set接口下的實現類不允許出現重復元素,且不能用索引訪問,只能用迭代器訪問,主要有HashSet,TreeSet等實現類
2. Map接口
Map是一個接口,里面可以定義抽象方法,常量,靜態方法,默認方法(jdk8及之后),該接口是雙列(鍵值對存儲)集合的父接口,其中主要定義一些雙列集合通用的方法,例如:雙列集合的增刪改查,主要有HashMap等實現類
三. ArrayList
ArrayList是List接口下的一個實現類,底層是一個可以動態增長的數組,所有的集合容器中都可以添加任意類型的數據,但為了使用時的統一,用一個<>指明集合中的元素類型,這是泛型,例如:<String>
1. ArrayList常用方法
size() | 返回集合中實際元素個數 |
add(E e) | 向集合末尾添加元素,添加成功返回true,添加失敗返回false |
add(int index,E e) | 向指定位置處添加元素 |
remove(Object o) | 刪除指定內容的元素,刪除成功返回true,刪除失敗返回false |
remove(int index) | 刪除指定位置處的元素,刪除成功會把該值返回 |
get(int index) | 獲取指定位置處的元素 |
indexOf(Object o) | 從左向右查找指定元素,找到返回下標,找不到返回-1 |
lastIndexOf(Object o) | 從右向左查找指定元素,找到返回下標,找不到返回-1 |
set(int index,E element) | 用指定的元素替換指定位置的元素,同時返回舊元素 |
isEmpty() | 判斷集合是否為空 |
contains(Object o) | 判斷集合中是否包含指定元素 |
四. LinkedList
LinkedList是List接口下的一個實現類,底層是鏈表結構
1.LinkedList常用方法
int size() | 返回集合中的元素個數 |
boolean add(E e) | 向集合尾部添加指定元素,添加成功返回true,添加失敗返回false |
void add(int index,E element() | 向指定位置添加指定元素 |
? ? ? ? E get(int index) | 獲取指定位置的元素 |
boolean remove(Object o) | 刪除指定元素,刪除成功返回true,刪除失敗返回false |
E remove(int index) | 刪除指定位置的元素,并將其返回 |
E remove() | 刪除頭部的元素并返回 |
void addFirst(E e) | 向頭部添加元素 |
E removeLast() | 刪除尾部元素并返回 |
void addLast(E e) | 向尾部添加元素 |
E pop() | 刪除頭部元素并返回 |
void clear() | 清空鏈表元素 |
boolean isEmpty() | 判斷鏈表是否為空 |
boolean contains(Object o) | 判斷鏈表中是否包含指定元素 |
五. Vector
vector和ArrayList底層都是數組,且兩者所擁有的方法也都是相同的,唯一的不同是,Vector的方法中被synchronized修飾,是線程安全的,它們兩者的關系就好像StringBuffer和StringBuilder的關系一樣
六. List接口下的實現類的遍歷
這里以ArrayList為例,LinkedList和vector也是類似的
1. for循環
public class ArrayListDemo4 {public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();arrayList.add("a");arrayList.add("a");arrayList.add("a");arrayList.add("b");arrayList.add("c");arrayList.add("d");for(int i = 0;i < arrayList.size(); i++){if("a".equals(arrayList.get(i))){arrayList.remove("a");i--;}}}
}
注意:用for循環刪除集合中的元素時要注意索引和元素位置的變化,將索引減回去,避免刪除元素不徹底
2. 增強for循環
public class ArrayListDemo4 {public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();arrayList.add("a");arrayList.add("a");arrayList.add("a");arrayList.add("b");arrayList.add("c");arrayList.add("d");/*2.增強for循環增強for循環遍歷元素時,不允許修改集合元素(刪除,添加)*/for(String s:arrayList){//arrayList.remove(s);System.out.print(s+" ");//arrayList.add("1");}}
}
?注意:在使用增強for循環遍歷集合時不能對集合進行增刪改查等操作?
3. 迭代器遍歷
public class ArrayListDemo4 {public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();arrayList.add("a");arrayList.add("a");arrayList.add("a");arrayList.add("b");arrayList.add("c");arrayList.add("d");/*迭代器遍歷*///獲得集合對象的迭代器對象Iterator<String> it = arrayList.iterator();//正向遍歷while(it.hasNext()) {String s = it.next();//獲取到下一個元素System.out.print(s+" ");/*if(s.equals("b")){it.remove();//使用迭代器對象刪除元素}*/}System.out.println();//ListIterator 迭代器 只能對List接口下的實現類遍歷//listIterator(index);可以從指定的位置開始向前或者向后遍歷ListIterator<String> listIterator = arrayList.listIterator(1);while(listIterator.hasNext()){System.out.print(listIterator.next()+" ");}System.out.println();//反向遍歷ListIterator<String> listIterator1 = arrayList.listIterator(arrayList.size());while(listIterator1.hasPrevious()){System.out.print(listIterator1.previous()+" ");}}
}
使用迭代器遍歷集合是更推薦的方法,它既可以在遍歷時對集合進行操作,也不用自己去管下一個元素是否會被略過
?