Collection集合知識點總結

什麼是集合

  1. Java是一門面向對象的語言.
  2. 爲了方便操做多個對象,那麼咱們就得把這多個對象存儲起來
  3. 想要存儲多個對象(變量),咱們就須要一個容器
  4. 集合就是一個放數據的容器(集合類存放的都是對象的引用,而非對象自己)

Collection的由來:

    • 集合能夠存儲多個元素,但咱們對多個元素也有不一樣的需求java

      • 多個元素,元素之間不能重複的
      • 多個元素,元素按某種規則排序的
    • 針對不一樣的需求:java就提供了不少集合類,多個集合類的數據結構不一樣。可是,結構不重要,重要的是可以存儲東西,可以判斷,獲取
    • 把集合共性的內容不斷往上提取,最終造成集合的繼承體系---->Collection

    Collection的繼承結構

    clipboard.png

    常見問題:數組

    數組和集合的區別

    1:長度的區別安全

    • 數組的長度固定
    • 集合的長度可變

    2:內容不容數據結構

    • 數組存儲的是同一種類型的元素
    • 集合能夠存儲不一樣類型的元素(可是通常咱們不這樣幹..)

    3:元素的數據類型性能

    • 數組能夠存儲基本數據類型,也能夠存儲引用類型
    • 集合只能存儲引用類型(你存儲的是簡單的int,它會自動裝箱成Integer)

    何時使用集合,何時使用數組?

    使用數組的缺陷:spa

    1. 數組長度設置太小就形成溢出
    2. 若是數組的長度設置過大,就形成內存空間浪費(由於數組的長度是固定的)

    爲何還要使用數組呢 ?

    1. 集合的底層都是經過數組來實現的

    2.數組的效率更高.例如:IO流 byte[] arr=new byte[1024];就是使用的數組線程

    怎麼選擇集合?

    須要惟一嗎?code

    須要:Set
    
                須要制定順序嗎?
    
                            須要:TreeSet
    
                            不須要:HashSet
    
                            可是想要一個和存儲一致的順序(有序):LinkedHashSet
    
      不須要:List
    
                        須要頻繁增長或者刪除元素嗎?
    
                            須要:LinkedList
    
                            不須要:ArrayList

    前綴名就是該集合的數據結構.後綴名就是該集合所屬的體系對象

    看到array:就要想到數組,就要想到查詢快,有角標
    
    看到link:就要想到鏈表,就要想到增刪快,就要想到 add  get  remove+first last 方法
    
    看到hash:就要想到哈希表,就要想到惟一性,就要想到元素須要覆蓋hashcode方法和equals方法
    
    看到tree:就要想到二叉樹,就要想到排序,就要想到兩個接口Comparable和Comparator

    Collection的常見方法

    clipboard.png

    數組轉換成集合

    clipboard.png

    集合轉換成數組

    clipboard.png

    Collection的主要子類List和Set

    List常見方法:blog

    clipboard.png

    List:有順序的collection,而且能夠包含重複元素。

    ├ArrayList 
                 - 數組結構,查詢元素快,添加慢(通常狀況下),線程不安全,效率高
             
    
    └Vector 
               - 數組結構,查詢元素快,線程安全.效率比ArrayList低
               - 如今幾乎不適用
    
    ├LinkedList 
                 - 鏈表結構,添加元素快,查詢慢,線程不安全,效率高

    細節說明:
    LinkedList不一樣於前面兩種List,它不是基於數組的,因此不受數組性能的限制。
    他的每個節點(Node)都包含了三方面的內容:
    1.節點自己的數據: E item;
    2.上一個節點的信息:Node<E> prev;
    3.下一個節點的信息:Node<E> next;
    因此當對LinkedList作添加,刪除動做的時候就不用像基於數組的ArrayList同樣,必須進行大量的數據移動。只要更改nextNode的相關信息就能夠實現了,這是LinkedList的優點。 因此LinkedList集合添加數組效率高

    LinkedList的經常使用方法:

    clipboard.png

    注意事項:LinkedList在內存中不是連續的,ArrayList在內存中是連續的.

    List集合的遍歷方式:
    方式一:迭代器模式,假設集合名爲(al)

    Iterator<String> iterator = al.iterator();
    while (iterator.hasNext()) {
    String s = iterator.next();
    System.out.println(s);
    }

    擴展:使用ListIterator方式進行遍歷,能夠在遍歷的過程當中對集合進行增刪改查,只有list有這種方式,使用ListIterator方式還能進行反向遍歷
    方式二:加強for

    for (String s : al) {
    System.out.println(s);
    }

    方式三:普通for (List特有)

    for (int i = 0; i <al.size(); i++) {
    System.out.println(al.get(i));
    }

    List總結:

    1. 基於Array的List(Vector,ArrayList)適合查詢,而LinkedList 適合添加,刪除操做
    2. 全部的List中能夠有null元素,例如[ tom,null,1 ]
    3. 全部的List中能夠有相同的元素,例如Vector中能夠有 [ tom,koo,too,koo ]
    4. 全部的List中只能容納單個不一樣類型的對象組成的表(單列集合),而不是Key-Value鍵值對。例如:[ tom,1,c ]
    5. List是有序的Collection,使用此接口可以精確的控制每一個元素插入的位置。用戶可以使用索引(元素在List中的位置,相似於數組下 >標)來訪問List中的元素,這相似於Java的數組。
    6. ArrayList和Vector的區別:ArrayList是非線程安全的,效率高;Vector是基於線程安全的,效率低
    7. LinkedList:底層基於鏈表實現,鏈表內存是散亂的,每個元素存儲自己內存地址的同時還存儲下一個元素的地址。鏈表增刪快,查找慢
    8. List接口有三個經常使用實現類:LinkedList,ArrayList,Vector

    Set :不包含重複元素的Collection。

    ├HashSet (數據結構是哈希表)
    
    HashSet 怎麼確認惟一?
    首先判斷的是兩個元素的哈希值確認元素是否相同,若是相同,再判斷兩個對象的內容是否相同
    
    判斷哈希值是否相同,便是判斷hashCode方法,判斷內容是否相同,便是判斷equals方法
    注意:若是哈希值不一樣,是不須要判斷equals方法的
    
    若是兩個哈希值相同會形成哈希衝突,通常狀況下,哈希值都是不會衝突的(這裏不作詳細介紹)    
    
    記住:若是元素要存儲到HashSet集合中,必須覆蓋hashCode和equals方法.
    通常狀況下,若是定義的類會產生不少對象,好比人,學生,書,一般都是覆蓋hashCode和equals方法.創建對象是否相同的依據.
    
    
    
    
    └LinkedhashSet     (HashSet的一個子類,一個鏈表)
        LinkedhashSet能夠保證元素的有序!
    
    └TreesSet    (排序,不重複,無索引)

    clipboard.png

    Set的遍歷方式:

    方式一:迭代器

    Set<String> set = new HashSet<String>();
    Iterator<String> it = set.iterator();
    while (it.hasNext()) {
      String str = it.next();
      System.out.println(str);
    }

    方式二:加強for

    for (String str : set) {
          System.out.println(str);
    }

    Set知識點講解

    1. 雖然Set同List都實現了Collection接口,可是他們的實現方式卻大不同。List基本上都是以Array爲基礎。可是Set則是在 HashMap的基礎上來實現的,這個就是Set和List的根本區別。HashSet的存儲方式是把HashMap中的Key做爲Set的對應存儲項。
    2. 這個也是爲何在Set中不能像在List中同樣有重複的項的根本緣由,由於HashMap的key是不能有重複的。
    3. HashSet中的元素是不能重複的,若是使用add(Object obj)方法添加已經存在的對象,則會覆蓋前面的對象
    4. HashSet實現的基礎是Map(HashMap)
    5. HashSet是一種不包含重複的元素的無序Collection。
    6. 元素無放入順序,元素不可重複(注意:元素雖然無放入順序,可是元素在set中的位置是有該元素的HashCode決定的,其位置實際上是固定的)

    集合排序

    方式一(讓Bean類實現Comparable接口重寫compareTo方法) 天然排序

    clipboard.png

    返回值 0 , 不存

    正數 ,       右邊  
        負數 ,       左邊

    方式二(自定義一個類實現Comparator接口重寫compare方法,經過構造方法傳入自定義類的對象)比較器排序

    clipboard.png

    clipboard.png好比:String ,Integer 對象 ,實現特殊的排序需求, 須要傳遞比較器的子類對象 .

    相關文章
    相關標籤/搜索