Java 提供了豐富的數(shù)據(jù)結(jié)構(gòu)來處理和組織數(shù)據(jù)。
Java 的 java.util 包中提供了許多這些數(shù)據(jù)結(jié)構(gòu)的實現(xiàn),可以根據(jù)需要選擇合適的類。
以下是一些常見的 Java 數(shù)據(jù)結(jié)構(gòu):
數(shù)組(Arrays)
數(shù)組(Arrays)是一種基本的數(shù)據(jù)結(jié)構(gòu),可以存儲固定大小的相同類型的元素。
int[] array = new int[5];
特點: 固定大小,存儲相同類型的元素。
優(yōu)點: 隨機訪問元素效率高。
缺點: 大小固定,插入和刪除元素相對較慢。
列表(Lists)
Java 提供了多種列表實現(xiàn),如 ArrayList 和 LinkedList。
List<String> arrayList = new ArrayList<>();
List<Integer> linkedList = new LinkedList<>();
ArrayList:
特點: 動態(tài)數(shù)組,可變大小。
優(yōu)點: 高效的隨機訪問和快速尾部插入。
缺點: 中間插入和刪除相對較慢。
LinkedList:
特點: 雙向鏈表,元素之間通過指針連接。
優(yōu)點: 插入和刪除元素高效,迭代器性能好。
缺點: 隨機訪問相對較慢。
集合(Sets)
集合(Sets)用于存儲不重復的元素,常見的實現(xiàn)有 HashSet 和 TreeSet。
Set<String> hashSet = new HashSet<>();
Set<Integer> treeSet = new TreeSet<>();
HashSet:
特點: 無序集合,基于HashMap實現(xiàn)。
優(yōu)點: 高效的查找和插入操作。
缺點: 不保證順序。
映射(Maps)
映射(Maps)用于存儲鍵值對,常見的實現(xiàn)有 HashMap 和 TreeMap。
Map<String, Integer> hashMap = new HashMap<>();
Map<String, Integer> treeMap = new TreeMap<>();
HashMap:
特點: 基于哈希表實現(xiàn)的鍵值對存儲結(jié)構(gòu)。
優(yōu)點: 高效的查找、插入和刪除操作。
缺點: 無序,不保證順序。
TreeMap:
特點: 基于紅黑樹實現(xiàn)的有序鍵值對存儲結(jié)構(gòu)。
優(yōu)點: 有序,支持按照鍵的順序遍歷。
缺點: 插入和刪除相對較慢。
棧(Stack)
棧(Stack)遵循先進后出(FILO)原則。
Stack<Integer> stack = new Stack<>();
Stack 類:
特點: 代表一個棧,通常按照后進先出(LIFO)的順序操作元素。
隊列(Queue)
隊列(Queue)遵循先進先出(FIFO)原則,常見的實現(xiàn)有 LinkedList 和 PriorityQueue。
Queue<String> queue = new LinkedList<>();
Queue 接口:
特點: 代表一個隊列,通常按照先進先出(FIFO)的順序操作元素。
實現(xiàn)類: LinkedList, PriorityQueue, ArrayDeque。
堆(Heap)
堆(Heap)優(yōu)先隊列的基礎,可以實現(xiàn)最大堆和最小堆。
PriorityQueue<Integer> minHeap = new PriorityQueue<>();
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder());
樹(Trees)
Java 提供了 TreeNode 類型,可以用于構(gòu)建二叉樹等數(shù)據(jù)結(jié)構(gòu)。
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
圖(Graphs)
圖的表示通常需要自定義數(shù)據(jù)結(jié)構(gòu)或使用圖庫,Java 沒有內(nèi)建的圖類。
以上介紹的只是 Java 中一些常見的數(shù)據(jù)結(jié)構(gòu),實際上還有很多其他的數(shù)據(jù)結(jié)構(gòu)和算法可以根據(jù)具體問題選擇使用。
其他一些說明
以下這些類是傳統(tǒng)遺留的,在 Java2 中引入了一種新的框架-集合框架(Collection),我們后面再討論。
枚舉(Enumeration)
枚舉(Enumeration)接口雖然它本身不屬于數(shù)據(jù)結(jié)構(gòu),但它在其他數(shù)據(jù)結(jié)構(gòu)的范疇里應用很廣。 枚舉(The Enumeration)接口定義了一種從數(shù)據(jù)結(jié)構(gòu)中取回連續(xù)元素的方式。
例如,枚舉定義了一個叫nextElement 的方法,該方法用來得到一個包含多元素的數(shù)據(jù)結(jié)構(gòu)的下一個元素。
關于枚舉接口的更多信息,請參見枚舉(Enumeration)。
位集合(BitSet)
位集合類實現(xiàn)了一組可以單獨設置和清除的位或標志。
該類在處理一組布爾值的時候非常有用,你只需要給每個值賦值一"位",然后對位進行適當?shù)脑O置或清除,就可以對布爾值進行操作了。
關于該類的更多信息,請參見位集合(BitSet)。
向量(Vector)
向量(Vector)類和傳統(tǒng)數(shù)組非常相似,但是Vector的大小能根據(jù)需要動態(tài)的變化。
和數(shù)組一樣,Vector對象的元素也能通過索引訪問。
使用Vector類最主要的好處就是在創(chuàng)建對象的時候不必給對象指定大小,它的大小會根據(jù)需要動態(tài)的變化。
關于該類的更多信息,請參見向量(Vector)
棧(Stack)
棧(Stack)實現(xiàn)了一個后進先出(LIFO)的數(shù)據(jù)結(jié)構(gòu)。
你可以把棧理解為對象的垂直分布的棧,當你添加一個新元素時,就將新元素放在其他元素的頂部。
當你從棧中取元素的時候,就從棧頂取一個元素。換句話說,最后進棧的元素最先被取出。
關于該類的更多信息,請參見棧(Stack)。
字典(Dictionary)
字典(Dictionary) 類是一個抽象類,它定義了鍵映射到值的數(shù)據(jù)結(jié)構(gòu)。
當你想要通過特定的鍵而不是整數(shù)索引來訪問數(shù)據(jù)的時候,這時候應該使用 Dictionary。
由于 Dictionary 類是抽象類,所以它只提供了鍵映射到值的數(shù)據(jù)結(jié)構(gòu),而沒有提供特定的實現(xiàn)。
關于該類的更多信息,請參見字典( Dictionary)。
Dictionary 類在較新的 Java 版本中已經(jīng)被棄用(deprecated),推薦使用 Map 接口及其實現(xiàn)類,如 HashMap、TreeMap 等,來代替 Dictionary。
Map 接口及其實現(xiàn)類 可以參考:Java 集合框架。
哈希表(Hashtable)
Hashtable類提供了一種在用戶定義鍵結(jié)構(gòu)的基礎上來組織數(shù)據(jù)的手段。
例如,在地址列表的哈希表中,你可以根據(jù)郵政編碼作為鍵來存儲和排序數(shù)據(jù),而不是通過人名。
哈希表鍵的具體含義完全取決于哈希表的使用情景和它包含的數(shù)據(jù)。
關于該類的更多信息,請參見哈希表(HashTable)。
屬性(Properties)
Properties 繼承于 Hashtable.Properties 類表示了一個持久的屬性集.屬性列表中每個鍵及其對應值都是一個字符串。
Properties 類被許多Java類使用。例如,在獲取環(huán)境變量時它就作為System.getProperties()方法的返回值。
關于該類的更多信息,請參見屬性(Properties)。