Java 資料結構
Java工具包提供了強大的資料結構,在Java中的資料結構主要包括以下幾種介面和類:
- 列舉(Enumeration)
- 位集合(BitSet)
- 向量(Vector)
- 堆疊(Stack)
- 字典(Dictionary)
- 哈希表(Hashtable)
- 屬性(Properties)
以上這些類是傳統遺留的,在Java2中引入了一種新的框架-集合框架(Collection),我們后面再討論,
列舉(Enumeration)
列舉(Enumeration)介面雖然它本身不屬于資料結構,但它在其他資料結構的范疇里應用很廣, 列舉(The Enumeration)介面定義了一種從資料結構中取回連續元素的方式,
例如,列舉定義了一個叫nextElement 的方法,該方法用來得到一個包含多元素的資料結構的下一個元素,
Enumeration介面中定義了一些方法,通過這些方法可以列舉(一次獲得一個)物件集合中的元素,
這種傳統介面已被迭代器取代,雖然Enumeration 還未被遺棄,但在現代代碼中已經被很少使用了,盡管如此,它還是使用在諸如Vector和Properties這些傳統類所定義的方法中,除此之外,還用在一些API類,并且在應用程式中也廣泛被使用, 下表總結了一些Enumeration宣告的方法:
| 序號 | 方法描述 |
|---|---|
| 1 | boolean hasMoreElements( ) 測驗此列舉是否包含更多的元素, |
| 2 | Object nextElement( ) 如果此列舉物件至少還有一個可提供的元素,則回傳此列舉的下一個元素, |
import java.util.Vector; import java.util.Enumeration; public class EnumerationTester { public static void main(String args[]) { Enumeration<String> days; Vector<String> dayNames = new Vector<String>(); dayNames.add("Sunday"); dayNames.add("Monday"); dayNames.add("Tuesday"); dayNames.add("Wednesday"); dayNames.add("Thursday"); dayNames.add("Friday"); dayNames.add("Saturday"); days = dayNames.elements(); while (days.hasMoreElements()){ System.out.println(days.nextElement()); } } }
上面實體演示了Enumeration的使用
位集合(BitSet)
位集合類實作了一組可以單獨設定和清除的位或標志,
該類在處理一組布林值的時候非常有用,你只需要給每個值賦值一"位",然后對位進行適當的設定或清除,就可以對布林值進行操作了,
向量(Vector)
向量(Vector)類和傳統陣列非常相似,但是Vector的大小能根據需要動態的變化,
和陣列一樣,Vector物件的元素也能通過索引訪問,
使用Vector類最主要的好處就是在創建物件的時候不必給物件指定大小,它的大小會根據需要動態的變化,
堆疊(Stack)
堆疊(Stack)實作了一個后進先出(LIFO)的資料結構,
你可以把堆疊理解為物件的垂直分布的堆疊,當你添加一個新元素時,就將新元素放在其他元素的頂部,
當你從堆疊中取元素的時候,就從堆疊頂取一個元素,換句話說,最后進堆疊的元素最先被取出,
字典(Dictionary)
字典(Dictionary) 類是一個抽象類,它定義了鍵映射到值的資料結構,
當你想要通過特定的鍵而不是整數索引來訪問資料的時候,這時候應該使用Dictionary,
由于Dictionary類是抽象類,所以它只提供了鍵映射到值的資料結構,而沒有提供特定的實作,
哈希表(Hashtable)
Hashtable類提供了一種在用戶定義鍵結構的基礎上來組織資料的手段,
例如,在地址串列的哈希表中,你可以根據郵政編碼作為鍵來存盤和排序資料,而不是通過人名,
哈希表鍵的具體含義完全取決于哈希表的使用情景和它包含的資料,
屬性(Properties)
Properties 繼承于 Hashtable.Properties 類表示了一個持久的屬性集.屬性串列中每個鍵及其對應值都是一個字串,
Properties 類被許多Java類使用,例如,在獲取環境變數時它就作為System.getProperties()方法的回傳值,
Java集合框架
Java 集合框架
早在 Java 2 中之前,Java 就提供了特設類,比如:Dictionary, Vector, Stack, 和 Properties 這些類用來存盤和操作物件組,
雖然這些類都非常有用,但是它們缺少一個核心的,統一的主題,由于這個原因,使用 Vector 類的方式和使用 Properties 類的方式有著很大不同,
集合框架被設計成要滿足以下幾個目標,
-
該框架必須是高性能的,基本集合(動態陣列,鏈表,樹,哈希表)的實作也必須是高效的,
-
該框架允許不同型別的集合,以類似的方式作業,具有高度的互操作性,
-
對一個集合的擴展和適應必須是簡單的,
為此,整個集合框架就圍繞一組標準介面而設計,你可以直接使用這些介面的標準實作,諸如: LinkedList, HashSet, 和 TreeSet 等,除此之外你也可以通過這些介面實作自己的集合,

從上面的集合框架圖可以看到,Java 集合框架主要包括兩種型別的容器,一種是集合(Collection),存盤一個元素集合,另一種是圖(Map),存盤鍵/值對映射,Collection 介面又有 3 種子型別,List、Set 和 Queue,再下面是一些抽象類,最后是具體實作類,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等,
集合框架是一個用來代表和操縱集合的統一架構,所有的集合框架都包含如下內容:
-
介面:是代表集合的抽象資料型別,例如 Collection、List、Set、Map 等,之所以定義多個介面,是為了以不同的方式操作集合物件
-
實作(類):是集合介面的具體實作,從本質上講,它們是可重復使用的資料結構,例如:ArrayList、LinkedList、HashSet、HashMap,
-
演算法:是實作集合介面的物件里的方法執行的一些有用的計算,例如:搜索和排序,這些演算法被稱為多型,那是因為相同的方法可以在相似的介面上有著不同的實作,
除了集合,該框架也定義了幾個 Map 介面和類,Map 里存盤的是鍵/值對,盡管 Map 不是集合,但是它們完全整合在集合中,
集合框架體系如圖所示

Java 集合框架提供了一套性能優良,使用方便的介面和類,java集合框架位于java.util包中, 所以當使用集合框架的時候需要進行導包,
Set和List的區別
-
1. Set 介面實體存盤的是無序的,不重復的資料,List 介面實體存盤的是有序的,可以重復的元素,
-
2. Set 檢索效率低下,洗掉和插入效率高,插入和洗掉不會引起元素位置改變 <實作類有HashSet,TreeSet>,
-
3. List 和陣列類似,可以動態增長,根據實際存盤的資料的長度自動增長 List 的長度,查找元素效率高,插入洗掉效率低,因為會引起其他元素位置改變 <實作類有ArrayList,LinkedList,Vector> ,
·遍歷map
import java.util.*; public class Test{ public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>(); map.put("1", "value1"); map.put("2", "value2"); map.put("3", "value3"); //第一種:普遍使用,二次取值 System.out.println("通過Map.keySet遍歷key和value:"); for (String key : map.keySet()) { System.out.println("key= "+ key + " and value= "https://www.cnblogs.com/kamisato132/p/+ map.get(key)); } //第二種 System.out.println("通過Map.entrySet使用iterator遍歷key和value:"); Iterator<Map.Entry<String, String>> it = map.entrySet().iterator(); while (it.hasNext()) { Map.Entry<String, String> entry = it.next(); System.out.println("key= " + entry.getKey() + " and value= "https://www.cnblogs.com/kamisato132/p/+ entry.getValue()); } //第三種:推薦,尤其是容量大時 System.out.println("通過Map.entrySet遍歷key和value"); for (Map.Entry<String, String> entry : map.entrySet()) { System.out.println("key= " + entry.getKey() + " and value= "https://www.cnblogs.com/kamisato132/p/+ entry.getValue()); } //第四種 System.out.println("通過Map.values()遍歷所有的value,但不能遍歷key"); for (String v : map.values()) { System.out.println("value= "https://www.cnblogs.com/kamisato132/p/+ v); } } }
總結
Java集合框架為程式員提供了預先包裝的資料結構和演算法來操縱他們,
集合是一個物件,可容納其他物件的參考,集合介面宣告對每一種型別的集合可以執行的操作,
集合框架的類和介面均在java.util包中,
任何物件加入集合類后,自動轉變為Object型別,所以在取出的時候,需要進行強制型別轉換,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/501298.html
標籤:Java
下一篇:GBase 8t索引
