天天看點

持有對象(看think in java)

思考為什麼要引入容器這個概念?

Java有多種方式儲存對象(應該是對象的引用),例如使用數組,數組時儲存一組對象中的最有效的方式,如果你想儲存一組基本類型的資料,也推薦使用這種方式,但大家知道數組是具有固定尺寸的,你必須視線知道你要需要多少個對象。但是在一般的情況中,你在寫程式中并不知道将需要多少個對象,或者是否需要更加複雜的方式來存儲對象,是以數組尺寸固定很不爽!

為了解決上述問題,引入了容器的概念。容器提供了完善的方法來儲存對象,你可以使用這些工具來解決數量驚人的問題。Java日容器類可以自動調整自己的尺寸,是以與數組不同,你可以将任意數量的對象放到容器中,并不擔心容器設定為多大。

基本概念    

java容器類庫用途是儲存對象。分為2類:

 1. Collection

      一個獨立元素的序列,這些元素都服從一條或多條規則。List必須按照插入的順序儲存元素,Set不能有重複元素。Queue按照排隊規則來确定對象産生的順序(通常與插入的順序相同)。

 2. Map

      一組成對的鍵值對對象,允許使用鍵來查找值,将數字和對象關聯到一起。映射表允許我們使用另一個對象來查找某個對象,也被稱為關聯數組或字典。Map很強大!

應盡量使用接口去聲明對象,例如使用List接口聲明對象:

List<Apple> apples = new ArrayList<Apple>(); 

而代替ArrayList<Apple> apples = new ArrayList<Apple>(); 因為你可以很友善的修改你的實作,就像下面這樣:

List<Apple> apples = new LinkedList<Apple>(); 

但是這種方法并總是好的,因為某些類有額外的功能,例如:LinkedList類具有在List接口中未包含的方法,而TreeMap類也具有在Map接口中未包含的方法。如果你們需要這些方法,就不能向上轉型成為更通用的接口。

   建立出一個具體類的對象,将其轉型為對應的接口,在其餘的代碼中都使用這個接口。

***Arrays類 Collections類

    包含一些常用的排序 查詢 轉換等靜态方法

     class A{}

       class AA1 extends A{}

       class AA2 extends A{}

       class AAA1 extends AA1{}

       class AAA2 extends AA1{}

       public class MyTest {

             public static void main(String[] args) {    

                  List<A> list1=Arrays. asList ( new AA1(), new AA2()); //right

                  List<A> list2= Arrays. asList ( new AAA1(), new AAA2()) ; //wrong

                  List<A> list3=Arrays.<A> asList ( new AAA1(), new AAA2()); //right

            }

      }

        第二種asList,由于添加的是AAA1 AAA2對象,預設應為List<A1>,是以出錯,需在asList前聲明類型,但

          List<A> list=Arrays. asList ( new AA1(), new AA2());

                  Collections. addAll (list, new AAA1(), new AAA1() );

    Collections的addall方法正确,因為第一個參數說明了list的類型。

List接口在Collection的基礎上添加了大量的方法,使得可以在List中間插入和移除元素。

   1 ArrayList和 LinkedList

    都按照被插入的順序儲存元素,差別在于執行某些操作時的性能。且LinkedList包含的操作也多于ArrayList.

(1)ArrayList  :長于随機通路元素,但是在List的中間插入和移除元素時較慢。

你可以把ArrayList  當做“可以自動擴充自身的數組”來看待,使用ArrayList也相當簡單:建立一個執行個體,用add()插入對象;然後用get()通路這些對象,此時需要索引,就像數組一樣,但是不需要方括号。ArrayList還有一個size()方法,使你知道有多少個元素添加進來,進而不會不小心因索引越界而引發錯誤。

    (2)LinkedList:在List中間插入删除較快,提供優化的順序通路。随機通路時較慢,特性集較ArrayList  大。

    各種Queue以及棧的行為,由LinkedList提供支援。

    1.HashSet TreeSet LinkedHashSet 

    輸出顯示在Set中,每個相同的項隻儲存一次,但存儲的方式不同:

     (1)  Hashset存儲方式複雜,但保證了最快的擷取速度

   (2)TreeSet按照升序儲存對象

   (3)LinkedHashSet按照添加的順序儲存對象

    可以使用鍵來查找對象,類似于數組下标。Map.put(key,value)插入資料,Map.get(key)查找資料。鍵要求唯一。存儲方式不是順序存儲,速度快。不必指定Map的尺寸,因為它自己會自動的調整。

   (1)HashMap使用最快的查找技術,存儲無順序。

   (2)TreeMap按照比較結果升序儲存。

   (3)LinkedHashMap按照插入順序儲存鍵,同時保留HashMap的查詢速度。

容器缺點:使用容器,必須對容器的确切類型進行程式設計,但若像更換或擴充至其他容器,必須重寫代碼。疊代器可以解決這個問題,實作代碼的重用。它是一個對象,它的工作是周遊并選擇序列中的對象,而用戶端程式員不必知道或關心該序列底層的結構。它是輕量級對象,建立的代價小。

是以經常對疊代器有些奇怪的限制:

1)使用方法Iterator()要求容器傳回一個Iterator。Iterator将準備好傳回序列中的第一個元素。

2)使用next()獲得序列的下一個元素。

3)使用hasNext()檢查序列中是否還有元素。

4)使用remove()将疊代器新近傳回的元素删除。

    疊代器能夠将周遊序列的操作與序列底層的結構分離,它統一了對容器的通路方式,這是它的威力所在。

    先進先出容器,是區域之間傳輸對象的可靠的途徑,在并發程式設計中尤為重要。

    PriorityQueue確定調用peek() poll() remove() 時,擷取的元素是隊列中優先級最高的元素。即可以對隊列中的元素進行排序操作。

    都可以實作與底層容器的解耦。Collection可以使用foreach,看起來更清晰,但必須實作Collection接口中的方法,如果選擇繼承 AbstractCollection類,仍必須實作iterator方法和size方法。而在類内部使用Iterator則可以避免以上不足,是将隊列 和消費隊列的方法連接配接在一起耦合度最小的方式。

    實作了Iterable接口的類,都可以被用在foreach中。數組到Iterable之間必須進行顯式轉換。

Face your past without regret. Handle your present with confidence.Prepare for future without fear. keep the faith and drop the fear. 面對過去無怨無悔,把握現在充滿信心,備戰未來無所畏懼。保持信念,克服恐懼!一點一滴的積累,一點一滴的沉澱,學技術需要不斷的積澱!