1. 程式人生 > >黑馬程式設計師_學習日記六_集合一

黑馬程式設計師_學習日記六_集合一

---------------------- android培訓java培訓、期待與您交流! ----------------------

 集合框架(集合類)體系概述

     集合類:面嚮物件語言對事物的體現都是以物件的形式,所以為了方便對多個類物件進行操作,就對物件進行儲存,集合就是儲存物件最常用的一種方式,也可以稱之為容器。

    陣列也可以儲存物件,那麼陣列和集合類有什麼區別呢?陣列雖然可以儲存物件,但是長度是固定的;而集合類長度是可變的。陣列中還可以儲存基本資料型別,而集合類中只能儲存物件,而且還可以儲存不同型別的物件。

    集合類有以下特點:1.集合類只能儲存物件,2.集合的長度是可變的,3.集合可以儲存不同型別的物件。

    集合類中有很多容器,即子類,為什麼會出現這麼多的容器呢?因為每個容器對資料的的儲存方式都有不同,這個儲存方式可以稱之為:資料結構。

集合框架共性方法

    Collection是集合層次結構中的根介面。Collection表示一組物件,這些物件我們也稱之為Collection的元素。一些Collection是允許有重複的元素存在的,而另一些則不允許。一些Collection是有序的,而另一些則是無序的。

    Collcetion集合中有以下共性方法:

    1.boolean add(E e),往容器中新增一個元素,引數是Object,以便接受任意型別的物件。

    2.boolean addAll(Collection<? ExtendsE> c),往容器中新增一組元素。比如將A容器中的所有元素新增到B容器中。

    3.void clear(),清除此容器中的所有元素。

    4.boolean remove(Object o),從容器中移除指定元素的單個例項,如果存在的話。

    5.boolean removeAll(Collection<?> c),從容其中移除指定的一堆元素。比如將A容器中的所有元素從B容器中全部移除。

    6.boolean contains(Object o),判斷是否包含指定的元素,注意:這個方法底層呼叫的是equals()方法,有必要時,必須覆寫equals()方法。

    7.boolean containsAll(Collection<?> c),判斷A容器中是否包含B容器中所有的元素。

    8.boolean isEmpty(),判斷此容器是否為空,如果是,則返回true。

    9.int size(),返回此容器中元素的個數。

    10.Object[] toArray(),將容器變為陣列並返回。

集合框架迭代器(Iterator)

    Collection中還有一個重要的方法,那就是iterator(),該方法用於獲取迭代器Iterator,用於取出集合中的元素,返回值型別是容器的元素上進行迭代的迭代器。那什麼是迭代器呢?其實就是集合中取出元素的一種方式。

    Iterator是一個迭代器介面。這個介面定義了三個方法:hasNext(),next(),remove()。

   1.boolean hasNext(),如果集合中仍有元素可以迭代,則返回true。

    2.Object next(),返回集合中迭代的下一個元素。

    在集合當中,由於每個容器的資料結構都不一樣,導致容器當中元素儲存的結構不一樣,所以取出的動作細節也不一樣,但是都有其共性的部分。比如都要判斷容器是否為空和取出,這樣就可以將這些共性的內容抽取,這樣就形成了Iterator介面。

    Java中把這些取出方法都定義在了集合的內部,這樣方便可以直接訪問集合中的元素,所以取出方式就被封裝在了一個內部類中。這些內部類都實現了一個介面,那就是Iterator介面。那麼如何訪問集合中的物件呢?就是通過呼叫iterator()方法先生成一個迭代器,再呼叫各容器中的具體的訪問元素的方法。

List集合及其共性方法

    List這個集合介面有如下特點:元素是有序的,並且元素可以重複,該集合體繫有索引。此介面的使用者可以對集合中每個元素的位置進行精確的控制,使用者可以根據元素的整數索引訪問元素,並搜尋集合中的元素。

    List集合中除了含有Collection介面中的那些方法外,本身還提供了一些方法,主要有:

    1.void add(int index, Object obj),在集合的指定位置插入預設元素。

    2.void addAll(int index, Collection<?>c),在指定的index位置新增指定的集合內的元素。

    3.Object get(int index),獲取指定位置的元素。

    4.int indexOf(Object obj),獲取該元素在集合中第一次出現的位置,如果不包含該元素,則返回-1。

    還有一些List集合特有的方法:

    1.Object set(int index, Object obj),用指定元素替代集合中索引位置的元素。

    2.List<E> subList(int fromIndex, inttoIndex),獲取集合中指定的fromIndex和toIndex之間的集合,包含頭不包含尾,返回值型別為List。

    3.listIterator()。

List集合-ListIterator

    在Iterator介面中,只提供了三個方法,而沒有提供對集合新增元素的方法,如果此時要對集合中新增元素,即呼叫了Iterator的next()方法,又呼叫了集合中的add()方法,這時,虛擬機器就會報ConcurrentModificationException(併發修改異常)的異常。那如果要向集合中新增元素,要怎麼做呢?

    List集合有自己特有的迭代器,那就是ListIterator介面,該介面繼承自Iterator。在迭代時,如果還通過Collection集合物件的方法操作集合中的元素,就會發生併發修改異常。所以。在迭代時,只能用迭代器Iterator提供的方法操作元素,但是Iterator提供的方法是有限的,只能對元素進行進行判斷,取出,刪除的操作,如果想要其他的操作如新增,修改等,就需要使用其子介面ListIterator,它過載了集合中的一些方法,並提供了一些另外的方法供呼叫。

    該介面只能通過List集合的listIterrator()方法獲取。比如:

    ListIterator listIte =list.listListIterator;

List集合具體物件的特點

    List這個集合介面中常見的三個子類分別是ArrayList、LinkedList、Vector。

    1.ArrayList這個集合底層的資料結構使用的是陣列資料結構。特點在於每個元素都有對應的角標,查詢元素的效率高,但是增加和刪除元素的效率不高。

    2.LinkedList這個集合底層的資料結構是連結串列資料結構。連結串列的特點是增加和刪除元素的效率高,但是查詢元素的效率低。

    3.Vector這個集合底層的資料結構是陣列資料結構。它在JDK1.0的時候就已經存在了。它和ArrayList的區別在於Vector這個集合是執行緒同步的,而ArrayList是執行緒不同步的。但是Vector被ArrayList替代了,已經很少使用。

Vector中的列舉

    Vector這個集合類中有一個比較特殊方法:Enumeration elements();這個方法的返回值是一個Enumeration物件,這個方法就相當於Collection中的iterator()這個方法,是Vector特有的方法,叫做列舉器。

    Enumeration(列舉)是一個介面,它是Vector特有的讀取方式。這個介面中提供了hasMoreElements()、nextElement()兩個方法。他們的功能類似於Iterator這個介面中的hasNext()、next()兩個方法。

LinkedList

    LinkedList集合的資料結構是連結串列資料結構。

    LinkedList中的特有方法有以下幾個:

    1.void addFirst(Object obj),將指定元素插入到此集合的開頭。

    2.void addLast(Object obj),將指定元素插入到此集合的結尾。

    3.Object getFirst(),獲取此集合的第一個元素。

    4.Object getLast(),獲取此集合的最後一個元素。

    5.Object removeFirst(),移除並返回此集合的第一個元素。

    6.Object removeLast(),移除並返回此集合的最後一個元素。

    以上方法如果集合為空,則會丟擲NoSuchElementException。所以在JDK1.6版本中,出現了以上方法的替代方法。

    1.boolean offerFirst(),將指定元素插入到此集合的開頭。

    2.boolean offerLast(),將指定元素插入到此集合的結尾。

    3.Object peekFirst(),獲取此集合的第一個元素,如果集合為空,則返回null。

    4.Object peekLast(),獲取此集合的最後一個元素,如果集合為空,則返回null。

    7.Object pollFirst(),移除並返回此集合的第一個元素,如果集合為空,則返回null。

    8.Object pollLast(),移除並返回此集合的最後一個元素,如果集合為空,則返回null。

    總結:在ArrayList和LinkedList這兩個集合中有一部分方法底層會呼叫Object類的equals()方法,比如remove()和contains()方法,當在程式當中需要比較兩個物件時,要注意看看是否需要覆寫equals()方法。

集合框架-HashSet

    Set這個集合內的元素是無序的,即存入和取出元素的順序不一定一致,並且不能有相同的元素。這個集合提供的方法和Collection是相同的。該介面有兩個常用的實現子類,那就是HashSet和TreeSet。

    HashSet這個集合的底層的資料結構是雜湊表,它的儲存是按照元素的雜湊值來進行的。並且執行緒是非同步的。

HashSet儲存自定義物件

   在HashSet集合中,是如何保證元素集合中唯一性的呢?主要是通過自動呼叫該元素的兩個方法hashCode()和equals()來完成的。如果元素的HashCode值相同,才會繼續判斷equals是否為true,如果元素的HashCode值不同,則不會呼叫equals()方法。當要使用到HashSet這個集合時,要考慮覆寫這個物件的hashCode()和equals()方法來保證元素的唯一性。

HashSet判斷和刪除的依據

    對於判斷元素是否存在以及刪除等操作,都是先呼叫元素的hashCode()和equals()方法。

    總結:在List這個集合類當中,判斷元素是否存在,還有刪除指定元素只調用equals()方法,而在Set集合類中,首先判斷元素的雜湊值是否相同,如果相同,再呼叫equals()方法,這個是HashSet的特點。這個是由於集合的資料結構不同而造成的。

 ---------------------- android培訓java培訓、期待與您交流! ----------------------