java筆記2——集合Collection
目錄
一、為什麼會有集合?陣列不能滿足使用嗎?
首先Java是面向物件的語言,需要通過物件體現。為了方便對多個物件進行操作,我們需要儲存多個物件的容器。
目前學過的容器有StringBuffer和陣列。但是StringBuffer的結果是字串,無法滿足全部需求。而陣列不能夠適應我們變化的需求,因為陣列的長度是固定的。這個時候Java就提供了集合。
二、陣列和集合的區別
A:長度區別
陣列的長度固定
集合的長度可變化
B:內容區別
陣列只能儲存一種型別的元素
集合可以儲存不同型別的元素
C:元素的資料型別區別
陣列能儲存基礎型別和引用型別
集合只能儲存引用型別
三、集合
首先,針對不同的儲存需求,Java提供了很多集合類。這些集合有共性,但是資料結構(資料的儲存方式)的不同。通過提取集合共性,就形成了集合的繼承體系。
集合體系圖
Collection:集合的頂層介面,它的子體系有重複的,有唯一的,有無序的,有有序的
1)Collection的功能概述:
新增功能:
boolean add(E e) :新增一個指定元素
boolean addAll(Collection<? extends E> c):新增一個集合的元素
刪除功能:
void clear() :清除所有元素
boolean remove(Object o) :移除一個元素
boolean removeAll(Collection<?> c):移除一個集合的元素
獲取功能:
Iterator<E> iterator() :進行元素的遍歷
判斷功能:
boolean contains(Object o) :判斷集合是否包含指定元素
boolean containsAll(Collection<?> c) :判斷是否包含指定的集合元素
boolean isEmpty():判斷集合是否為空
長度功能:
int size():元素的個數(集合沒有length()方法)
交集功能:
boolean retainAll(Collection<?> c)
把集合轉換成陣列:
Object[] toArray()
2)Collection介面的實現:
因為Collection是一個介面類,因此不能例項化。所以:
Collection c=new Collection(); 是錯誤的
那麼介面如何例項化呢?通過他的子類的具體實現類進行建立:
Collection c=new ArrayList();
3)Collection集合的高階功能的測試:
boolean addAll(Collection<? extends E> c):新增一個集合的元素
boolean removeAll(Collection<?> c):移除一個集合的元素
只要有一個元素(不必所有)就返回true
boolean containsAll(Collection<?> c) :判斷是否包含指定的集合元素
只有包含所有元素,才叫包含,返回true
boolean retainAll(Collection<?> c)
假設有A,B兩個集合,A對B做交集,交集的結果儲存在A中,B不變,如果A發生了變化則返回true,否則返回false
4)Collection集合的遍歷(依次獲取集合中元素)
// 建立集合物件
Collection c = new ArrayList();
// 新增元素
c.add("hello"); // Object obj = "hello"; 向上轉型
c.add("world");
c.add("java");
// 遍歷
// Object[] toArray():把集合轉成陣列,可以實現集合的遍歷
Object[] objs = c.toArray();
for (int x = 0; x < objs.length; x++) {
// System.out.println(objs[x] + "---" + objs[x].length());
//上面的實現不了,原因是objs是一個Object物件,而Object中沒有length()方法
// 我們要想使用字串的方法(輸出元素的長度),就必須把元素還原成字串
// 向下轉型(obj->String)
String s = (String) objs[x];
System.out.println(s + "---" + s.length());
}
利用迭代器遍歷(集合專用遍歷方式)
Collection c=new ArrayList();
c.add("hello");
c.add("world");
c.add("java");
//迭代器遍歷
Iterator it=c.iterator();
//判斷下一個元素是否存在
while (it.hasNext()) {
System.out.println(it.next());
}
注:boolean hasNext()
如果仍有元素可以迭代,則返回 true。
E next()
返回迭代的下一個元素。
利用for迴圈改寫while,因為效率高
for(Iterator it = c.iterator();it.hasNext();){
System.out.println(it.next());
}
自定義物件的遍歷,注意點,迭代器的使用
正確寫法:
Collection c=new ArrayList();
Student s1=new Student("花無缺",12);
Student s2=new Student("小魚兒",14);
Student s3=new Student("小仙女",13);
c.add(s1);
c.add(s2);
c.add(s3);
Iterator it=c.iterator();
while(it.hasNext()){
Student s=(Student)it.next();
System.out.println(s.getName()+"---"+s.getAge());
}
易錯點:
while(it.hasNext()){
System.out.println(((Student)it.next()).getName()+"--"+((Student)it.next()).getAge());
}
產生的錯誤:java.util.NoSuchElementException 原因是每一個it.next()都是下一個集合元素,
假如集合元素是奇數個,就會報出這個異常,因此一次迴圈,不能多次使用it.next()方法,每一次使用都訪問下一個物件。
5)集合的使用步驟
A:建立集合物件
B:建立集合元素物件
C:新增元素到集合中
D:遍歷集合
a:通過集合物件獲取迭代器物件
b:通過迭代器物件的hasNext()方法判斷元素是否存在
c:通過迭代器物件的next()方法獲取元素並移動到下一個物件