1. 程式人生 > >學習筆記-基礎知識8-集合框架(1)上

學習筆記-基礎知識8-集合框架(1)上

集合框架(1)
1.集合類
為了方便對多個物件的操作,就要對物件進行儲存,集合就是儲存物件最常用的一種方式。
陣列和集合類同是容器:
陣列雖然也可以儲存物件,但長度是固定的;集合長度是可變的。
陣列中可以儲存任意資料型別,集合只能儲存物件。
集合類的特點:集合只用於儲存物件,集合長度是可變的,集合可以儲存不同型別的物件。

集合框架的構成及分類
Java集合類主要由兩個介面派生出來:
    Collection
        -Set :不能存放重複物件
        -List :可存放重複物件,有序
        -Queue :佇列
        -SortedSet:可對集合資料排序
    Map
        -SortedMap :可對集合資料排序

2.Collection介面
方法:
boolean add(Object o):該方法用於向集合裡面新增一個元素,若集合物件被新增操作改變了,返回true.
boolean addAll(Collection c):把集合c裡面的所有元素新增到指定集合裡面去,如果集合物件被新增操作改變了返回true.
void clear():清除集合裡面的所有元素,將集合長度變為0。
boolean contains(Object o):返回集合裡是否包含指定的元素。
boolean containsAll(Collection c):返回集合裡是否包含集合c 內所有的元素。
boolean isEmpty():返回集合是否為空(長度是否為0)。
Iterator iterator():返回一個Iterator物件,用於遍歷集合裡的元素。
boolean remove(Object o):刪除集合中指定元素o。
boolean removeAll(Collection c):從集合中刪除集合c裡面的元素。若刪除一個或以上返回true。
boolean retainAll(Collection c):從集合中刪除集合c裡不包含的元素。
int size():得到集合元素的個數。
Object[] toArray():把集合轉成一個數組,所有集合元素程式設計陣列元素。

3.Iterator介面
Iterator主要遍歷Collection集合中的元素,也稱為迭代器。
boolean hasNext():若被迭代的集合元素還沒有被遍歷,返回true.
Object next():返回集合的下一個元素.
void remove():刪除集合上一次next()方法返回的元素。(若集合中有多個相同的元素,都可以刪掉)
iterator對於集合才能用,for不同,只要是迴圈都可用。
迭代器的next方法返回值型別是Object,所以要記得型別轉換。

4.集合遍歷輸出方式


Iterator:迭代輸出
ListIterator:Iterator子介面,專門輸出List中的元素;
Enumeration:古老的輸出方式,迭代Vector元素,被Iterator取代;

集合遍歷輸出方式:
    Iterable 介面(迭代遍歷) ,用於集合
    Foreach 迴圈注:可以直接用,使用場合:陣列和Iterable物件!
    For迴圈:在()內例項化Iterable物件,進行遍歷!
    先用toArray方法輸出成為陣列,再用Foreach迴圈!

5.Set介面(元素不可以重複)
Set是Collection子介面;
Set無法記住新增的順序,不允許包含重複的元素。
當試圖新增兩個相同元素進Set集合,新增操作失敗,add()方法返回false。
Set判斷兩個物件是否相等用equals,而不是使用==。
即兩個物件equals比較返回true,Set集合是不會接受這個兩個物件的。

常用子類:
    -HashSet:雜湊存放
    -TreeSet:有序存放
Set:無序,不可重複元素
    -HashSet:資料結構是雜湊表,執行緒時非同步的.
        判斷兩個元素相等的標準是:兩個物件通過equals方法比較相等,並且兩個物件的hashCode方法返回值也相等。
    -TreeSet:底層資料結構是二叉樹,可對set集合中的元素進行排序。按照元素的自然順序排序
        判斷兩個物件相等的標準是:compareTo()方法比較返回0;

6.HashSet
HashSet類採用hash演算法儲存資料,具有良好的儲存和查詢功能。
雜湊儲存:不記錄新增順序;排列順序時,順序有可能發生變化;
執行緒不安全的,多個執行緒訪問一個HashSet要使用同步程式碼;
HashSet集合元素值允許是null,但是最多隻能有一個;
hash(翻譯為雜湊,或雜湊)演算法的功能:
保證通過一個物件快速找到另一個物件;
其演算法價值體現在速度,可以保證查詢快速執行;
當從HashSet中訪問元素時,
HashSet先計算該元素的hashCode(也就是該物件的hashCode方法返回值),
然後直接到該HashCode對應的位置取出該元素;

HashSet元素新增
當向HashSet 集合中存入一個元素時,
    HashSet會呼叫該物件的hashCode()方法來得到該物件的hashCode值, 
    判斷已經儲存在集合中的物件的hashCode值是否與新增的物件的hashCode值一致:
        若不一致:直接新增進去;
        若一致,再進行equals方法比較,
            equals方法如果返回true,表明物件已經新增進去了,就不會再新增新的物件了,
            否則新增進去;

如果我們重寫了equals方法,也要重寫hashCode方法,反之亦然;
HashSet集合判斷兩個元素相等的標準是:
    兩個物件通過equals方法比較相等,並且兩個物件的hashCode方法返回值也相等。

7.TreeSet
TreeSet是SortedSet介面唯一的實現,
與HashSet相比額外的方法有:
Comparator comparator():返回當前Set使用的Comparator,若返回null,表示以自然順序排序。
Object first():返回此set中當前第一個(最低)元素。
Object last():返回此set中當前最後一個(最高)元素。
SortedSet subSet(Object fromElement, E toElement):
返回此set的部子集, 其元素從fromElement(包括)到toElement(不包括)。
SortedSet headSet(Object toElement):返回此set的部分子集,其元素嚴格小於toElement。
SortedSet tailSet(Object fromElement):返回此set的部分子集, 其元素大於等於fromElement。
記住:排序時,當主要條件相同時,一定要判斷一下次要條件。
TreeSet的自然排序:元素自身具備比較性
TreeSet會呼叫元素的compareTo(Object o)方法來比較元素之間的大小關係,
然後將集合裡的元素按升序排列.
此時需要排序元素的類必須實現Compareble 介面,
並覆寫其intcompareTo(Object o)方法;該方法用於比較物件,
若:obj1,compareTo(obj2),
返回0,表示兩個物件相等,
若返回一個正整數,表示obj1 大於obj2,
若返回一個負整數,表示obj1 小於obj2;
TreeSet集合而言,判斷兩個物件相等的標準是:compareTo()方法比較返回0;

TreeSet的定製排序:元素自身不具備比較性時,或者具備的比較性不是所需要的,
就定製排序,比如降序排序,就可以使用Comparator介面了:
    該介面包含int compare(Object o1,Object o2)方法:
        用於比較兩個物件的大小,比較結果和compareTo方法一致;
要實現定製排序,需要在建立TreeSet集合物件時,提供一個一個Comparator物件,
該物件裡負責集合元素的排序邏輯;TreeSet(Comparator comparator)
定義了比較器,將比較器作為引數,傳遞給TreeSet集合的建構函式。

8.List介面
List是Collection子介面;
List是有序的集合,集合中每個元素都有對應的順序序列。
List集合可使用重複元素,可以通過索引來訪問指定位置的集合元素(順序索引從0 開始),
List集合預設按元素的新增順序設定元素的索引,比如第一個元素的索引就是0,好似陣列。
List擁有Collection所有方法,同時也有自己的方法:
增:void add(int index,Object e):將元素e新增到List集合中的index處;
boolean addAll(int index,Collection c):將集合c所包含的所有元素都插入在List集合的index處;
刪:remove(int index):刪除並返回index索引處的元素;
改:set(int index,Object e):把集合index處的元素替換為e物件,返回以前在指定位置的元素;
查: get(int index):返回集合index索引處的元素;
indexOf(Object o):返回物件o在List集合中第一次出現位置的索引;
lastIndexOf(object o):返回物件o在List集合中最後一次出現的位置索引;
subList(from,to):from(包括)到to(不包括)處所有集合元素的子集合。
ListIterator():列表迭代器

ListIterator():列表迭代器
    List集合特有的迭代器ListIterator是Iterator的子介面。專門用於操作List集合的輸出;

        在迭代時,不可以通過集合物件的方法操作集合中的元素,因為會發生ConrrentModificationException併發修改異常。
    所以,在迭代時,只能用迭代器的方法操作元素,可是Iterator的方法是有限的,
    只能對元素進行判斷,取出,刪除的操作。如果想要其他的操作如:新增,修改等,
    就需要使用其子介面ListIterator。
    該介面只能通過List集合的ListIterator方法獲取。該方法返回ListIterator物件,
        ListIterator繼承了Iterator介面,提供了專門操作List的方法。
        在Iterator上額外增加的方法:支援雙向輸出:
            hasNext():判斷下一個元素是否存在。有true,無false--正向遍歷
            next():返回下一個元素
            hasPrevious():判斷上一個元素是否存在。有true,無false--逆向遍歷
            previous():返回上一個元素

9.List集合的子集合:
List:元素是有序的,元素可以重複,因為該集合體繫有索引
-ArrayList :底層資料結構使用的是陣列結構,特點:查詢速度很快,但是增刪稍慢. 執行緒不同步
-LinkedList:底層使用的是連結串列資料結構。特點:增刪速度很快,查詢稍慢
-Vector:底層是陣列資料結構 jdk1.0 執行緒同步。被ArrayList替代了。

(1)ArrayList :底層是陣列資料結構 ,執行緒不同步          
(2)Vector: 底層是陣列資料結構 ,執行緒同步 ,被ArrayList替代了。
    可變長度陣列:
    ArrayList :長度為10,超過延長50%,變為15       
    Vector: 長度為10,超過延長100%,變為20   

    Vector:
    elements():返回此向量的元件的列舉
    Enumeration介面: 列舉
        nextElement():
    列舉就是Vector特有的取出方式,發現列舉和迭代器很像,其實列舉和迭代器是一樣的。
    因為列舉的名稱和方法名稱都過長,所以被迭代器取代了。

(3)LinkedList:底層使用的是連結串列資料結構。特點:增刪速度很快,查詢稍慢
    LinkedList:連結列表中的特有方法
    新增元素:addFirst();往前面新增; addLast();往後面新增
    獲取元素,但不刪除元素:getFirst();返回第一個元素;getLast();返回最後一個元素
    獲取元素並刪除元素:  removeFirst();removeLast();
    如果集合中沒有元素,get和remove會出現NoSuchElementException異常
    JDK1.6版本  出現了替代方法:
    新增元素:offerFirst();往前面新增;offerLast();往後面新增
    獲取元素,但不刪除元素:peekFirst();返回第一個元素;peekLast();返回最後一個元素
    獲取元素並刪除元素:pollFirst();pollLast();
    如果集合中沒有元素,會返回null

    堆疊:先進後出 如同一個杯子
    佇列:先進先出 如同一個水管