java基礎(17)、集合類(1:Collection)
一. 什麽是集合類?
二. Collection接口
2.1 Collection子接口(List接口和Set接口)
2.1 Collection的常用方法
三. 叠代器(Iterator)
3.1 關於叠代器
3.2 叠代其的用法
3.3 叠代器的簡化:增強for循環
3.4 使用叠代器向集合添加元素
四. List接口
4.1 List接口的方法
4.2 List接口的實現類
4.3 List遍歷的方法
4.4 並發修改異常
一. 什麽是集合類?
放了方便對多個對象操作,需要一個能對對象存儲的容器,它得具備:1、可以存不同的對象類型,2、容器的長度可變(放多少個對象進來就有多大);
就醬~~ 滿足這要求的容器就是集合啦;特點如下圖~
二. Collection接口
Collection:集合框架的頂層接口。表示一組對象,這些對象也稱為 collection 的元素。
2.1 Collection子接口
Collection有兩個子接口,他們的特點是:
List接口:可存放重復的元素,元素存取是“有序”的;
Set接口:不可以存放重復的元素,通常元素存取是“無序”的,也有一些實現類是“有序”的。
註意:上方提到的“有序,無序”指的是存放元素時是否會記住元素的存放順序;並非對元素進行“排序”。
2.2 Collection接口中的常用方法【返回類型 方法名(形參)】
添加操作
- boolean add(boject e):確保此 collection 包含指定的元素(可選操作)。
- boolean addAll(Collectiong c):將指定 collection 中的所有元素都添加到此 collection 中(可選操作)。
刪除操作
- void clear():移除此 collection 中的所有元素(可選操作)。
- boolean remove(object o):從此 collection 中移除指定元素的單個實例,如果存在的話(可選操作)。
- boolean removaAll(Collection c): 移除此 collection 中那些也包含在指定 collection 中的所有元素(可選操作)。
查詢操作
- int size():返回此 collection 中的元素數
判斷操作
- boolean isEmpty():如果此 collection 不包含元素,則返回 true。
- boolean contains(Object obj):如果此 collection 包含指定的元素,則返回 true。
- boolean containsAll(Collection c):如果此 collection 包含指定 collection 中的所有元素,則返回 true。
叠代操作
- Iterator iterator():返回在此 collection 的元素上進行叠代的叠代器。
三. 叠代器:Iterator
3.1 關於叠代器
叠代是取出集合中元素的一種方式,因為Collection中有iterator方法,所以每一個子類集合對象都具備叠代器;叠代器的next方法返回值類型是Object,所以要記得類型轉換。
叠代器讀取元素示意圖:
1 Collection c = new ArrayList(); //創建集合對象
2 Iterator it = c.iterator(); //獲取此集合的叠代器
3 while(it.haxNext()){ //遍歷這個集合
4 Object o = it.next();
5 }
說明:
1、叠代器不保證取出元素的順序和存入的順序一致,“有些”是靠集合實例本身保證的;
2、叠代器本身是一個接口,該方法返回的是一個叠代器實例對象,通常使用的是接口多態使用叠代器;
3、叠代器中常用的兩個方法是:
boolean hasNext():判斷是否有下一個元素;
boolean next();取出下一個元素。
3.2 叠代器的兩種用法
1 //叠代器用法一
2 for(Iterator iter = iterator();iter.hasNext();){
3 System.out.println(iter.next());
4 }
5
6 //叠代器用法二
7 Iterator iter = l.iterator();
8 while(iter.hasNext()){
9 System.out.println(iter.next());
10 }
3.3 增強for循環:叠代器的一種簡化方法
1 //for(數據類型 叠代變量名:集合對象)
2 for(Object obj : c){
3 //do something with obj
4 }
3.4 如何使用叠代器添加集合元素?
iterator接口沒有添加元素的方法,但是它的子接口ListIterator有,故:用ListIterator叠代,叠代器添加元素。(集合本身叠代,使用集合本身方法添加元素,如add
四. List接口
4.1 List接口方法
特有方法
- void add(int index,Object element):在列表的指定位置插入指定元素(可選操作)。
- Object get(int index):返回列表中指定位置的元素。
- Object set(int index,Object element):用指定元素替換列表中指定位置的元素(可選操作)。
4.2 List接口的實現類
- ArrayList:線程不安全,查詢速度塊,底層用的是數組,增刪慢;
- LinkedList:線程不安全,鏈表結構,增刪速度快,查詢慢;
- Vector:線程安全,但速度慢,已被ArrayList替代
4.3 List接口遍歷的方法
1. 叠代器遍歷
1 //叠代器遍歷list
2 Iterator it = list.iterator();
3 while(it.hasNext()){
4 Object obj = it.next();
5 System.out.println(obj);
6 }
2. 增強for循環
1 //增強for循環遍歷集合
2 for(Object obj : list){
3 System.out.println(obj);
4 }
3. 普通for循環配合get方法
1 //普通for循環,獲取指定位置的元素
2 for(int i = 0;i<list.size();i++){
3 System.out.println(list.get(i));
4 }
4.4 並發修改異常
在使用叠代器遍歷ArrayList的時候,若使用集合本身的方法修改了集合,將導致並發修改異常:ConcurrentModificationException,故需註意:
- 使用叠代器遍歷,使用叠代器刪除元素
- 使用集合本身遍歷,使用集合本身方法刪除元素
vector類
Vector類是1.0就已經有的,在1.2被整合到集合框架中,其中的大部分方法都和ArrayList相同,但它是線程安全的,所以效率要低,特有方法:
- void addElement(E obj):將指定的組件添加到此向量的末尾,將其大小增加1。
- void removeElement():從此向量中移除全部組件,並將其大小設置為零。
- elements():返回此向量的組件的枚舉。
LinkedList類
LinkedList類底層使用的是鏈表結構保存數據,絕大多數方法和ArrayList相同,只不過多了一些對首尾元素操作的方法
- void addFirst(E e):將指定元素插入此列表的開頭。
- void addLast(E e):將指定元素添加到此列表的結尾。
- E remove():獲取並移除此列表的頭(第一個元素)。
LinkedList底層使用的是鏈表,但是自己維護了一個索引,所以提供了get(int index)的方法來通過索引獲取元素,但此方法的效率很低,一般不使用
小結:List接口的實現類選擇
是否需要線程安全: 如果是,可以選擇Vector,但是可以通過其他方式讓其他兩種類也達到線程安全的,所以一般也不會使用Vector;
如果不是,考慮是增刪多還是查詢多,增刪多:使用LinkedList;查詢多:使用ArrayList
java基礎(17)、集合類(1:Collection)