Java【第十篇】集合

Java 集合概述

Java 集合就像一種容器,能夠把多個對象的引用放入容器中。
Java 集合類能夠用於存儲數量不等的多個對象,還可用於保存具備映射關係的關聯數組
Java 集合可分爲 Set、List 和 Map 三種體系
  –Set:無序、不可重複的集合
  –List:有序,可重複的集合
  –Map:具備映射關係的集合
Java集合框架圖java

Collection 接口

Collection 接口是 List、Set 和 Queue 接口的父接口,該接口裏定義的方法既可用於操做 Set 集合,也可用於操做 List 和 Queue 集合算法

使用 foreach 循環遍歷集合元素編程

for (Person person : persons){
            System.out.println(person.getName());
        }

Iterator 接口

Iterator 接口主要用於遍歷 Collection 集合中的元素,Iterator 對象也被稱爲迭代器
Iterator 接口隱藏了各類 Collection 實現類的底層細節,嚮應用程序提供了遍歷 Collection 集合元素的統一編程接口
Iterator 僅用於遍歷集合,Iterator 自己並不提供承裝對象的能力。若是須要建立 Iterator 對象,則必須有一個被迭代的集合。數組

Set

Set 集合不容許包含相同的元素,若是試把兩個相同的元素加入同一個 Set 集合中,則添加操做失敗。
Set 判斷兩個對象是否相同不是使用 == 運算符,而是根據 equals 方法安全

HashSet

HashSet 是 Set 接口的典型實現,大多數時候使用 Set 集合時都使用這個實現類。
HashSet 按 Hash 算法來存儲集合中的元素,所以具備很好的存取和查找性能。
HashSet 具備如下特色:
  不能保證元素的排列順序
  HashSet 不是線程安全的
  集合元素可使 null
當向 HashSet 集合中存入一個元素時,HashSet 會調用該對象的 hashCode() 方法來獲得該對象的 hashCode 值,而後根據 hashCode 值決定該對象在 HashSet 中的存儲位置。
若是兩個元素的 equals() 方法返回 true,但它們的 hashCode() 返回值不相等,hashSet 將會把它們存儲在不一樣的位置,但依然能夠添加成功。多線程

hashCode

HashSet 集合判斷兩個元素相等的標準:兩個對象經過 equals() 方法比較相等,而且兩個對象的 hashCode() 方法返回值也相等。
若是兩個對象經過 equals() 方法返回 true,這兩個對象的 hashCode 值也應該相同。
重寫 hashCode() 方法的基本原則
  在程序運行時,同一個對象屢次調用 hashCode() 方法應該返回相同的值
  當兩個對象的 equals() 方法比較返回 true 時,這兩個對象的 hashCode() 方法的返回值也應相等
  對象中用做 equals() 方法比較的 Field,都應該用來計算 hashCode 值併發

LinkedHashSet

LinkedHashSet 是 HashSet 的子類
LinkedHashSet 集合根據元素的 hashCode 值來決定元素的存儲位置,但它同時使用鏈表維護元素的次序,這使得元素看起來是以插入順序保存的。
LinkedHashSet 性能插入性能略低於 HashSet,但在迭代訪問 Set 裏的所有元素時有很好的性能。
LinkedHashSet 不容許集合元素重複。框架

TreeSet

簡介

TreeSet 是 SortedSet 接口的實現類,TreeSet 能夠確保集合元素處於排序狀態。
TreeSet 支持兩種排序方法:天然排序和定製排序。默認狀況下,TreeSet 採用天然排序。工具

天然排序

排序:TreeSet 會調用集合元素的 compareTo(Object obj) 方法來比較元素之間的大小關係,而後將集合元素按升序排列
若是試圖把一個對象添加到 TreeSet 時,則該對象的類必須實現 Comparable 接口。
實現 Comparable 的類必須實現 compareTo(Object obj) 方法,兩個對象即經過 compareTo(Object obj) 方法的返回值來比較大小。
Comparable 的典型實現:
  BigDecimal、BigInteger 以及全部的數值型對應的包裝類:按它們對應的數值大小進行比較
  Character:按字符的 UNICODE 值來進行比較
  Boolean:true 對應的包裝類實例大於 false 對應的包裝類實例
  String:按字符串中字符的 UNICODE 值進行比較
  Date、Time:後邊的時間、日期比前面的時間、日期大性能

由於只有相同類的兩個實例纔會比較大小,因此向 TreeSet 中添加的應該是同一個類的對象
當須要把一個對象放入 TreeSet 中,重寫該對象對應的 equals() 方法時,應保證該方法與 compareTo(Object obj) 方法有一致的結果:若是兩個對象經過 equals() 方法比較返回 true,則經過 compareTo(Object obj) 方法比較應返回 0

定製排序

若是須要實現定製排序,則須要在建立 TreeSet 集合對象時,提供一個 Comparator 接口的實現類對象。由該 Comparator 對象負責集合元素的排序邏輯

List

介紹

List 表明一個元素有序、且可重複的集合,集合中的每一個元素都有其對應的順序索引
List 容許使用重複元素,能夠經過索引來訪問指定位置的集合元素。
List 默認按元素的添加順序設置元素的索引。
List 集合裏添加了一些根據索引來操做集合元素的方法

listIterator

List 額外提供了一個 listIterator() 方法,該方法返回一個 ListIterator 對象, ListIterator 接口繼承了 Iterator 接口,提供了專門操做 List 的方法:
  boolean hasPrevious()
  Object previous()
  void add()

ArrayList 和 Vector

ArrayList 和 Vector 是 List 接口的兩個典型實現
區別:
  是一個古老的集合,一般建議使用 ArrayList
  ArrVector ayList 是線程不安全的,而 Vector 是線程安全的。
  即便爲保證 List 集合線程安全,也不推薦使用 Vector
Arrays.asList(…) 方法返回的 List 集合即不是 ArrayList 實例,也不是 Vector 實例。 Arrays.asList(…) 返回值是一個固定長度的 List 集合。

Map

簡介

Map 用於保存具備映射關係的數據,所以 Map 集合裏保存着兩組值,一組值用於保存 Map 裏的 Key,另一組用於保存 Map 裏的 Value
Map 中的 key 和 value 均可以是任何引用類型的數據
Map 中的 Key 不容許重複,即同一個 Map 對象的任何兩個 Key 經過 equals 方法比較中返回 false
Key 和 Vlaue 之間存在單向一對一關係,即經過指定的 Key 總能找到惟一的,肯定的 Value。

HashMap 和 Hashtable

HashMap 和 Hashtable 是 Map 接口的兩個典型實現類
區別:
  Hashtable 是一個古老的 Map 實現類,不建議使用
  Hashtable 是一個線程安全的 Map 實現,但 HashMap 是線程不安全的。
  Hashtable 不容許使用 null 做爲 key 和 value,而 HashMap 能夠
與 HashSet 集合不能保證元素的順序的順序同樣,Hashtable 、HashMap 也不能保證其中 key-value 對的順序
Hashtable 、HashMap 判斷兩個 Key 相等的標準是:兩個 Key 經過 equals 方法返回 true,hashCode 值也相等。
Hashtable 、HashMap 判斷兩個 Value相等的標準是:兩個 Value 經過 equals 方法返回 true

LinkedHashMap

LinkedHashMap 是 HashMap 的子類
LinkedHashMap 能夠維護 Map 的迭代順序:迭代順序與 Key-Value 對的插入順序一致

Properties

Properties 類是 Hashtable 的子類,該對象用於處理屬性文件
因爲屬性文件裏的 key、value 都是字符串類型,因此 properties 裏的 Key 和 Value 都是字符串類型的

TreeMap

TreeMap 存儲 Key-Value 對時,須要根據 Key 對 key-value 對進行排序。TreeMap 能夠保證全部的 Key-Value 對處於有序狀態。
TreeMap 的 Key 的排序:
  天然排序:TreeMap 的全部的 Key 必須實現 Comparable 接口,並且全部的 Key 應該是同一個類的對象,不然將會拋出 ClasssCastException
  定製排序:建立 TreeMap 時,傳入一個 Comparator 對象,該對象負責對 TreeMap 中的全部 key 進行排序。此時不須要 Map 的 Key 實現 Comparable 接口

Collections 工具類

Collections 是一個操做 Set、List 和 Map 等集合的工具類
Collections 中提供了大量方法對集合元素進行排序、查詢和修改等操做,還提供了對集合對象設置不可變、對集合對象實現同步控制等方法
排序操做:
  reverse(List):反轉 List 中元素的順序
  shuffle(List):對 List 集合元素進行隨機排序
  sort(List):根據元素的天然順序對指定 List 集合元素按升序排序
  sort(List,Comparator):根據指定的 Comparator 產生的順序對 List 集合元素進行排序
  swap(List,int, int):將指定 list 集合中的 i 處元素和 j 處元素進行交換

查找、替換
  Object max(Collection):根據元素的天然順序,返回給定集合中的最大元素
  Object max(Collection,Comparator):根據 Comparator 指定的順序,返回給定集合中的最大元素
  Object min(Collection)
  Object min(Collection,Comparator)
  int frequency(Collection,Object):返回指定集合中指定元素的出現次數
  boolean replaceAll(List list,Object oldVal,Object newVal):使用新值替換 List 對象的全部舊值

同步控制
  Collections 類中提供了多個 synchronizedXxx() 方法,該方法可以使將指定集合包裝成線程同步的集合,從而能夠解決多線程併發訪問集合時的線程安全問題 

Enumeration

 Enumeration 接口是 Iterator 迭代器的 「古老版本」

相關文章
相關標籤/搜索