集合類(常見的集合類:Collection、List、Set、ArrayList、linkedList、Vector、HashSet、TreeSet)


一、集合類

    定義:一種為了對多個對象進行操作而進行存儲的方式。

    1、與數組的區別:
      數組:可以存儲對象,也可以存儲基本數據類型,但是一次只能存儲一種類型,數組長度固定。

      集合:只能存儲對象,長度可變,可以存儲不同類型的對象。

    集合眾多的原因:每一種容器對數據的存儲方式都有所不同,這個存儲方式為:數據結構。

二、Collection


      1.增加對象:boolean add(Object object) 如果集合中沒有object,那么添加它並返回true;
       如果集合中存在object(且該集合不能包含重復元素),則返回false。
       另外:集合中存儲的都是對象的引用(地址)。(Object可以放入任何對象)

      2.獲取長度:int size(): 返回此集合中的元素個數。

      3.刪除元素:
        void clear(): 清楚集合中的所有元素(除非該集合不支持clear方法)。
        boolean remove(Object o): 刪除集合中所有e.equals(e)==true的元素,並返回true。否則返回false。

                        (Arraylist中改寫為:移除相等的首個元素)
        Boolean removeAll(Cellection c): 移除和集合c 的交集中的元素。

      4.判斷元素:
        Boolean contains(Object o):判斷集合中是否包含元素(對象)o。
        boolean containsAll(Collection c):判斷集合c是否是調用集合的子集。

       5.交集: boolean retainAll(Cellection c): 僅保留和集合c的交集。



三、元素的取出(迭代器)

      迭代器: 就是一個Iterator接口的子類對象,封裝了取出其綁定集合的元素的方式。

        步驟: 1、通過調用集合的 Iterator iterator()方法返回該集合的迭代器,
            2、將此迭代器賦值給 一個 Iterator 型對象引用。 
            3、通過此引用,調用迭代器的方法操作集合:
              1)、boolean hasNext():如果集合中任有元素可以迭代,則返回true。
              2)、Object next():返回迭代的下一個元素(列表中還在)。
              3)、void remove():從迭代器指向的集合中 移除 迭代器返回的最后一個元素。

        注意:你不能同時用迭代器和集合同時去操作同一組元素, 有可能會拋出並發異常。
        原因:迭代器已經創建, 之后通過集合方法操作的元素過程(比如說增加),迭代器並不知道集合做了什么操作,還是只能
           按照原來的元素列表操作,就會發生錯誤。


四、List 接口

      Collection 接口的子接口

      特點:元素是有序的, 而且元素可以重復。 該類集合中有索引(角標)。


      其特有的常見方法:

        1、凡是可以操作角標(索引的)的方法都是該體系特有的方法。

          增:
            void add(int index ,Object object);
            Boolean add(int index, Collection c);

          刪:
            remove(index):返回了移除的元素。
          改:
            set(index, element):在指定角標放入指定元素,返回原來的元素。
          查:
            get(index):返回index上的元素
            subList(start,end):返回一個自己列表(依賴於原集合)

      注:List集合特有的迭代器: listIterator(); 列表迭代器 (注意與iterator區別)

      listIterator:
        1、定義、解釋。

            是iteretor的子接口。

            在進行迭代操作的時候,不能使用集合方法對同組元素進行操作(原因在iterator講解處)。
          而iterator的操作方法又比較少(只有判斷、查找、刪除,沒有添加),局限了對元素組的課操作性。
          所以在list集合中就定義了新的迭代器: listIterator。

        2、listIterator中新增的方法:
          1)、void add(): 在返回的元素后面的加入一個新元素
          2)、void set(object): 使用新元素替換返回的最后一個元素。
          3)、Boolean hasPrevious(): 逆向遍歷列表(相對應: hasNext())



    list 集合在涉及到需要判斷元素是否相同時,底層調用的都是equals方法。(contains、 remove方法等)



      list集合下,常見三大集合

            1、ArrayList:底層數據結構使用數組結構: 查詢速度快。但是增刪稍慢。(線程不同步,數組0.5倍延長)
            2、Linkedlist:底層使用鏈表數據結構: 增刪塊, 但是查詢慢。
            3、Vector:底層是數組數據結構:查詢贈刪慢(線程同步,數組百分百延長)已經被ArrayList取代。

      Vector: 在1.2版本過后,便幾乎被ArrayList取代,同步的。

        不過其有兩個特有之處:

  
            1)、 在去方法中帶有Element的方法是在1.1還沒有Collection框架的時候特有的方法,與從list實現來的方法幾乎一樣。

            2)、 Vector除了有迭代器(iteretor、listIteretor )外,還有一個枚舉(與iteretor類似)
                Enumeration en = v.elements(); 通過Vector對象創建一個枚舉
                en.hasMornElements(); (類似迭代的hasNext())
                en.nextElement(); (類似迭代的Next())

      注意:枚舉的所有功能都被迭代包含了,而且枚舉方法名太長,不利於書寫,所以,新的開發應當優先使用迭代而不是枚舉。


      linkedList:

      底層使用鏈表數據結構。

      特有方法:
          1)、addFirst()從集合列表開頭插入元素
          2)、addLast()從集合列表結尾插入元素(等效於add())
          3)、getFirst()拿到第一個元素,返回這個元素
          4)、getLast()拿到最后一個元素,返回這個元素
          5)、removeFirst()移除第一個元素,返回這個元素
          6)、removeLast()移除最后一個元素,返回這個元素

        (如果列表中沒有元素,那么:3到6方法拋 空元素異常)

      注: 在1.6版本以后,新添加了獲取和移除方法, 在空列表的時候,會返回null,不會發生異常。
          1)、peekFirst()獲取 但 不移除 列表第一個元素,列表為空返回null

          2)、peekLast()獲取 但 不移除 列表最后一個元素,列表為空返回null
          3)、pollFirst()獲取 並 移除 列表第一個元素,列表為空返回null
          4)、pollLast()獲取 並 移除 列表第最后一個元素,列表為空返回null
      




 

 五、Set 接口

      Collection 接口的子接口

      特點:元素是無序(存入和取出的順序不一定一致)的,而且元素不能重復。 該類集合中沒有索引。

      Set集合的功能和Collection是一致的。


      Set集合下常見的子類集合:
                    HashSet:底層數據結構式: 哈希表。

                    TreeSet:




      HashSet:
          特點:元素無序(存入和取出的順序一定不一樣),而且元素唯一,沒有索引。

          底層數據: 底層使用哈希表作為數據結構。

          元素唯一性: 是通過元素的兩個方法: hashCode 和 equals 來完成的。
              如果兩個元素的HashCode值相同,就會判斷equals是否為true。
              如果兩個元素的HashCode值不同,就不會調用equals方法。

      注意:對於判斷元素是否存在、刪除等操作,都依賴於元素的hashCode、equals等方法。

      哈希表:給定表M,存在函數f(key),對任意給定的關鍵字值key,代入函數后若能得到包含該關鍵字的記錄在表中的地址,
        則稱表M為哈希(Hash)表,函數f(key)為哈希(Hash) 函數。

      (哈希值與內存地址值之間的關系:默認的哈希值是內存地址值計算的哈希值,但是只是為了給人看的,真正在
      內存中還是依靠內存地址值來進行運算的,而不是哈希值)


TreeSet:

  底層數據結構: 二叉樹 (保證元素唯一性的方法是保證compareTo 方法return 0)


      比較方式: 方式一、就是讓元素自己具有比較性,元素需要實現comparable接口,重寫其中得compareTo方法,這個排序叫做自然排序(默認排序)

              1、 無序性(按照輸入元素類中自定義的compareTo方法來排定存儲對象。)

              2、 單一性(通過判斷元素類中自定義的compareTo方法放回值是否為0來判斷元素是否相等。)

              3、 讓需要存入到TreeSet中的元素,實現comparable接口,該接口中定義了一個public int compareTo方法

              4、 compareTo 方法:我們需要在類定義中重寫該方法, public int compareTo,
            使得: 當有e.compareTo(e1)時,
              如果e大於e1則返回正數,當e小於e1則返回負數, 等於則返回0.
                而且當有e等於e1時, 可以定義附屬判斷條件來判斷 兩個對象的大小。


    注意:TreeSet 本情況的所有的底層比較原理只是調用了元素的compareTo方法,與 equals等方法都無關。
              (add、contains、remove等需要用到比較的方法)
      所以我們定義所有的比較都返回正數,那么靠遍歷迭代器取出的元素順序和存入順序一樣。
      如果定義所有的比較都返回負數,那么靠遍歷迭代器去除的元素順序和存入的順序相反。
      如果定義所有比較都返回0 ,那么就只能存入一個元素,最后也只能取出一個元素。






    方式二、當元素自身沒有比較性或者具有的比較性不是自身所需要的,那么就要讓集合自身具有比較性。
          那么就要在集合一初始化時定義比較方式(也就是調用集合的構造方法)

        1、 無序性(按照集合實例化的時候的比較器來排布元素的存儲順序。)

        2、 單一性(通過集合的比較器的compare方法返回值是否為0 來判斷元素是否相等。)

        3、 定義一個比價器的類,使其實現comparator接口, 重寫覆蓋其中的 int compare(T o1, T o2) 方法。

        4、 compare 方法:我們需要在比較器類定義中重寫該方法,int compare(Object o1, Object o2),
      使得: 我們在該方法中比較兩個對象,或者比較其對象的方法,或者直接定義一個數值返回。
          當返回值為正時代表o1大於o2,當返回值為負時代表o1小於o2,返回值為0 則代表兩個對象相等。

         而且當初步判斷有o1等於o1時, 可以定義附屬判斷條件來判斷 兩個對象的大小。



      注意:TreeSet 本情況的所有的底層比較原理只是調用了集合比較器的compare方法,與 元素equals等方法都無關。
          (add、contains、remove等需要用到比較的方法)
        所以我們定義所有的比較都返回正數,那么靠遍歷迭代器取出的元素順序和存入順序一樣。
        如果定義所有的比較都返回負數,那么靠遍歷迭代器去除的元素順序和存入的順序相反。
          如果定義所有比較都返回0 ,那么就只能存入一個元素,最后也只能取出一個元素。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM