集合類存放于java.util包中。
集合類存放的都是對象的引用,而非對象本身,出于表達上的便利,我們稱集合中的對象就是指集合中對象的引用(reference)。
常用的集合類型主要有3種:set(集)、list(列表)和map(映射)。
通俗的說,集合就是一個放數據的容器,準確的說是放數據對象引用的容器。
Collection 集合的根接口
------| List? 如果是實現了List接口的集合類,具備的特點: 有序,可重復。
---------| ArrayList? ArrayList 底層是維護了一個Object數組實現的。 特點: 查詢速度快,增刪慢。
---------| LinkedList ?LinkedList 底層是使用了鏈表數據結構實現的, 特點: 查詢速度慢,增刪快。
---------| Vector(了解即可)? 底層也是維護了一個Object的數組實現的,實現與ArrayList是一樣的,但是Vector是線程安全的,操作效率低。
------| Set? 如果是實現了Set接口的集合類,具備的特點: 無序,不可重復。
----------| HashSet? 底層是使用了哈希表來支持的,特點: 存取速度快.
----------| TreeSet?? 如果元素具備自然順序 的特性,那么就按照元素自然順序的特性進行排序存儲。
------|Queue 隊列接口集合類,是一種先進先出的數據結構,更新時使用術語“入隊”“出隊”用LinkedList實現接口
Map映射集合的根接口
------|HashMap 通過使用映射關系來到達存儲數據,通過hashcode快速查找,具體特點:無序,速度快
------|TreeMap 映像樹 ,基于紅黑樹實現,沒有調優選項,處于平衡狀態,具體特點:有序,速度慢
用法:
ArrayList:
定義:List<E> list=new ArrayList<E>();//構造一個空數組,默認容量為10
????????????? ArrayList<E> list=new ArrayList<E>();//這兩種定義方式一個是以List接口聲明,( List為接口,ArrayList是List接口的實現類)另一個是以實現類ArrayList聲明,兩者相差不大,實現函數方法基本一樣。(注:用List聲明的數組中,像TrimToSize()沒有,而用ArrayList聲明里面可以使用,該方法用來刪除預留元素的空間,這預留元素的空間并不是null而是每次ArrayList增長都會申請多一點空間,當size()=1000,ArrayList已經申請了1200空間,而該方法是刪除多余的200空間,該方法用來內存緊張的時候使用),
?????? (尖括號里面的E是數據類型,比如:如果是String,則該數組里面只能存String類型的數據)
個人認為能用ArrayList聲明盡量用ArrayList聲明;
常用方法:
add(E e):???????????????????? 在數組末尾添加元素
size():?????????????????????????? 數組中實際元素個數,并不是數組容量
add(int index, E e):??? 在數組指定位置添加元素
clear():???????????????????????? 將數組中元素清空
contains(E e):???????????? 判斷數組中是否含有某個元素
get(int index):???????????? 返回數組指定位置的元素
indexOf(E e):????? 返回數組指定元素第一次出現的位置
set(int index, E e):???? 替換數組指定位置的值
remove(int index):???? 移除數組指定位置的元素并返回刪除的值
remove(E e):? 移除數組中第一次出現的指定元素并返回true和false
addAll(Collection<? extends E> c):? 在數組末尾添加另一個數組
addAll(int index, collection<? extends E> c):?? 在數組指定位置添加另一個數組
removeAll(Collection<?>c):?? 將數組中屬于數組 c 中的元素全部刪除
LinkedList:
定義:LinkedList<E> linkedlist=new LinkedList<E>();
LinkedList其實數據結構里面的雙向鏈表,既然是鏈表,那么分配的存儲空間并不是連續的,而是分散的,插入和刪除操作很快,時間復雜度為O(1);但訪問該數組時就比較慢了,必須從第一個元素開始找起,時間復雜度為O(n);
它包含了一個重要的內部類Node,Node是雙向鏈表節點所對應的數據結構它包含的屬性有,當前節點所包含的值,上一個節點及下一個節點。
LinkedList既可以作為先進先出的隊列又可以作為后進先出的堆棧,并且提供了了豐富的方法
常用方法:
添加:
boolean add(E e):在鏈表后添加一個元素,如果成功,返回true,否則返回false;
addFirst(E e):在鏈表頭部插入一個元素;
addLast(E e):在鏈表尾部添加一個元素;
add(int index, E element):在指定位置插入一個元素。
offer(E e);類似隊列的插入方法
offerFirst(E e);在頭部插入一個元素
offerLast(E e);在尾部插入一個元素
刪除:
remove();移除鏈表中第一個元素;
boolean remove(Object o):移除鏈表中指定的元素;
remove(int index):移除鏈表中指定位置的元素;
removeFirst():移除鏈表中第一個元素,與remove類似;
removeLast():移除鏈表中最后一個元素;
boolean removeFirstOccurrence(Object o):移除鏈表中第一次出現所在位置的元素;
boolean removeLastOccurrence(Object o):移除鏈表中最后一次出現所在位置的元素;
獲取元素:
get(int index):按照下邊獲取元素;
getFirst():獲取第一個元素;
getLast():獲取第二個元素;
以上為隊列的先進先出的方法
下面的方法是堆棧的類似方法:
push(E e):與addFirst一樣,實際上它就是addFirst;
pop():與removeFirst一樣,實際上它就是removeFirst;
poll():查詢并移除第一個元素;
peek():獲取第一個元素,但是不移除;
peekFirst():獲取第一個元素,但是不移除;
peekLast():獲取最后一個元素,但是不移除;
比較特殊的方法:
getFirst();
getLast();
獲取元素,但不刪除元素。如果集合中沒有元素,會出現NoSuchElementException
removeFirst();
removeLast();
獲取元素,但是元素被刪除。如果集合中沒有元素,會出現NoSuchElementException
在JDK1.6出現了替代方法。
offerFirst();
offerLast();
peekFirst();
peekLast();
獲取元素,但不刪除元素。如果集合中沒有元素,會返回null。
pollFirst();
pollLast();
獲取元素,但是元素被刪除。如果集合中沒有元素,會返回null。
遍歷的方法:
(01) 第一種,通過迭代器遍歷。即通過Iterator去遍歷。
for(Iterator iter = list.iterator(); iter.hasNext();)
??? iter.next();
(02) 通過快速隨機訪問遍歷LinkedList
int size = list.size();
for (int i=0; i<size; i++) {
??? list.get(i);???????
}
(03) 通過另外一種for循環來遍歷LinkedList
for (Integer integ:list)? ;
(04) 通過pollFirst()來遍歷LinkedList
while(list.pollFirst() != null) ;
(05) 通過pollLast()來遍歷LinkedList
while(list.pollLast() != null) ;
(06) 通過removeFirst()來遍歷LinkedList
try {
??? while(list.removeFirst() != null) ;
} catch (NoSuchElementException e) {
}
(07) 通過removeLast()來遍歷LinkedList
try {
??? while(list.removeLast() != null)? ;
} catch (NoSuchElementException e) {
}
(注:千萬不要通過隨機訪問去遍歷LinkedList,如果該數組很長所花費的時間也就會很長)
Vector:又稱之為向量類,與ArrayList差不多,只不過Vector是線程安全,它里面的方法基本都是用synchronized修飾。
HashSet:
定義:HashSet<E> hashset=new HashSet<E>();
????????????? 或者Set<E> hashset=new HashSet<E>();
上面提到Set是無序,所以HashSet里面沒有重復的數據,可以允許為null值,它是Set接口的一個實現類
如何添加同一個數據,HashSet會調用hashCode()用來判斷是否相同,執行完HashCode后也會執行equals,如果兩者都返回true,那么它就會認為這兩者數據是一樣的,就會停止添加,否則直接添加
如何重寫了equals函數那么HashCode也必須重寫,否則會出錯
常用方法:
add(E e)???? 如果此 set 中尚未包含指定元素,則添加指定元素。
clear()???? 從此 set 中移除所有元素。
clone()?????? 返回此 HashSet 實例的淺表副本:并沒有復制這些元素本身。contains(Object o)???? 如果此 set 包含指定元素,則返回 true。
isEmpty()??? 如果此 set 不包含任何元素,則返回 true。
iterator()??? 返回對此 set 中元素進行迭代的迭代器。
remove(Object o)?? 如果指定元素存在于此 set 中,則將其移除。
size()?????? 返回此 set 中的元素的數量(set 的容量)。
TreeSet:
它是紅黑樹數據結構,他是是基于TreeMap實現
TreeSet是非同步的
TreeSet中的元素支持2種排序方式:自然排序 或者 根據創建TreeSet 時提供的 Comparator 進行排序。這取決于使用的構造方法。
HashMap:
通過鍵值對key-value的形式存值,有點類似于哈希表的鏈式存儲方式,
允許用null作為key和value
這個實現的基本操作提供了穩定的性能(get和put)
Get(Object key)???? //獲取key對應的value值
Put(key,value)????? //存值
HashMap不能直接遍歷,必須通過KeySet()方法返回一個key的Set集合然后在通過遍歷set來獲取value的值
remove(Object?key)??? //如果存在的話,從這個映射中移除指定的鍵的映射。
Size()????? //返回鍵值對的數目
?
?
以上為個人總結
?