四、Java集合

1. Java集合概述

Java集合主要由兩個接口派生而出,Collection和Map
|---Collection(I)
|---|---Set(I)
|---|---|---EnumSet(C)
|---|---|---SortedSet(I)
|---|---|---|---TreeSet(C)
|---|---|---HashSet(C)
|---|---|---|---LinkedHashSet(C)
|---|---Queue(I)
|---|---|---PriorityQueue(C)
|---|---|---Deque(I) |
|-------------------|---LinkedList(C)
|---|---List(I)------|
|---|---|---ArrayList(C)
|---|---|---Vector(C)
|---|---|---|---Stack(C)

|---Map
|---|---EnumMap
|---|---IdentityHashMap
|---|---HashMap(C)
|---|---|---LinkedHashMap
|---|---HashTable(C)
|---|---|---Properites
|---|---SortedMap(I)
|---|---|---TreeMap(C)
|---|---WeakHashMap

Collection提供了如下接口:

  • add,addAll,contains,containsAll,remove,removeAll,retainAll
  • clear,isEmpty,size,toArray,iterator

遍歷可以通過iterator迭代器來進行,也可以通過foreach來進行。
Iterator接口里面定義了以下三個方法:

  • boolean hasNext()
  • Object next()
  • void remove()

2 Set接口

Set不允許兩個equals方法返回True的對象同時插入

  • 非同步,線程不安全
    可以用Collections.synchronizedSet來進行包裝

2.1 HashSet類

  • 具有更好的存儲和查找性能
  • 不保證元素的順序
  • 集合元素可以是null

HashSet判斷相等的標準是:通過equals和hashCode方法,兩個都相等

LinkedHashSet使用鏈表維護元素的次序,所以性能會略差一些。

2.2 TreeSet類

TreeSet是SortedSet接口的唯一實現(xiàn)。
與HashSet相比,還提供了以下額外的方法:

  • comparator, first,last,lower,higher,headSet,tailSet,subSet

TreeSet采用紅黑樹來對數(shù)據(jù)結(jié)構(gòu)進行排序

對于添加到TreeSet中的對象,有下面兩個要求:
1.實現(xiàn)Comparable接口
2.必須是相同類

equals返回false或者compareTo不相等,都表示兩個對象不相同

3 List接口

List接口代表一個有序集合,集合中的每個元素都有其對應(yīng)的順序索引。List允許重復(fù)元素,可以通過索引來訪問指定位置的集合元素。

3.1 List接口和ListInterator接口

List除了可以使用Collection接口的全部方法之外,還有一些可以根據(jù)索引來操作集合元素的方法:

  • void add(int index, Object element)
  • boolean addAll(int index, Collection c)
  • Object get(int index)
  • int indexOf(Object o)
  • int lastIndexOf(Object o)
  • Object remove(int index)
  • Object set(int index,Object element)
  • List subList(int fromIndex,int toIndex)

List判斷相等的標準,也是通過equals方法返回true即可

List還提供了一個listIterator()方法,該方法返回一個ListIterator對象,除了Iterator有的方法之外,還包含:

  • boolean hasPrevious()
  • Object previous()
  • void add()

3.2 ArrayList和Vector實現(xiàn)類

二者都是基于數(shù)組實現(xiàn)的List類,封裝了一個動態(tài)再分配的Object[]數(shù)組,每個對象有一個capacity屬性,這個屬性平時不用關(guān)注,但是如果要一次大量的插入元素,可以通過ensureCapacity(int)來一次性的增加capacity,從而減少重分配次數(shù)。
capacity屬性默認為10,可以通過如下兩個方法來操作:

  • void ensureCapacity(int minCapacity)
  • void trimToSize() //調(diào)整集合的capacity為當前列表大小

Vector是一個古老的集合,里面很多重復(fù)的方法,而且名字很長,所以一般不推薦使用。

Vector有一個Stack子類,有peek,pop和push方法,模擬棧這種數(shù)據(jù)結(jié)構(gòu)。

有一點需要注意的是,Vector是線程安全的,但ArrayList是不安全的,但是也依舊可以通過Collections工具類來讓其變得線程安全

4 Queue接口

Queue用于模擬隊列這種數(shù)據(jù)結(jié)構(gòu),隊列是一種FIFO容器。Queue實現(xiàn)了如下幾個方法:

  • void add(Object e) //添加到隊列尾部
  • boolean offer(Object e) //有些隊列有大小限制,如果超出限制,該方法會返回false,而add則會拋出異常
  • Object remove() //獲取隊列頭部元素,并且刪除
  • Object poll()//當隊列為空的時候,會返回null,而remove會拋出異常
  • Object element()//獲取隊列頭部元素,但是不刪除
  • Object peek()//當隊列為空的時候,會返回null,而element會拋異常

4.1 LinkedList

LinkedList同時實現(xiàn)了List和Deque(雙向隊列)。
Deque接口里面定義了一些可以雙向操作隊列的方法:

  • addFirst,addLast,offerFirst,offerLast,removeFirst,removeLast,pollFirst,pollLast,getFirst,getLast,peekFirst,peekLast
  • Iterator descendingIterator()//返回以雙向隊列對應(yīng)的迭代器
  • Object removeFirstOccurrence(Object o)
  • Object removeLastOccurrence(Object o)

從上面的方法可以看出,LinkedList不僅可以當雙向隊列使用,還可當棧使用。

4.2 PriorityQueue

保存隊列的順序并不是加入隊列的順序,而是排序之后的。
關(guān)于排序和TreeSet基本一致

5 Map接口

Map用于保存具有映射關(guān)系的數(shù)據(jù)。Map接口中定義了如下常用方法:

  • void clear()
  • boolean containsKey(Object key)
  • boolean containsValue(Object value)
  • Set entrySet()
  • Object get(Object key)
  • boolean isEmpty()
  • Set keySet()
  • Object push(Object key, Object value)
  • void putAll(map m)
  • Object remove(Object key)
  • int size()
  • Collection values()
    Map中包括一個內(nèi)部類:Entry,包含getKey,getValue,setValue三個方法

5.1 HashMap和HashTable實現(xiàn)類

HashTable是一個古老的實現(xiàn)類,但是是線程安全的。

和HashSet類似的是,如果使用可變對象作為HashMap和HashTable的Key,且程序修改了key的話,那么,程序?qū)⒃僖矡o法準確訪問到Map中被修改過Key

HashMap也有一個子類,叫LinkedHashMap,使用雙向鏈表來維護key-value的次序。
Properites是HashTable的子類,該對象在處理屬性文件的時候特別方便。包含如下接口:
String getProperty(String key)
String getProperty(String key, String defaultValue)
Object setProperty(String key,String value)
void load(InputStream inStream)//加載屬性文件
void store(OutputStream,String comment)//寫入屬性文件

5.2 SortedMap接口和TreeMap實現(xiàn)類

和TreeSet一樣,TreeMap也是使用紅黑樹對TreeMap的所有key進行排序,從而使所有的key-value屬于有序狀態(tài)。
也是提供了兩種排序方式:

  • 自然排序:key必須實現(xiàn)Comparable接口
  • 定制排序:傳入Comparator對象
    類似判斷兩個元素相等的標準,TreeSet中判斷兩個key相等的標準也是兩個key通過equals返回true,通過compareTo返回0

實現(xiàn)的方法參考TreeSet的方法,有:firstEntry,firstKey,lastEntry,lastKey,higher,lower,subMap,headMap,tailMap

5.3 WeakHashMap, IdentityHashMap, EnumMap

WeakHashMap的key使用的是弱引用,在垃圾回收的時候
IdentityHashSet必須是使用==相同,才算是相同
EnumMap的key必須是單個枚舉類的枚舉值

6 操作集合的工具類:Collections

6.1排序操作

  • static void reverse(List list)
  • static void shuffle(List list)
  • static void sort(List list)
  • static void sort(List list, Comparator c)
  • static void swaq(List list,int i,int j)
  • static void rotate(List list,int distance)

6.2查找,替換操作

  • static void binarySearch(List list,Object key)
  • static Object max(Collection c,Comparator comp)
  • static Object max(Collection c)
  • static Object min(Collection c,Comparator comp)
  • static Object min(Collection c)
  • static void fill(List list, Object obj)
  • static int frequency(Collection c, Object o)
  • static int indexOfSubList(List source, List target)
  • static int LastIndexOfSubList(List source, List target)
  • static boolean replaceAll(List list, Object oldVal, Object newVal)

6.3 同步控制

synchronizedCollection/List/Set/Map

6.4 設(shè)置不可變集合

emptyxxx()
singletonxxx()
unmodifiablexxx()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,638評論 18 399
  • 一、基本數(shù)據(jù)類型 注釋 單行注釋:// 區(qū)域注釋:/* */ 文檔注釋:/** */ 數(shù)值 對于byte類型而言...
    龍貓小爺閱讀 4,441評論 0 16
  • Collection ├List │├LinkedList │├ArrayList │└Vector │└Stac...
    AndyZX閱讀 959評論 0 1
  • java筆記第一天 == 和 equals ==比較的比較的是兩個變量的值是否相等,對于引用型變量表示的是兩個變量...
    jmychou閱讀 1,644評論 0 3

友情鏈接更多精彩內(nèi)容