JAVA基本容器總結
1. 容器繼承
在java的容器裏面存在兩大分支分別是Collection和Map,但無論是哪一種它們共同的基本作用是儲存數據
Collection圖
Map圖
此圖只涉及基本的容器類型,有部分的容器並沒有列出
Collection家族
-
迭代器Iterable
雖然迭代器本身作爲Collection的頂級接口,但是Iterable並沒有任何有關容器的規範約定。但是這個接口提供了一個非常強大的迭代功能,可以解決Collection體系下所有的集合內部數據的遍歷。
常見方法圖表
方法名 | 方法返回值類型 | 方法描述 |
---|---|---|
hasNext() | boolean | hasNext()是判斷目標容器是否有下一位數據,如果存在返回true反之false |
next() | E | next()可以理解爲獲取容器的下一位數據,其返回值類型是在Colletion的實現類實例化時確定 |
ArrayList<String> arr = new ArrayList<Stirng>();
Iterator<String> it = arr.iterator();
while(it .hasNext){
String str = it .next();
}
一般這樣的方式就可以實現以Collect家族容器的遍歷獲取。但是這種獲取無法對集合中的基本數據類型進行修改操作,想要修改數據需要對應的包裝類
-
頂層接口Collection
Collection是集合中的頂層接口,它確定了所有集合的規範。
所有它的實現類都可以使用它所定義的方法。在Collection的衆多的實現類裏面,存在着有序和無序的集合,可重複和不可重複的。
但是這些都是尤其子接口實現,Collection只提供普遍性的操作。Collection本身的對象是有序可重複的
常見方法圖表
方法名 | 方法返回值類型 | 方法描述 |
---|---|---|
add(E e) | boolean | 向集合中添加e元素 |
clear() | void | 把集合內部的所有的元素全部元素 |
contains(Object o) | boolean | 判斷o的對象是否在集合當中 |
remove(Object o) | boolean | 移除集合中的o對象 |
size() | int | 返回集合的大小 |
toArray() | Object | 將此集合轉化一個數組 |
- remove() 在移除指定的而對象的時候,如果容器存在多個此對象,只會移除第一個遇到的元素
通過Collection我們可以知道,Collection接口主要提供了一個容器的基本功能,添加、移除、清空、轉換數組、返回大小、判斷存在… 配合Iterabl提供的迭代遍歷實現了容器的數據獲取和修改。
接口List(序列)
List是Collection的有序分支,並且提供可重複元素的添加。除此之外其重寫了Collection接口提供的方法,併爲部分方法進行了重載,以此來展現其特性。
主要特點
- 有序
- 索引
- 可重複
常見方法圖
方法名 | 方法返回值類型 | 方法描述 |
---|---|---|
add(E e) | boolean | 向列表尾部添加e元素 |
add(int index,E e) | void | 在index位置添加e元素,原index位置元素向後移 |
get(int index) | E | 獲取到index位置的元素 |
remove(int index) | E | 移除index位置的元素 |
remove(Object o) | boolean | 移除o元素 |
set(int index,E e) | E | 在index位置的元素替換爲e |
在list的常見的方法中,存在幾個重載的方法,而這幾個新的方法都存在一個特性就是參數列表存在一個索引值。而這個索引值便是List家族的重要的標誌(有序,有索引),也是因爲這個索引List系列的容器可以支持指定位置的數據改變和for循環索引遍歷。
List不支持在使用迭代器遍歷時對容器的長度進行修改,進行修改該會報出併發修改異常
ArrayList集合其內部的存儲結構是數組結構。由於數組結構對於數據的遍歷和查詢快,但是對容器內部數據的增刪就慢。
因爲ArrayList的實際本質是一個Object[]的數組,所以當向ArrayList添加的數據超過了Object[]的大小,就會進行數組的複製進行伸長,但是程序複製數據組的過程是非常消耗資源的,所以Arraylist的增刪慢
LinkedList集合數據存儲的結構是鏈表結構,類似於自行車的鏈條。這種結構有利於數據的增加和刪除,但是查找很不友好。無論是哪一個查詢方式,LinkedList往往是從頭遍歷。這就使linkedList查詢速度慢。
但是正是因爲Linkedlist可以對沒有節點元素進行操作,在Linkedlist裏面添加了大量首尾操作,可以作爲堆棧和隊列等數據使用
常見方法圖
方法名 | 方法返回值類型 | 方法描述 |
---|---|---|
addFirst(E e) | void | 向列表首部部添加e元素 |
addLast(iE e) | void | 向列表尾部添加e元素 |
getFirst() | E | 返回此列表的第一個元素 |
getLast() | E | 返回此列表的最後一個元素 |
removeLast() | E | 移除並返回此列表的最後一個元素 |
removeFirst() | E | 移除並返回此列表的第一個元素 |
pop() | E | 從此列表所表示的堆棧處彈出一個元素 |
push(E e) | void | 將元素推入此列表所表示的堆棧 |
isEmpty | boolean | 如果列表不包含元素,則返回true |
這些都是LinkedList的特有的方法
JDK中最早的可增長的數組結構,已經被更爲先進ArrayList淘汰。不用深究。不同之處在於其爲線程安全,運算速度慢
set使Collection的另一大派系,其主要的於List的區別是set內部不允許存儲相同的對象。
set接口沒有規定太多set派系的公有方法,大部分是將collection提供的方法進行了重寫,用來實現不重複元素的功能。
主要特點
HashSet其本質上是由一個HashMap集合提供(可以查看構造器源碼)。
HashSet無法保證迭代的順序和存儲的順序相同。
HashSet保證元素唯一性的方式依賴於: Object提供的 hashCode()和equals()兩個方法
主要特點
- 無序
HashSet的存儲和取出都比較快。
HashSet是一個數組鏈表的結合體,可以參照下圖
HashCode_1 | HashCode_2 | HashCode_3 | HashCode_4 | … |
---|---|---|---|---|
H1_element1 | H2_element1 | H3_element1 | H4_element1 | … |
H1_element2 | H2_element2 | H3_element2 | H4_element2 | … |
H1_element3 | H2_element3 | H3_element3 | H4_element3 | … |
H1_element4 | H2_element4 | H3_element4 | H4_element4 | … |
… | … | … | … |
對於這張表,最上面的一排存儲的是一個特定的HashCode這一排的存儲方式一個數組,而每一列的元素時HashCode相同的元素,這些元素的存儲方式是鏈表。
所以對一個元素的添加,會先判斷元素的HashCode是否存在,如果存在再判斷該HashCode列裏面的元素是否存在equals()也相同,如果都相同則無法添加,不同就加載到這一列的最後位置上。
如圖:
LinkedHashSet雖然繼承子HashSet但是其是有序的HashSet。
因爲LinkedHashSet運行着一個雙重鏈接列表,其定義了迭代順序
主要特點
- 有序
其他的使用方式於HashSet完全一致。
Map家族
Map的存儲方式跟Collection有着很大不同,Map中的集合裏面的數據是成對存在的,這就表明往Map集合裏面添加數據的時候是一次添加兩個數據的。因此Collection中的集合是被稱爲單列集合,而Map中的集合則被稱雙列集合。
主要特點
- 數據成對出現。一爲“鍵key”,另一個爲“值value”
- 在同一集合中key不允許重複,而值沒有限制
- 一個鍵只能對應一個值,而一個值可以對應多個鍵(類似於數學函數)
常見方法圖
方法名 | 方法返回值類型 | 方法描述 |
---|---|---|
get(Object key) | V | 返回key對應的value,如果不存在key則返回null |
put(K key,V value) | V | 可以理解爲添加也可以認爲是修改key對應的value,並返回之前的值,新健返null |
remove(Object key) | V | 移除對應的key和value |
元素無序,並且爲了要保證鍵的唯一,要重寫作爲鍵的對象的HashCode和equals這兩個方法。而它的基本使用和Set接口定義的無區別
HashMap的子類,實現了有序
HashTable的使用特點和HashMap一樣,但是它是一個線程按羣的集合,運算算速度慢。已被淘汰。但是它的一個子類Properties仍然再IO裏面使用