基礎篇——集合框架

寫代碼的四點:
     1.明確需求。要做什麼?
     2.分析思路。要怎麼做?(1,2,3……)
     3.確定步驟。每一個思路要用到哪些語句、方法和對象。
     4.代碼實現。用具體的語言代碼將思路實現出來。

學習新技術的四點:
     1.該技術是什麼?
     2.該技術有什麼特點?(使用需注意的方面)
     3.該技術怎麼使用?(寫Demo)
     4.該技術什麼時候用?(在Project中的使用場景 )

----------------------早計劃,早準備,早完成。-------------------------

集合框架概述:

        在實際的使用中,我們有了更多的需求,有了更多的容器(每個容器都有自己的數據結構,因此其功能也不同),在不斷向上抽取的過程中,出現了體系,最終形成了集合框架。
        集合框架是爲了表示和操作集合而規定的一種統一的標準的體系結構,任何集合框架都包含三大塊內容:對外的接口、接口的實現和對集合運算的算法。
        1.接口:即表示集合的抽象數據類型,例如Collection、List、Set、Map等。
                     之所以定義多個接口,是爲了以不同的方式操作集合對象。
                     接口提供了讓我們對集合中所表示的內容進行單獨操作的可能。
        2.實現(類):即集合框架中接口的具體實現,例如ArrayList、HashSet、HashMap等。
                                   實際上它們就是那些可複用的數據結構。
        3.算法:在一個實現了某個集合框架中的接口的對象身上,完成某種有用的計算的方法。
                     例如:搜索、排序等,這些算法通常是多態的,因爲相同的方法,
                     可以在同一個接口被多個類實現時, 有不同的表現。
                     實際上算法就是可複用的函數。
        集合框架的運用減少了設計辛勞、提高了速度質量、提高了複用性,再經過程序員合理的利用,已經成爲了軟件開發中必不可少的強大工具。
        注意:1.集合中存儲的都是對象的引用地址;
                  2.集合中不能存儲基本數據類型,jdk1.5後可以這麼寫,
                     但是存儲的還是對象(基本數據類型包裝類對象)。
                  3.集合存儲的時候自動提升爲Object類型,取出的時候如果需要使用元素的
                     特有內容,必須進行向下轉型。

Collection(集合)

        概述:可以存放一組數據的數據結構,這種數據結構稱爲Collection集合,是一種容器。
                  1.Collection是一個接口,其定義了集合的相關功能方法。
                  2.Collection接口是Set、List、Queue接口的父接口。

        Set:

                 是對Collection的一種擴展,方法和Collection一致。
                 稱爲不可重複集,該集合中不允許存放重複的元素,是無序的集合。
                 Set集合可以通過foreach和Iterator遍歷集合中的元素。
                 注:重複的元素指的並非是同一個元素,而是指equals方法比較結果爲true的元素。

                 常用的實現類爲HashSet和TreeSet:
                 1.HashSet;
                    a.底層數據結構是哈希表結構,所以導致該集合存儲元素的時候是無序的,
                       如果想按照自身排序,需重寫父類中的hashCode()、equals()方法;
                    b.線程是不同步的,所以效率方面比較高效;
                 2.TreeSet;                
                    a.底層數據結構是二叉樹結構,可以對集合中的元素進行排序,
                       也可以根據指定比較器進行排序,需在該集合的構造函數中傳入比較器參數。

        List:

                 是對Collection的一種擴展。
                 用於定義線性表數據結構,稱爲可重複集,該集合中允許存放重複的元素。
                 通常表示一個列表(數組、隊列、鏈表、棧等),是有序的集合。
                 集合中的元素是可以重複的,通過索引就可以精確的操作集合中的元素。
                  List集合可以通過for、foreach和Iterator遍歷集合中的元素。
                 注:重複的元素指的並非是同一個元素,而是指equals方法比較結果爲true的元素。

                 常用的實現類爲ArrayList和LinkedList,還有不常用的Vector(已過時):
                      1.ArrayList:更適合於隨機訪問;
                    a.底層數據結構是數組結構,所以查詢速度快,增刪速度慢;
                    b.因爲該集合底層爲數組結構,所以當存儲的元素個數大於自定義數組的長度時,
                       集合會自動以原有數組長度的50%延長,並將原數組中的元素複製到該數組中。
                    c.安全性方面線程不安全、線程不同步;
                 2.LinkedList:更適合於插入和刪除;
                    a.底層數據結構是鏈表結構,所以查詢速度慢,增刪速度快;
                    b.特有方法:addFirst()、addLast()可以將指定元素添加到列表開頭和結尾處;
                       getFirst()、getLast()可以獲取列表中的第一個元素和最後一個元素;
                       removeFirst()、removeLast()可以刪除列表中的第一個元素和最後一個元素。
                    c.安全性方面線程不安全、線程不同步;
                 3.Vector(已過時);jdk1.2版本後被ArrayList集合取代。
                    a.底層是數組結構;
                    b.與ArrayList集合不同之處在於,安全性方面線程安全、線程同步,所以效率低,
                       數組自動擴展以原有數組長度的100%延長。

        Queue(隊列):

                JDK1.5新增,
                與Set、List集合類的主要區別在於:Queue主要用於存儲數據,而不是處理數據。

        Set和List的區別:
                1.Set接口實例存儲的是無序的、不重複的元素,無索引;
                   List接口實例存儲的是有序的、可重複的元素,含有索引。
                2.a.Set檢索效率低,刪除和插入效率高,插入和刪除不會引起元素位置改變。
                      實現類有HashSet、TreeSet;
                   b.List檢索效率高,刪除和插入效率低,插入和刪除會引起元素位置改變。
                      可以動態增長,根據實際存儲的數據的長度自動增長List的長度。
                      實現類有ArrayList、LinkedList、Vector(已過時);

Map

        概述:可以以鍵值對(key-value)的形式存儲數據的數據結構,這種數據結構稱爲Map。
                  Map是一種把鍵對象和值對象進行關聯的容器。
                  1.Map存入的元素的key不能重複(不能包含兩個equals爲true的key),
                     value可以重複。
                  2.Map存入的元素的key、value的類型均爲引用類型(基本數據類型的包裝類,
                     例如:String、Integer)。但是爲了保證在使用時不會造成數據混亂,通常使用
                     泛型去約束key、value的類型。
                  3.Map中的鍵值對以Entry類型的對象實例形式存在;
                  4.Map接口提供了返回key值集合、value值集合、Entry值集合的方法;

        常用的實現類爲HashMap和TreeMap,還有不常用的HashTable(已過時):
        HashMap:是一個常用的Map的子類實現,使用散列算法實現。
                1.底層數據結構爲哈希表結構,無序的;
                2.可以存入null值和null鍵,線程不同步;
                注:a.哈希算法hash也稱散列,結果叫哈希值。數組中存儲的都是元素與哈希值
                         的對應關係,該數組稱爲哈希表,查詢速度比數組快,重複元素存不進去,
                         保證元素的唯一性。
         
                              b.哈希衝突怎麼解決?元素的哈希值(hashcode())一致了,會再次判斷元素
                                的內容是否相同(equals()),如果equals返回true,表示兩個元素相同;
                                如果返回false,表示兩個元素不相同,繼續通過算法算出位置進行存。

        TreeMap:
                1.底層數據結構爲二叉樹結構,默認是升序的;
                2.線程不同步,在構造函數中傳入比較器參數,可以用於Map集合中鍵值進行排序;

        HashTable:在jdk1.2版本後被HashMap取代;
                1.底層數據結構爲哈希表結構;
                2.不能存入null值和null鍵,線程同步;

List和Map的區別:
        1.List是存儲單列數據的集合;
           Map是存儲鍵值對的雙列數據的集合;
        2.List中存儲的數據是有序的,並且允許重複;
           Map中存儲的數據是無序的,鍵不能重複,值可以重複;

Iterator(迭代器)

        遍歷一個集合中的元素,通常使用以下三種方式:
        1.for循環;
        2.foreach增強for循環;
        3.Iterator迭代器:使我們能夠通過循環來得到或刪除集合中的元素,不需要擔心
                                    在遍歷過程中會超出集合的長度。
           Iterator是一個對象,實現了Iterator接口或ListIterator接口。
           ListIterator繼承了Iterator,以允許雙向遍歷列表和修改元素。

     Set集合可以通過foreach和Iterator遍歷集合中的元素。

//創建Set集合
Set<String> set = new HashSet<>() ;
// Set<String> set = new TreeSet<>();
set.add( "李四" ) ;
set.add( "張三" ) ;
set.add( "王麻子" ) ;

//通過Iterator遍歷Set集合中的元素
Iterator<String> iterator = set.iterator() ;
while (iterator.hasNext()) {
        String setData = iterator.next() ;
        LogUtil. e ( "set集合中的元素" , setData) ;
}

//通過foreach(增強for循環)遍歷Set集合中的元素
for (String setData : set) {
        LogUtil. e ( "set集合中的元素++++" , setData) ;
}

       List集合可以通過for、foreach和Iterator遍歷集合中的元素。

//創建List集合
List<String> list = new ArrayList<>() ;
// List<String> list = new LinkedList<>();
list.add( "李四" ) ;
list.add( "張三" ) ;
list.add( "王麻子" ) ;

//通過for循環遍歷集合中的元素
for ( int i = 0 ; i < list.size() ; i++) {
        LogUtil. e ( "List集合中的元素" , list.get(i)) ;
}

//通過foreach(增強for循環)遍歷集合中的元素
for (String listData : list) {
        LogUtil. e ( "List集合中的元素+++" , listData) ;
}

//通過Iterator遍歷集合中的元素
Iterator<String> iterator = list.iterator() ;
while (iterator.hasNext()){
        LogUtil. e ( "List集合中的元素---" , iterator.next()) ;
}

        Map接口中沒有迭代器,通過Set集合遍歷Map中的鍵值對。

//創建Map
Map<String , String> map = new HashMap<>() ;
// Map<String, String> map = new TreeMap<>();
map.put( "name" , "張三" ) ;
map.put( "gender" , "男" ) ;
map.put( "age" , "25" ) ;

//map.keySet()獲取到所有的鍵,存儲到set集合中,並返回該集合。
//因爲Set有迭代器,每次迭代出來的是一個鍵,再根據鍵來得到值。
Set<String> mapSet = map.keySet() ;
for (String key : mapSet) {
        LogUtil. e ( "Map中的鍵值對" , key + "," + map.get(key)) ;
}

//map.entrySet()獲取到所有鍵值對的映射關係,存儲到set集合中,
//每次迭代出來的是一個映射關係,
//從這個映射關係中既可以得到鍵,也可以得到值。
Iterator<Map.Entry<String , String>> iterator = map.entrySet().iterator() ;
while (iterator.hasNext()) {
        Map.Entry<String , String> entry = iterator.next() ;
        LogUtil. e ( "Map中的鍵值對+++" , entry.getKey() + "," + entry.getValue()) ;
}

for (Map.Entry<String , String> stringStringEntry : map.entrySet()) {
        LogUtil. e ( "Map中的鍵值對---" , stringStringEntry.getKey() + "," + stringStringEntry.getValue()) ;
}

//map.values()獲取到所有的值,無法遍歷key
Collection<String> values = map.values() ;
for (String value : values) {
    LogUtil. e ( "Map中的值" , value) ;
}


Collection和Collections的區別:

        1.Collection是集合類的上級接口,繼承它的接口主要有Set和List。
        2.Collections是針對集合類的幫助類,提供了一系列靜態方法
           實現對各種集合的搜索、排序、線程安全化等操作。

集合和數組的區別:

        1.集合的長度可變,但是數組的長度固定;
        2.數組只能通過下標訪問元素,下標類型只能是數字型;
           而有的集合可以通過任意類型查找所映射的具體對象;
        3.數組中存儲的是同一類型的元素,可以存儲基本數據類型值;
           集合存儲的是對象,而且對象的類型可以不一致;