集合框架
【概述】
-
爲什麼會出現集合類?
面嚮對象語言對事物的體現都是以對象的形式,所以爲了對多個對象進行操作,就對對象進行存儲,集合是存儲對象最常用的一種方式。
-
數組和集合都是容器,有何不同?
數組雖然也可以存儲對象,但長度是固定的;而集合的長度是可變的
數組可以存儲基本數據類型,集合只能存儲對象
數組存儲的數據類型必須都一樣,而集合存儲的數據類型可以不同
-
集合類的特點?
集合只用於存儲對象,集合長度是可變的,集合可以存儲不同類型的對象
【集合框架的構成及分類】
【集合框架中的常用接口】
Collection接口有兩個子接口:List(列表) Set(集)
-List:可存放重複元素,元素存取是有序的
-Set:不可以存放重複元素,元素存取是無序的
【集合框架中的共性方法(以ArrayList加以說明)】
-
add(E e):將制定元素添加到此列表尾部 其中的參數類型是Object類型,用於接收任意類型的對象;集合中存放的都是對象的引用(地址)
-
addAll(Collection<? extends E>c):按照指定collection的迭代器所返回的元素順序,將collection中的所有元素添加到次列表
-
clear():移除此列表中的所有元素
-
contains(Object o):判斷此列表中是否包含制定元素
-
isEmpty():判斷此列表是否爲空,即長度是否爲0
-
remove(Object o):移除此列表中首次出現的指定元素(如果存在)
-
removeAll(Collection<?extends E> c):移除此列表中那些也包含在指定Collection中的元素
-
retainsAll(Collection<? extendsE> c):只保留此列表中那些也包含在指定Collection中的元素
-
size():返回次列表的長度
-
Object[]toArray():返回包含此 collection中所有元素的數組
-
<T> T[] toArray(T[] a):返回包含此 collection中所有元素的指定數據類型數組
注意:傳入指定類型的數組的長度應該定義多長呢?
當傳入指定元素的數組長度小於集合的size,那麼該方法內部會創建
一個新數組,長度爲集合的size;當傳入指定元素類型的數組長度大
於集合的size,不會創建新數組,而是使用傳遞進來的數組,大於集
合size的部分會被null填充;所以傳遞一個長度爲集合size的數組
最優
例:
import java.util.*;
class CollectionToArray {
public static void main(String[] args) {
ArrayList<String> al = new ArrayList<String>();
al.add("java01");
al.add("java02");
al.add("java03");
al.add("java04");
String[] arr = new String[5];// 定義接收數組的數組變量
arr = al.toArray(arr);// 返回由集合轉換的數組
sop(Arrays.toString(arr));
}
public static void sop(Object obj) {
System.out.println(obj);
}
}
-
iterator():返回在此列表的元素上進行迭代的迭代器;利用該迭代器中的next(),hasNext()等方法可獲取此列表中的元素
如:ArrayList al = new ArrayList();
Al.add(…);
…;
for(Iterator it =al.iterator();it.hasNext();)
System.out.println(it.next());
Iterator迭代器
在訪問集合中的元素時,爲了可以直接訪問,就把這些方法定義在集合內 部,定義成內部類。每個容器的數據結構都不相同,所以具體的方法細節
也不一樣,但我們可以把共性的內容抽取出來,定義成Iterator接口,即
迭代器。這些內部類都符合Iterator規則。
高級for循環
格式:for(數據類型變量名 :被遍歷的集合(Collection)或數組)
高級for循環對集合進行遍歷,只能集獲取閤中的元素,不能對集合進行
其他操作;而迭代器除了能對集合進行遍歷外,還可以remove集合中的
元素,如果是ListIterator,還可以在遍歷集合的過程中對集合進行增刪改
查的操作
傳統for和高級for有什麼區別呢?
高級for有一個侷限性:必須有被遍歷的目標
建議在遍歷數組的時候使用傳統for,因爲傳統for可以定義角標
例:
HashMap<Integer, String> hm = new HashMap<Integer, String>();
hm.put(1, "java01");
hm.put(2, "java02");
hm.put(3, "java03");
Set<Integer> keySet = hm.keySet();
for (Integer key : keySet) {
sop("key:" + key + "\tvalue:" + hm.get(key));
}
Set<Map.Entry<Integer, String>> entrySet = hm.entrySet();
for (Map.Entry<Integer, String> me : entrySet) {
Integer key = me.getKey();
String value = me.getValue();
sop(key + "---" + value);
}