序言:這篇文章本來早就應該寫了,這個知識點也是日常開發中經常用到的,而且面試過程中也被每每提及,所以通過這次一周一個知識點的機會,打算好好總結一下容器相關的知識。
1、何為容器?
在Java中,有一個類專門用來存放其他類的對象,這個類就是容器,又稱之為集合,集合就是將若干性質相同或相近的類對象組合在一起而形成的一個整體。
2、我們都知道,存放數據還有一個叫數組的東西,那容器與數組的關系和區別又是什么呢?
首先,數組有固定的長度,而且長度很難擴充,容器就不一樣了,容器的長度是不固定的,你想要多少就能給你多少;其次數組中所存放的都是同一類型的數據,而容器不同,容器可以存放不同的數據類型;再其次,容器不能通過下標的方式訪問容器中的元素,數組的所有功能都能通過容器實現,只是方式不同;最后,如果想要將容器當成數組來用,可以使用容器中的toArrayList來將容器轉成數組。
3、Collection接口:Collection是最基本的集合接口,一個Collection代表一組Object對象,JDK中提供的類都是繼承自Collection的字接口List和Set。在Java中,有四個歷史集合類和六個集合實現,之所以稱之為歷史集合類是因為從Java1.0版本開始就一直沿用至今。具體如下表所示:
接口 | 實現 | 歷史集合類 |
---|---|---|
Set | HashSet | |
HashSet | ||
List | ArrayList | Vector |
LinkedList | Stack | |
Map | HashMap | Hashtable |
TreeMap | Properties |
Collection中有很多基本的方法,增刪改查等,下面我們就一一來看看:
返回值 | 方法名稱 | 功能介紹 |
---|---|---|
boolean | add(Object o) | 向集合中添加一個元素。 |
boolean | addAll(Collection<? extends E> c) | 將指定 collection 中的所有元素都添加到此 collection 中。 |
void | clear() | 移除此 collection 中的所有元素。 |
boolean | contains(Object o) | 如果此 collection 包含指定的元素,則返回 true,否則返回false。 |
boolean | containsAll(Collection<?> c) | 如果此 collection 包含指定的元素,則返回 true,否則返回false。 |
boolean | equals(Object o) | 比較此 collection 與指定對象是否相等 |
int | hasCode() | 返回此 collection 的哈希碼值。 |
boolean | isEmpty() | 如果此 collection 不包含元素,則返回 true,否則返回false。 |
Iterator<E> | iterator() | 返回在此 collection 的元素上進行迭代的迭代器。 |
boolean | remove(Object o) | 從此 collection 中移除指定元素的單個實例,如果存在的話。 |
boolean | removeAll(Collection<?> c) | 移除此 collection 中那些也包含在指定 collection 中的所有元素。 |
boolean | retainAll(Collection<?> c) | 僅保留此 collection 中那些也包含在指定 collection 的元素。 |
int | size() | 返回此 collection 中的元素數。 |
Object[] | toArray() | 返回包含此 collection 中所有元素的數組。 |
<T> T[] | toArray(T[] a) | 返回包含此 collection 中所有元素的數組;返回數組的運行時類型與指定數組的運行時類型相同。 |
4、Java容器中一般有三大類,Set集,List列表,Map映射,以下列舉一些常用的容器及其用法:
(1)、Set:Set接口繼承了Collection,它的內部實現是基于Map,Set的特點就是不允許出現重復的元素,換句話說,就是它會默認去重,它里面的元素是無序的,它只允許包含一個null的元素(因為內部去重的操作)。你可以通過Set去增加或者刪除元素,但是添加的元素必須定義equals方法以確保對象的唯一性,遍歷Set集合時,只能使用foreach遍歷和迭代器Iterator遍歷。以下列舉一些常用的Set操作方法:
方法名稱 | 功能介紹 |
---|---|
add(T data) | 向集合中添加一個元素 |
addAll(Collection c) | 向集合中添加一個集合 |
remove(T data) | 在集合中清除對象data |
removeAll(Collection c) | 在集合中清除與集合c的交集 |
toArray(Set<Object> set) | 在集合中清除與集合c的交集 |
iterator() | 獲取Set的迭代器(用于遍歷操作) |
(2)、HashSet:為了快速查找而設計的Set。存入HashSet的對象必須定義hasCode方法以確保對象的唯一性。使用HashSet能夠最快的獲取集合中的元素,效率非常高(以空間換時間)。會根據hashcode和equals方法來判斷是否是同一個對象,如果hashCode一樣,并且equals返回true,則是同一個對象,不能重復存放。
(3)、TreeSet:TreeSet具有Set的特點,而且它會自動將元素排序,如果存放的對象不能排序則會報錯,所以存放的對象必須指定排序規則。排序規則分別是自然排序和客戶排序:
(i)、自然排序:TreeSet要添加哪個對象就在哪個對象上面實現java.lang.Comparable
接口,并重寫comparaTo()方法,該方法返回0則表示是同一個對象,否則為不同對象。
(ii)、客戶排序:建立第三個類并實現java.lang.Comparable接口,并重寫方法。
定義集合TreeSet ts=new TreeSet(new 第三個類())。
(4)、LinkedHashSet:具有HashSet的查詢速度,且內部使用鏈表維護元素的順序(插入的次序)。于是在使用迭代器遍歷Set時,結果會按元素插入的次序顯示。LinkedHashSet在迭代訪問Set中的全部元素時,性能比HashSet好,但是插入時性能稍微遜色于HashSet。
(5)、List:List接口繼承了Collection,List的特點是有序的(元素怎么存的,就怎么取出來),而且元素可以重復,和Set不同的是List的元素中可以包含多個null值。你可以在List的任意位置插入與移除元素(前提是得要有元素)。以下列舉一些常用的List操作:
方法名稱 | 功能介紹 |
---|---|
add(T data) | 用來向集合的末尾添加一個對象 |
add(int index, T data) | 用來向集合的指定位置添加一個對象,其他對象的索引位置相對后移一位 |
addAll(Collection<? extends T>) | 用來向集合的末尾添加指定集合的全部對象 |
addAll(int index,Collection<? extends T>) | 用來向集合的指定位置添加指定集合的全部對象 |
remove(T data) | 用來清除集合中指定位置的對象 |
removeAll(Collection<? extends T>) | 用來清除集合中指定集合的全部對象 |
set(int index, T data) | 用來將集合中指定位置的對象修改為指定對象 |
get(int index) | 用來獲取集合中制定位置的對象 |
indexOf(T data) | 用來獲得指定對象的位置,當存在多個時,返回第一個對象的位置,當不存在時,返回-1 |
listIterator(int index) | 用來獲得一個包含所有對象的ListIterator型實例 |