Collection集合---(中)



----|   Collection  單列集合接口
---------|   List 接口,【遵從】List接口的子類, 有序,可重複
--------------|    ArrayList  ArrayList底層維護的是一個Object類型的數組
       特徵: 查詢速度快,增加,刪除慢
       什麼時候用ArrayList來保存數據:數組的查詢要求比較高,增加和刪除使用比較少
       的地方:例如 高校圖書管理系統  員工管理系統
                |     LinkList:底層維護的是一個鏈表
                 特徵:查找慢,增刪快
                |    Vector 底層維護的也是一個Object類型的數組,長度也是10和ArrayList一樣,
              但是Vector是線程安全的,操作效率低
---------| Set 接口 【遵從】Set接口的子類 無序,不可重複

                |   HashSet

                |   TreeSet

***********************************************************************************

 ArrayList的特有方法:
  不常用
  ensureCapacity(int minCapacity); 判斷當前指定的最小元素個數是否是minCapacity
  trimToSize(); 截斷底層維護的Object數組元素個數爲Size

 查詢快,增刪慢的原理
  因爲在底層維護的是一個Object類型的數組,可以利用數組的原理,通過下標來訪問元素
  增刪慢:
   增加慢是因爲如果增加到數組的有效元素個數最大值,ArrayList會調用grow方法
  擴容數組,擴容之後,會有一個copy操作,會把原始數據,進行一個完整拷貝,這個時間很長
   刪除慢是因爲刪除的時候會有一個數組整體左移操作,這個操作很浪費時間

1、ArrayList創建的時候默認的Object類型數組元素個數數多少?
 2. 調用ArrayList的無參構造函數創建一個ArrayList的對象時,請問默認的容器大小多少?如果長度
 不夠用,又自增多少?
   ArrayList底層維護的是一個Object類型數組,使用無參構造函數創建ArrayList對象的時候,默認的
   Object類型數組元素個數(容量)爲10,當長度不夠的時候,自動增長1.5倍左右。
   數組元素個數 + (元素個數 >> 1);

**********************************************************************************

ArrayList與Vector的區別:
      *   相同點:
      *     ArrayList和Vector底層維護的都是一個Object類型的數組
      *   不同點:
      *     1.ArrayList是線程不同步的,操作效率高
      *       vector是線程同步的,操作效率低
      *     2.ArrayList  jdk1.2出現的
      *       Vector 是jdk1.0出現的

**********************************************************************************

 LinkList中特有的方法:
      1.方法介紹
        addFirst(E e);
        addLast(E e);
        getFirst();
        getLast();
       
        removeFirst();
        removeLast();

************************************************************************

      |   Set接口,遵從接口的子類都有特徵:無序,不可重複
 *    |     HashSet底層使用了一個哈希表來支持,特徵:存取速度快
 * 
 *    HashSet的存儲實現原理:
 *     HashSet裏面添加元素的時候,Hashset會首先調用該元素的hashCode方法
 *      得到該元素的哈希值,通過哈希值的移位運算,就可以算出該元素在哈希表中的位置
 *           情況1:如果該哈希表中位置沒有任何一個元素,就會將元素放入到該哈希表中
 *           情況2:如果計算的該元素應該存放的位置上已經有其他元素,那麼就會調用這個元素的equals和已經在哈希表保存
 *                的元素進行比較,如果得到結果爲true,則後來者不能被保存到hash表中,如果爲false 這些元素共存
 *               
 *  無序:添加的元素的順序不一定是你展示出來的數據
 *  hashCode
 *  equals

***********************************************************************************************

TreeSet添加自定義元素:
 1. 往TreeSet集合中添加元素的時候,如果元素本身具備了自然順序的特徵,那麼就按照自然排序的順序添加

 2. 添加自定義元素,這些元素沒有一個自然順序,這裏添加不進入,我們就可以來提供一個當前類的一種比較規則
 ,要【遵從】Comparable接口,實現compareTo(T o)方法

 3. 如果比較元素的時候,compareTo方法返回的是0,表示這個兩個元素是一樣的,那麼這裏不允許添加,認爲
 是重複元素 (TreeSet和hashCode、equals方法沒有任何關係)

 4. 除了要去元素有自然順序,或者顯示Comparable接口之外,還有一種實現的方式,在創建TreeSet的時候
 傳入參數是一個自定義的比較器,這個比較器要求【遵從】Comparator接口

 如何創建自定義比較器:
 class 類名  implements Comparator {
 public compare(Object o1 , Object o2) {

 }
 }

 [發現]
 一個自定義類【遵從】了Comparable接口,實現了compareTo方法,這裏又給TreeSet提供了一個比較器
 這個自定義比較器是【遵從】Comparator接口,實現了compare方法,同時存在的情況下,TreeSet默認
 使用的比較規則是【自定義比較器】規則

 在這裏推薦使用自定義比較器

***如果遇到下面這樣的問題可以這樣回答

.  一個元素如果要添加到TreeSet裏面有什麼要求?如何滿足
     如果這個元素有自然順序時,則可以按照自然順序添加到TreeSet中,
     如果這個元素沒有一個自然順序時,則可以通過下面兩種方式:
    (1)提供一個當前類,此類遵從Comparable接口,並實現compareTo方法
     (2),自己創建一個比較器類,並遵從Comparator接口,並實現compare接口

*****************************************************************************************************************

 


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