一、集合類
定義:一種為了對多個對象進行操作而進行存儲的方式。
1、與數組的區別:
數組:可以存儲對象,也可以存儲基本數據類型,但是一次只能存儲一種類型,數組長度固定。
集合:只能存儲對象,長度可變,可以存儲不同類型的對象。
集合眾多的原因:每一種容器對數據的存儲方式都有所不同,這個存儲方式為:數據結構。
二、Collection
1.增加對象:boolean add(Object object) 如果集合中沒有object,那么添加它並返回true;
如果集合中存在object(且該集合不能包含重復元素),則返回false。
另外:集合中存儲的都是對象的引用(地址)。(Object可以放入任何對象)
2.獲取長度:int size(): 返回此集合中的元素個數。
3.刪除元素:
void clear(): 清楚集合中的所有元素(除非該集合不支持clear方法)。
boolean remove(Object o): 刪除集合中所有e.equals(e)==true的元素,並返回true。否則返回false。
(Arraylist中改寫為:移除相等的首個元素)
Boolean removeAll(Cellection c): 移除和集合c 的交集中的元素。
4.判斷元素:
Boolean contains(Object o):判斷集合中是否包含元素(對象)o。
boolean containsAll(Collection c):判斷集合c是否是調用集合的子集。
5.交集: boolean retainAll(Cellection c): 僅保留和集合c的交集。
三、元素的取出(迭代器)
迭代器: 就是一個Iterator接口的子類對象,封裝了取出其綁定集合的元素的方式。
步驟: 1、通過調用集合的 Iterator iterator()方法返回該集合的迭代器,
2、將此迭代器賦值給 一個 Iterator 型對象引用。
3、通過此引用,調用迭代器的方法操作集合:
1)、boolean hasNext():如果集合中任有元素可以迭代,則返回true。
2)、Object next():返回迭代的下一個元素(列表中還在)。
3)、void remove():從迭代器指向的集合中 移除 迭代器返回的最后一個元素。
注意:你不能同時用迭代器和集合同時去操作同一組元素, 有可能會拋出並發異常。
原因:迭代器已經創建, 之后通過集合方法操作的元素過程(比如說增加),迭代器並不知道集合做了什么操作,還是只能
按照原來的元素列表操作,就會發生錯誤。
四、List 接口
Collection 接口的子接口
特點:元素是有序的, 而且元素可以重復。 該類集合中有索引(角標)。
其特有的常見方法:
1、凡是可以操作角標(索引的)的方法都是該體系特有的方法。
增:
void add(int index ,Object object);
Boolean add(int index, Collection c);
刪:
remove(index):返回了移除的元素。
改:
set(index, element):在指定角標放入指定元素,返回原來的元素。
查:
get(index):返回index上的元素
subList(start,end):返回一個自己列表(依賴於原集合)
注:List集合特有的迭代器: listIterator(); 列表迭代器 (注意與iterator區別)
listIterator:
1、定義、解釋。
是iteretor的子接口。
在進行迭代操作的時候,不能使用集合方法對同組元素進行操作(原因在iterator講解處)。
而iterator的操作方法又比較少(只有判斷、查找、刪除,沒有添加),局限了對元素組的課操作性。
所以在list集合中就定義了新的迭代器: listIterator。
2、listIterator中新增的方法:
1)、void add(): 在返回的元素后面的加入一個新元素
2)、void set(object): 使用新元素替換返回的最后一個元素。
3)、Boolean hasPrevious(): 逆向遍歷列表(相對應: hasNext())
list 集合在涉及到需要判斷元素是否相同時,底層調用的都是equals方法。(contains、 remove方法等)
list集合下,常見三大集合
1、ArrayList:底層數據結構使用數組結構: 查詢速度快。但是增刪稍慢。(線程不同步,數組0.5倍延長)
2、Linkedlist:底層使用鏈表數據結構: 增刪塊, 但是查詢慢。
3、Vector:底層是數組數據結構:查詢贈刪慢(線程同步,數組百分百延長)已經被ArrayList取代。
Vector: 在1.2版本過后,便幾乎被ArrayList取代,同步的。
不過其有兩個特有之處:
1)、 在去方法中帶有Element的方法是在1.1還沒有Collection框架的時候特有的方法,與從list實現來的方法幾乎一樣。
2)、 Vector除了有迭代器(iteretor、listIteretor )外,還有一個枚舉(與iteretor類似)
Enumeration en = v.elements(); 通過Vector對象創建一個枚舉
en.hasMornElements(); (類似迭代的hasNext())
en.nextElement(); (類似迭代的Next())
注意:枚舉的所有功能都被迭代包含了,而且枚舉方法名太長,不利於書寫,所以,新的開發應當優先使用迭代而不是枚舉。
linkedList:
底層使用鏈表數據結構。
特有方法:
1)、addFirst()從集合列表開頭插入元素
2)、addLast()從集合列表結尾插入元素(等效於add())
3)、getFirst()拿到第一個元素,返回這個元素
4)、getLast()拿到最后一個元素,返回這個元素
5)、removeFirst()移除第一個元素,返回這個元素
6)、removeLast()移除最后一個元素,返回這個元素
(如果列表中沒有元素,那么:3到6方法拋 空元素異常)
注: 在1.6版本以后,新添加了獲取和移除方法, 在空列表的時候,會返回null,不會發生異常。
1)、peekFirst()獲取 但 不移除 列表第一個元素,列表為空返回null
2)、peekLast()獲取 但 不移除 列表最后一個元素,列表為空返回null
3)、pollFirst()獲取 並 移除 列表第一個元素,列表為空返回null
4)、pollLast()獲取 並 移除 列表第最后一個元素,列表為空返回null
五、Set 接口
Collection 接口的子接口
特點:元素是無序(存入和取出的順序不一定一致)的,而且元素不能重復。 該類集合中沒有索引。
Set集合的功能和Collection是一致的。
Set集合下常見的子類集合:
HashSet:底層數據結構式: 哈希表。
TreeSet:
HashSet:
特點:元素無序(存入和取出的順序一定不一樣),而且元素唯一,沒有索引。
底層數據: 底層使用哈希表作為數據結構。
元素唯一性: 是通過元素的兩個方法: hashCode 和 equals 來完成的。
如果兩個元素的HashCode值相同,就會判斷equals是否為true。
如果兩個元素的HashCode值不同,就不會調用equals方法。
注意:對於判斷元素是否存在、刪除等操作,都依賴於元素的hashCode、equals等方法。
哈希表:給定表M,存在函數f(key),對任意給定的關鍵字值key,代入函數后若能得到包含該關鍵字的記錄在表中的地址,
則稱表M為哈希(Hash)表,函數f(key)為哈希(Hash) 函數。
(哈希值與內存地址值之間的關系:默認的哈希值是內存地址值計算的哈希值,但是只是為了給人看的,真正在
內存中還是依靠內存地址值來進行運算的,而不是哈希值)
TreeSet:
底層數據結構: 二叉樹 (保證元素唯一性的方法是保證compareTo 方法return 0)
比較方式: 方式一、就是讓元素自己具有比較性,元素需要實現comparable接口,重寫其中得compareTo方法,這個排序叫做自然排序(默認排序)
1、 無序性(按照輸入元素類中自定義的compareTo方法來排定存儲對象。)
2、 單一性(通過判斷元素類中自定義的compareTo方法放回值是否為0來判斷元素是否相等。)
3、 讓需要存入到TreeSet中的元素,實現comparable接口,該接口中定義了一個public int compareTo方法
4、 compareTo 方法:我們需要在類定義中重寫該方法, public int compareTo,
使得: 當有e.compareTo(e1)時,
如果e大於e1則返回正數,當e小於e1則返回負數, 等於則返回0.
而且當有e等於e1時, 可以定義附屬判斷條件來判斷 兩個對象的大小。
注意:TreeSet 本情況的所有的底層比較原理只是調用了元素的compareTo方法,與 equals等方法都無關。
(add、contains、remove等需要用到比較的方法)
所以我們定義所有的比較都返回正數,那么靠遍歷迭代器取出的元素順序和存入順序一樣。
如果定義所有的比較都返回負數,那么靠遍歷迭代器去除的元素順序和存入的順序相反。
如果定義所有比較都返回0 ,那么就只能存入一個元素,最后也只能取出一個元素。
方式二、當元素自身沒有比較性或者具有的比較性不是自身所需要的,那么就要讓集合自身具有比較性。
那么就要在集合一初始化時定義比較方式(也就是調用集合的構造方法)
1、 無序性(按照集合實例化的時候的比較器來排布元素的存儲順序。)
2、 單一性(通過集合的比較器的compare方法返回值是否為0 來判斷元素是否相等。)
3、 定義一個比價器的類,使其實現comparator接口, 重寫覆蓋其中的 int compare(T o1, T o2) 方法。
4、 compare 方法:我們需要在比較器類定義中重寫該方法,int compare(Object o1, Object o2),
使得: 我們在該方法中比較兩個對象,或者比較其對象的方法,或者直接定義一個數值返回。
當返回值為正時代表o1大於o2,當返回值為負時代表o1小於o2,返回值為0 則代表兩個對象相等。
而且當初步判斷有o1等於o1時, 可以定義附屬判斷條件來判斷 兩個對象的大小。
注意:TreeSet 本情況的所有的底層比較原理只是調用了集合比較器的compare方法,與 元素equals等方法都無關。
(add、contains、remove等需要用到比較的方法)
所以我們定義所有的比較都返回正數,那么靠遍歷迭代器取出的元素順序和存入順序一樣。
如果定義所有的比較都返回負數,那么靠遍歷迭代器去除的元素順序和存入的順序相反。
如果定義所有比較都返回0 ,那么就只能存入一個元素,最后也只能取出一個元素。
