CoreJava學習4——集合之Collection框架和List集合

Collection框架和List集合

   集合框架中包含了一系列不同數據結構(線性表,查找表...),是用來保存一組數據的結構。

Collection下面有兩個自接口:List和Set.

   List和Set最重要的區別在於:

   1)、List可以重複存放同一個元素,而Set不行。所以List是可重複集,Set是不可重複集。

   2)、List是有序集合,可以通過索引使用元素;而Set是無序集合。

List下常用有ArrayList,LinkedList。

Set下有HashSet和TreeSet等。

1、Collection常用方法

   int size():返回集合裏邊包含的對象個數

   boolean isEmpty():是否爲空(不是null而是裏邊沒有元素)

   boolean contains(Object o):是否包含指定對象

   boolean clear():清空集合

   boolean add(E e):向集合中添加對象

   boolean remove(Object o):移出某個對象

   boolean addAll(Collection <?extends E> c):將另一個集合中的所有元素添加到集合中。

   boolean removeAll(Collection<?> c):移出集合中與另一個集合中相同的全部元素。

   Iterator<E> iterator():返回該集合的對應的迭代器。

例:

List list1 = new ArrayList();
List list2 = new ArrayList();
List list3 = new ArrayList();     
list1.add("1");
list1.add("2");
list1.add("3");     
list2.add("4");
list2.add("5");     
list3.add("1");
list3.add("2");     
list1.addAll(list2);
System.out.println("list1"+list1);    //{1,2,3,4,5} 
list1.removeAll(list3);        //刪除交集的部分
System.out.println("list1"+list1);    //{3,4,5} 
/** 只保留和給定集合元素相同的元素,其餘的刪掉。保留交集部分 */
list1.retainAll(list2);
System.out.println("list1"+list1);//{4,5}



2、ArrayList和LinkedList

  List接口是Collection的子接口,用於定義線性表數據結構,可以將List理解爲存放對象的數組,只不過元素的個數可以動態增加或者減少。

  List接口最常見的實現類爲ArrayList和LinkedList,分別用動態數組和鏈表的方式實現了List接口。

  可以認爲他們的方法在邏輯上完全一樣,只是在性能上有差別,ArrayList更適合於隨機訪問,而LinkedList更適合於插入和刪除,在性能不是特別要求情況下可以忽略這個差別。  

  1)ArrayList——動態數組實現(自動擴容/維護)的List:可以通過下標迅速的索引到對應的元素,但是在刪除和插入時移動較多元素。    

  2)LinkedList——鏈表實現的List:在插入和刪除時只需要改變連接“指針”即可實現。

由於我們可以任意添加不同的對象,這樣添加很方便,但是在獲取時容易出現“類造型異常”。

   獲取元素時,得到的都是Object,若要轉換成實際類,就要造型。

   在造型之前需要判斷,否則就會出現造型異常ClassCastException。通常我們使用的是一種類型的對象。


3、List常用方法

1)ArrayList重寫的toString()方法依次調用了它所包含對象的toString()方法,而且Point類也重寫它的toString()方法。

2)List實現類的contains方法用於判斷集合中是否包含某一個對象,具體的邏輯是:依次調用集合所包含對象的equals方法與判斷對象比較,如果有返回true則包含。因此,至於集合中的對象應妥善的重寫equals方法,就Point而言,如果重寫了equals方法,且邏輯是x,y全部相同則返回true,則list.contains(p)將返回true.

3)remove方法同樣和集合中對象的equals方法相關,首先通過調用equals方法找到對象,然後再刪除。


4、基於下標的get和set方法

List除了繼承Collection定義的方法外,還根據線性表的數據結構定義了一系列方法。

   1)get(int index)方法,獲取集合中索引的元素。

       注:這個方法是List中獨有的,返回的是Object

   2)Object set(int index,Object obj):將給定的元素替換集合中索引爲index的元素,返回的是被替換的元素。        

   3)add和remove有方法重載        

       add(int index, Object obj):將給定的元素插入索引處,原位置上及後面的元素順序向後移(插隊)。

       Object remove(int index):刪除指定索引處的元素,該方法的返回只是被刪除的元素。      


第17個、

5、List其他常用方法

   List還提供類似String的indexOf和lastIndexOf方法,用於在集合中檢索某個對象,其判斷邏輯爲:(o==null?get(i)==null:o.equals(get(i)))

   1)int indexOf(Object obj):返回首次在集合中出現該元素的索引值。

   2)lastIndexOf(Object obj):返回最後一次在集合中出現該元素的索引值。

 還有可以將集合轉換爲數組的方法:    

   3)toArray():將集合轉化爲數組。這裏參數僅僅是告知集合要轉換的數組類型,並不會使用我們提供的數組,所以不需要給長度。

    集合中的元素應爲同一個類型。

   String[] array = (String[])list.toArray(new String[0]);  


6、迭代器

所有的Collection的實現類都實現了其iterator方法,該方法返回一個Iterator接口類型對象,用於實現集合元素的迭代遍歷。

Iterator定義有三個方法:

boolean hasNext():判斷指針後邊是否有元素,是否還有未迭代的元素。

E next():指針後移,返回當前的元素。

void remove():在原集合中刪除剛剛返回的元素。

每次next方法調用完成後只能調用一次remove方法,該方法刪除剛剛next方法返回的元素。

在迭代的過程中不能調用集合的remove等方法刪除元素,否則會有ConcrrentModificationException異常。

注:    

   對於List而言,可以通過基於下標的get方法進行遍歷,而iterator方法是針對Collection接口設計,所有實現了Collection接口的類都可以使用  Iterator實現迭代遍歷。例:

List list = new ArrayList();
list.add("1");
list.add("2");
list.add("%");
list.add("%");
list.add("2");
list.add("1");     
Iterator it = list.iterator();//實例迭代器對象
while (it.hasNext()){
    //使用hasNext()方法判斷是夠還有未迭代的元素
    String str = (String)it.next();//調用next返回該元素         
    if ("%".equals(str)) {
        it.remove();
        /* 每次next方法調用完成後只能調用一次remove方法,該方法刪除剛剛next方法返回的元素。
         * 在迭代的過程中不能調用集合的remove等方法刪除元素,否則會有ConcrrentModificationException異常。
         */
        //list.remove(str);//錯誤,會出現異常***
    }
}
System.out.println(list);//迭代後輸出集合
//也可以使用for來迭代
/*for (Iterator iterator = list.iterator(); iterator.hasNext();) {
    String str = (String) iterator.next();
    System.out.println(str);
}*/

迭代器在迭代元素時要求不能對該集合的元素進行改變,就如上面不能使用集合的remove等方法刪除元素,否則會有ConcrrentModificationException異常。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章