天天看點

黑馬程式員-集合

---------------------- android開發、java教育訓練、期待與您交流! ----------------------

黑馬程式員-集合

Collection層次結構的根接口。Collection表示一組對象,這些對象也稱為 collection 的元素。一些 collection 允許有重複的元素,而另一些則不允許。一些 collection 是有序的,而另一些則是無序的。JDK 不提供此接口的任何直接 實作:它提供更具體的子接口(如 Set 和 List)實作。此接口通常用來collection并在需要最大普遍性的地方操作這些 collection。

此接口中包含的“破壞性”方法,是指可修改其所操作的 collection 的那些方法,如果此 collection 不支援該操作,則指定這些方法抛出 UnsupportedOperationException。如果是這樣,那麼在調用對該 collection 無效時,這些方法可能,但并不一定抛出 UnsupportedOperationException。例如,如果要添加的 collection 為空且不可修改,則對該 collection 調用 addAll(Collection)方法時,可能但并不一定抛出異常。

一些 collection 實作對它們可能包含的元素有所限制。例如,某些實作禁止 null 元素,而某些實作則對元素的類型有限制。試圖添加不合格的元素将抛出一個未經檢查的異常,通常是 NullPointerException 或 ClassCastException。試圖查詢是否存在不合格的元素可能抛出一個異常,或者隻是簡單地傳回 false;某些實作将表現出前一種行為,而某些實作則表現後一種。較為常見的是,試圖對某個不合格的元素執行操作且該操作的完成不會導緻将不合格的元素插入 collection 中,将可能抛出一個異常,也可能操作成功,這取決于實作本身。

集合的四大優點:

1,提供有用的資料結構和算法,進而減少程式設計工作;提供極大的便利性!

2,提高了程式速度和品質,因為它提供了高性能的資料結構和算法;提高資料操作的品質和性能!

3,允許不同 API 之間的互操作,API之間可以來回傳遞集合;

4,可以友善地擴充或改寫集合;

集合架構中常用的接口:Collection 是将多個元素組成一個單元的對象;

Collection中的共性方法:

1:add() 将指定對象存儲到容器中;add 方法的參數類型是Object 便于接收任意對象

2:addAll() 将指定集合中的元素添加到調用該方法和集合中

3:remove() 将指定的對象從集合中删除

4:removeAll() 将指定集合中的元素删除

5:clear() 清空集合中的所有元素

6:isEmpty() 判斷集合是否為空

7:contains() 判斷集合何中是否包含指定對象

8:containsAll() 判斷集合中是否包含指定集合;使用equals()判斷兩個對象是否相等 

 9:int size()    傳回集合容器的大小

10: toArray()   集合轉換數組

Collection接口有兩個子接口:List、Set

(一)   List(清單)特點:List繼承自Collection接口。List是一種有序集合,List中的元素可以根據索引(順序号:元素在集合中處于的位置資訊)進行取得/删除/插入操作。

取出LIst集合中元素的兩種方式:

         get(int index):通過腳标擷取元素。

         iterator():通過疊代方法擷取疊代器對象。

 List接口中的常用類:

(1),Vector:線程安全,但速度慢,已被ArrayList替代。(不做贅述)

(2),ArrayList:線程不安全,但查詢速度快。

              ArrayList 對象是長度可變的對象引用數組,類似于動态數組 ;

              繼承 AbstractList 并實作 List 接口 ;

              随着元素的添加,元素的數目會增加,清單也會随着擴充;

              通路和周遊對象時,它提供更好的性能;

        ArrayList  類的構造方法詳解: 

              ArrayList()  :建立一個空 Arraylist

              ArrayList(Collection c) :  根據給定集合的元素建立數組清單 

              ArrayList(int size)    :使用給定大小建立一個數組清單。向數組清單添加元素時,此大小自動增加

(3),LinkedList:相對于ArrayList來說,它是連結清單結構,增删速度快。

ArrayList和LinkedList的用處差別:

當操作是在一列資料的後面添加資料而不是在前面或中間,并且需要随機地通路其中的元素時,使用ArrayList會提供比較好的性能;當你的操作是在一列資料的前面或中間添加或删除資料,并且按照順序通路其中的元素時,就應該使用LinkedList了。

(二)  Set(集) :不可以存放重複元素,元素存取是無序的。

1,HashSet:用底層是哈希表結構,是通過使用稱為散列法的機制來存儲資訊的,元素并沒有以某種特定順序來存放;

雖然線程不安全,但存取速度快。

       HashSet:通過equals方法和hashCode 方法來保證元素的唯一性。

2,TreeSet:提供一個使用樹結構存儲Set接口的實作,對象以升序順序存儲,通路和周遊的時間很快。也是線程不安全的;

      通過compareTo或者compare 方法中的來保證元素的唯一性。

HashSet和TreeSet小差別:

當需要對資料隻進行查詢操作的時候,可以選擇TreeSet;當需要進行存取操作的時候,盡量選擇HashSet;

疊代:是取出集合中元素的一種方式;因為Collection中有iterator方法,是以每一個子類集合對象都具備疊代器。

疊代的兩種用法for和while:

疊代器的注意事項:1,疊代器在Collcection接口中是通用的,它替代了Vector類中的Enumeration(枚舉)。2,疊代器的next方法是自動向下取元素,要避免出現NoSuchElementException。3,疊代器的next方法傳回值類型是Object,是以要記得類型轉換。集合架構中的泛型:本部落格後面<JDK1.5新特性>裡面有詳細介紹!Map集合的特點:Map與Collection在集合架構中屬并列存在,但是它存儲的是鍵值對,裡面的鍵相當于一個set集合;Map相對于Collection來說,它存儲元素使用put方法;Map集合沒有直接取出元素的方法,而是先轉成Set集合,在通過疊代擷取元素;并且Map集合中鍵要保證是唯一的;Map集合中類的特點:1,HashMap:線程不安全,速度快,允許存放null 鍵,null值。  HashMap常用的構造方法有:     HashMap(): 建立一個具有預設容量和負載系數的空映射;   HashMap(int size): 建立一個具有指定大小的容量和預設負載系數的空映射;   HashMap(int size, float load): 建立一個具有指定的容量和指定的負載系數的空映射;    HashMap (Map map): 建立一個具有指定 map 映射的散列映射;2,TreeMap:對鍵進行排序,排序原理與TreeSet 相同。

相關代碼例題筆記如下:

(1)---------------------------------------------------------------

import java.util.*;

class  CollectionDemo

{

  public static void main(String[] args)

  {

      method_get();

  }

  public static void method_get()

  {

      ArrayList al1=new ArrayList();

      al1.add("java1");

      al1.add("java2");

      al1.add("java3");

      al1.add("java4");

      Iterator it=al1.iterator();//擷取疊代器,用于取出集合中的元素

      while(it.hasNext())

      {

         sop(it.next());

      }

  }

  public static void method_2()

  {

      ArrayList al1=new ArrayList();

      al1.add("java1");

      al1.add("java2");

      al1.add("java3");

      al1.add("java4");

      ArrayList al2=new ArrayList();

      al2.add("java7");

      al2.add("java8");

      al2.add("java5");

      al2.add("java6");

      al1.retainAll(al2);

      sop("al1==="+al1);

      sop("al2==="+al2);

  }

  public static void base_method()

  {

      //建立一個集合容器,使用Collection接口的子類,AyyayList

      ArrayList al=new ArrayList();

      al.add("java1er");//add(Object obj);

      al.add("java2edygd");//添加元素

      al.add("java3fghghjj");

      al.add("java4234354545");

      sop(al);//列印集合

      sop("size="+al.size());//擷取個數,即集合的長度

      al.remove("java2edygd");//删除元素

      sop("删除後的集合"+al);

      al.clear();//清空集合   

      sop("java1er是否存在"+al.contains("java1er"));//判斷元素

      sop("集合是否為空"+al.isEmpty());

  }

  public static void sop(Object obj)

  {

      System.out.println(obj);

  }

}

(2)---------------------------------------------------------------

import java.util.*;

class CollectionsDemo

{

  public static void main(String[] args)

  {

      binarySearchDemo();

      sortDemo();

  }

  public static void binarySearchDemo()

  {

      List<String> list=new ArrayList<String>();

      list.add("oahskfjsjk");

      list.add("ahskfjs");

      list.add("jahskf");

      list.add("lahs");

      list.add("uaa");

      list.add("xza");

      list.add("xza");

      Collections.sort(list);//清單集合中的元素按自然順序排序

      sop(list);

      int index=Collections.binarySearch(list,"uaa");

      sop("index="+index);

  }

  public static void sortDemo()

  {

      List<String> list=new ArrayList<String>();

      list.add("oahskfjsjk");

      list.add("ahskfjs");

      list.add("jahskf");

      list.add("lahs");

      list.add("uaa");

      list.add("xza");

      list.add("xza");

      sop(list);

      Collections.sort(list,new Strlencomparator());//清單結合中的元素按照字元串長度進行排序

      sop(list);

      Collections.sort(list);//清單集合中的元素按自然順序排序

      sop(list);

      String max1=Collections.max(list);//清單集合中的最大元素字元串

      sop(max1);

      String max2=Collections.max(list,new Strlencomparator());//清單集合中的最長長度的字元串

      sop(max2);

  }

  public static void sop(Object obj)

  {

      System.out.println(obj);

  }

}

class Strlencomparator implements Comparator<String>

{

  public int compare(String s1,String s2)//定義字元串長度比較方法

  {

      if(s1.length()>s2.length())//字元串s1長度大于s2,傳回正數

         return 1;

      if(s1.length()<s2.length())//字元串s1長度小于s2,傳回負數

         return -1;

      return s1.compareTo(s2);//字元串s1長度等于s2,字元串s1、s2按照字元串比較方法排序

  }

}

(3)---------------------------------------------------------------

import java.util.*;

class  CollectionToArray

{

  public static void main(String[] args)

  {

      ArrayList<String> al=new ArrayList<String>();

      al.add("abc1");

      al.add("abc2");

      al.add("abc3");

      String[] arr=al.toArray(new String[0]);

      System.out.println(Arrays.toString(arr));

  }

}

---------------------- android開發、java教育訓練、期待與您交流! ----------------------

繼續閱讀