集合與泛型

 

Java中集合框架層次結構:

Iterable接口:
    Collection接口:
    List接口:
    
Iterator接口:
    ListIterator接口:

Collection接口: 
    List接口:
        ArrayList類:
        LinkedList類:
        Vector類:
            Stack
    Set接口:
        HashSet類:
        TreeSet類:
        
Map接口:
    HashMap類:
    Hashtable類:
    TreeMap類:

Collection和Map沒有關係,
Collection和Collections的區別是Collection是接口,Collections是類

    
數組:
    數組也是容器,它是定長的,不會自動擴容;一塊連續的內存,訪問快;可以存儲基本數據類型和引用數據類型的對象
    
java.util.*;
集合:變長的,自動擴容,只能存儲引用數據類型的對象
    數組或者鏈表
    
    分類:
        1)集:Set接口:元素無序且不重複,可以放null,但是隻能存放一個
            無序:
                元素存入順序和集合內存儲的順序不同,打印結果是按照存儲順序來打印
            無重複:
                兩個對象e1和e2,如果e1.equals(e2)返回true,則認爲e1和e2重複,在set中只保留一個(先判斷hashCode()方法再用equals()方法進行判斷)

            1-1)HashSet:內部對象散列存取,採用哈希技術
                線程不安全,不同步的,存取速度比較快,底層實現是用HashMap實現
                1)初始容量:默認初始容量16
                2)加載因子:默認0.75,
                    一般情況下,加載因子係數必須<=1,當元素個數超過容量長度*加載因子係數的時候,自動進行擴容
                3)擴容增量:原容量的一倍
            1-2)TreeSet:存入順序跟存儲順序不同,但存儲按照排序存儲
                線程不安全,不同步的,此類保證排序後的set按照升序排列元素
        2)列表:List接口:有序的,允許重複,可以放null,且可以放多個
            ArrayList:
                初始容量:默認初始容量10
                加載因子:1???
                擴容增量:原容量的0.5倍+1;
            Vector:
                初始容量:默認初始容量10
                加載因子:1
                擴容增量:原容量的1倍
        
        
            ArrayList和LinkedList的區別:
                1)ArrayList:線性順序存儲,是一種線性表
                    底層數據結構是數組,查詢比較快,插入/刪除比較慢
                2)LinkedList:數據結構中鏈表的Java實現
                    底層數據結構是雙向鏈表,查詢用二分查找,所以查詢效率比ArrayList低,插入/刪除效率比ArrayList高
            ArrayList和Vector的區別:底層的數據結構都是數組
                1)ArrayList:
                    線程不安全的,不同步的,數據不安全,速度比較快
                2)Vector:
                    線程安全的,同步的,數據安全,速度比較慢
        3)字典:Map:鍵值對,鍵是唯一的
            1)HashMap:數組+單向鏈表+紅黑樹
                初始容量:默認16;
                加載因子:默認0.75
                擴容增量:原容量的1倍
            2)Hashtable:數組+單向鏈表+紅黑樹(平衡二叉樹)
                初始容量:默認11
                加載因子:默認0.75
                擴容增量:原容量的1倍+1
            3)TreeMap:按照鍵升序排序,底層數據結構是紅黑樹
            
            HashMap和Hashtable的區別:
                1)HashMap:
                    a)線程不安全,不同步,數據不安全,但是效率高;
                    b)允許鍵值可以爲null;
                2)Hashtable:
                    a)線程安全,加鎖同步,數據安全,效率比較低;
                    b)不允許鍵值爲null
                    
            HashMap和TreeMap的區別:
                1)HashMap:
                    a):HashMap基於哈比表實現,所以裏面元素不進行排序
                    b):HashMap可以通過調優初始容量和負載因子,優化HashMap空間的使用
                    c)HashMap性能優於TreeMap
                2)TreeMap:
                    a):TreeMap基於樹實現,所以裏面的元素按照鍵升序排列
                    b):TreeMap沒有調優選項,因爲該數總處於平衡狀態
                    
            Map中對元素進行修改:
                Map中因爲鍵必須是唯一的,所以要對map中的元素進行修改時,重新添加一個元素,鍵與要修改的元素的鍵一致即可,去覆蓋掉原來的數據
    如何選擇集合類:
        1)Set內存放的元素不允許重複,List存放的元素有一定的順序
        2)Map的應用主要在利用鍵/值對進行快速查詢 
        3)ArrayList和LinkedList的區別在於隨機查詢性能上ArrayList要好,但LinkedList的中間元素的插入與刪除性能好
        4)HashSet和TreeSet的區別在於集合內元素是否排序
    注意點:
        集合中的add()方法接受的是一個Object對象的參數,在獲取集合中的對象時,必須進行造型(強制類型轉換)操作
        
    Iterator接口:單向遍歷,ListInterator:雙向遍歷
        1)Iterator對象稱作迭代器,用來方便的實現對容器內的元素進行遍歷操作
        2)所有實現了Collection接口的集合類都有一個iterator()方法,返回一個實現了Iterator接口的對象
        3)Iterator對象實現了統一的一個用來遍歷Collection中對象的方法
        4)Iterator是爲遍歷而設計,能夠從集合中取出元素和刪除元素,但是沒有添加元素的功能
        5)Iterator的功能上比較簡單,
        5)使用中,只能單向移動

    Collections類:
        Comparable:java.lang.*;
        Comparator:java.util.*;
        常用方法:
            Object  max(collection c):
                返回集合中的最大元素,需要考慮比較接口的實現
            Object  min(Collection c):
                返回集合中的最小元素
            void  reverse(Collection c):
                把集合中的元素順序反轉
            void  copy(List dest,List src):
                src集合中元素複製到dest集合,dest集合中的元素數量要比src集合中的多,否則報錯
            void  fill(List list,Object o):
                填充list集合,填充元素爲o
            int  binarySearch(List list,Object key):
                對排序後的集合list進行查詢元素操作
            void  sort(List list):
                對一種List做排序
        
    泛型:參數化的數據類型:數據類型可以像參數傳遞一樣進行傳遞
        1)安全的
        2)減少了數據類型轉換所帶來的風險,減少了裝箱拆箱
        分類:
            1)泛型方法:
                [訪問修飾符] <T>返回值 方法名([參數列表]){方法體}
            2)泛型類:增加泛型類無意中增加了繼承的複雜性
                類中的成員的數據類型不確定時,可以做成泛型類
                聲明:
                    [訪問修飾符] class 類名<T>{類的成員}
                使用:
                    類名<T> 引用名 = new 類名<T>();
            3)泛型接口:
                [訪問修飾符] interface 接口名<T>{接口的成員}
    
    類型T  元素E 鍵K 值V
    
    T:包括Object在內的所有的類型都可以
        <T extends Number>:表示把T限定在Number及其子類的類的類型
            extends後面只能是一個類
        <T extends Number&Comparable&...>
            限定在Number類並且實現了Comparable接口的數據類型,接口可以連接多個
    通配符:?
    上界通配符: ? extends A  : A類或者A類的子類
    下界通配符: ? super  A   : A類或者A類的父類
        
數組:length        字符串:length()        集合:size()

isEmpty():判斷的是集合的長度是否爲0,即集合中是否中存在元素,而不是判斷集合是否爲null


//擴充0次,指定了初始容量直接開闢相應的空間
ArrayList list = new ArrayList(20);

ArrayList進行自動擴容時,是找一個新的內存,把原來的數據拷貝過來,然後加上新的數據,造成內存浪費,所以在明確要存儲多少個元素時,要指定長度,避免擴容

 

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