1. 程式人生 > >javaAPI_集合基礎_Collection

javaAPI_集合基礎_Collection


集合基礎1_集合概述以及Collection集合

1.為什麼會出現集合?
我們學習的是面嚮物件語言,而面嚮物件語言對事物的描述是通過物件體現的,為了方便對多個物件進行操作,我們就必須把這多個物件進行儲存。
而要想儲存多個物件,就不能是一個基本的變數,而應該是一個容器型別的變數,在我們目前所學過的知識裡面,有哪些是容器型別的呢?
陣列和StringBuffer。但是呢?StringBuffer的結果是一個字串,不一定滿足我們的要求,所以我們只能選擇陣列,這就是物件陣列。
而物件陣列又不能適應變化的需求,因為陣列的長度是固定的,這個時候,為了適應變化的需求,Java就提供了集合類供我們使用。

2.陣列和集合的區別?
A:長度區別
陣列的長度固定
集合長度可變
B:內容不同
陣列儲存的是同一種類型的元素
而集合可以儲存不同型別的元素
C:元素的資料型別問題
陣列可以儲存基本資料型別,也可以儲存引用資料型別
集合只能儲存引用型別

3.java集合以及體系


4.Collection類

(1).Collection類的概述
Collection:是集合的頂層介面,它的子體系有重複的,有唯一的,有有序的,有無序的。


(2).Collection類的常用功能

A:新增功能
boolean add(Object obj):新增一個元素
boolean addAll(Collection c):新增一個集合的元素

B:刪除功能
void clear():移除所有元素
boolean remove(Object o):移除一個元素(移除指定元素)
boolean removeAll(Collection c):移除一個集合的元素(只要有一個元素被移除了,那麼就返回true)

C:判斷功能
boolean contains(Object o):判斷集合中是否包含指定的元素
boolean containsAll(Collection c):判斷集合中是否包含指定的集合元素(必須要包含全部)
boolean isEmpty():判斷集合是否為空

D:獲取功能
Iterator<E> iterator()(重點):迭代器,集合遍歷的特有方式
E next():獲取元素,並移動到下一個位置。
boolean hasNext():是否還有下一個元素

E:長度功能
int size():元素的個數
面試題:陣列有沒有length()方法呢?字串有沒有length()方法呢?集合有沒有length()方法呢?

F:交集功能
boolean retainAll(Collection c):兩個集合都有的元素,獲取倆個集合的交集,誰呼叫該方法,那麼元素就會跑去那一個集合中。
也就是說集合A和集合B做交集,最終結果儲存在A中,B集合內容不變,返回值表示的是A集合中
的內容是否發生過改變。

G:把集合轉換為陣列
Object[] toArray():集合轉化為素組,這樣可以實現對集合的遍歷

(3).基本功能測試
public static void main(String[] args) {
//建立Collection物件,由於Collection是一個介面,所以是不能夠例項化的,所以能夠使用其子類物件
Collection c = new ArrayList<>();
c.add("hello");
c.add("world");
c.add("java");
//清空集合
//c.clear();

//移除指定元素
//c.remove("hello");

//判斷是否包含指定元素
c.contains("hello");

//判斷集合是否為空
c.isEmpty();

//獲取元素個數
c.size();
}


(4).Collection集合並遍歷物件(迭代器)
public static void main(String[] args) {
//建立Collection物件,由於Collection是一個介面,所以是不能夠例項化的,所以能夠使用其子類物件
Collection c = new ArrayList<>();
c.add("hello");
c.add("world");
c.add("java");

//lterator是一個介面,實際返回的是它的子類物件
//注意,由於next在呼叫一次之後,就會移動到下一個物件上面去,所以不要多次的呼叫next()方法
Iterator lt = c.iterator();
while(lt.hasNext()){
String str = (String) lt.next();
System.out.println(str);
}

System.out.println("--------------------------");
//使用for迴圈同樣可以獲得相同的效果,同時lt1在迴圈完畢就是垃圾,可以提高一點效率
for(Iterator lt1 = c.iterator();lt1.hasNext();){
String str = (String) lt1.next();
System.out.println(str);
}
}


(5).迭代器原理
A:迭代器是依賴於集合而存在的。

B:迭代器為什麼不定已成為一個類,而是定義成為一個介面?
假設迭代器定義的是一個類,這樣,我們就可以建立該類的物件,並呼叫該類的方法來實現集合的遍歷。但是呢?我們應該思考一個這
樣的問題。由於java中提供了很多的集合類。而這一些集合類的資料結構是不同的,所以,儲存的方式和遍歷的方式應該是不一樣的。
進而他們的遍歷方式也應該是不一樣的,最終就沒有定義迭代器類。
而無論你是哪一種集合,都應該具備獲取元素的操作,並且,最好在輔助有判斷功能,這樣在獲取前,先判斷。這樣就不會容易出錯。
也就是說判斷和獲取功能是每一個集合遍歷的時候鎖具備的。而每一種集合的方式又不太一樣,所以設計者們就把這幾個功能提取出來
並不提供實現,這一種方式就是介面。
那麼,真正的具體的實現類是在哪裡呢?
在真正的具體的子類中,以內部類的方式體現的。

C:迭代器原始碼
a:collection集合繼承了一個父介面
public interface Collection<E> extends Iterable<E> {....}

b:Iterable介面中只有一個方法
public interface Iterable<T> {
Iterator<T> iterator();
}
c:Iterator介面中有三個抽象方法(注意:抽象方法要求繼承子類必須繼承並重寫)
//介面中中的方法存在預設修飾符:public abstract
public interface Iterator<E> {
boolean hasNext();
E next();
void remove();
}
d:Collection要實現上述三個方法(hasNext(),next(),remove()),但是並沒有在Collection中給出具體的實現。
那麼為什麼呢?具體的實現又是在哪裡?
因為Collection是一個介面,不給出具體實現。
我們在建立物件的時候是:Collection c = new ArrayList();那麼,我們就往ArrayList裡面找,它應該是給出了具體實現。

e:看ArrayList中的iterator()方法
public Iterator<E> iterator() {
return new Itr();
}
f:這一個時候,我們發現返回的是一個: new Itr();這是一個介面,居然能夠作為返回值,那麼也就是說這裡面一定給出了具體的實現

g:Itr()方法
private class Itr implements Iterator<E> {...}//一個內部類,實現了haNext(),next(),remove()方法。

(6).一個Collection的程式碼練習:
//省略學生物件

public static void main(String[] args) {
Collection c = new ArrayList<>();

Student s = new Student();
s.setName("張三");
s.setAge(12);

Student s1 = new Student();
s1.setName("李四");
s1.setAge(13);

//新增元素
c.add(s);
c.add(s1);

Iterator lt = c.iterator();
while (lt.hasNext()) {
Student getStudent = (Student) lt.next();
System.out.println(getStudent.getName()+"------"+getStudent.getAge());

}