java手動實現(xiàn)常見數(shù)據(jù)結(jié)構(gòu)的示例代碼
在 Java 中,常用的數(shù)據(jù)結(jié)構(gòu)可以通過 集合框架(Collections Framework) 實現(xiàn),也可以手動實現(xiàn)。以下是常見數(shù)據(jù)結(jié)構(gòu)及其特點,以及對應(yīng)的 Java 實現(xiàn)示例:
1. 數(shù)組(Array)
- 特點:固定大小、內(nèi)存連續(xù)、隨機訪問高效。
- 用途:存儲固定數(shù)量的元素。
Java 實現(xiàn):
int[] array = new int[5]; // 靜態(tài)數(shù)組 array[0] = 10;
2. 動態(tài)數(shù)組
(ArrayList)
- 特點:基于數(shù)組實現(xiàn),支持動態(tài)擴容,隨機訪問高效(O(1)),插入/刪除低效(O(n))。
- 用途:需要頻繁隨機訪問的場景。
Java 實現(xiàn):
import java.util.ArrayList; ArrayList<Integer> list = new ArrayList<>(); list.add(10); // 添加元素 int value = list.get(0); // 訪問元素
3. 鏈表(LinkedList)
- 特點:基于雙向鏈表實現(xiàn),插入/刪除高效(O(1)),隨機訪問低效(O(n))。
- 用途:頻繁插入/刪除的場景。
- Java 實現(xiàn):
import java.util.LinkedList; LinkedList<Integer> linkedList = new LinkedList<>(); linkedList.add(10); // 添加元素 linkedList.addFirst(5); // 頭部插入 int first = linkedList.getFirst(); // 訪問頭部元素
4. 棧(Stack)
- 特點:后進先出(LIFO),支持
push和pop操作。 - 用途:函數(shù)調(diào)用棧、表達式求值。
- Java 實現(xiàn)(推薦使用
Deque):
import java.util.ArrayDeque; ArrayDeque<Integer> stack = new ArrayDeque<>(); stack.push(10); // 壓棧 int top = stack.pop(); // 彈棧
5. 隊列(Queue)
- 特點:先進先出(FIFO),支持
offer和poll操作。 - 用途:任務(wù)調(diào)度、廣度優(yōu)先搜索(BFS)。
- Java 實現(xiàn):
import java.util.Queue; import java.util.LinkedList; Queue<Integer> queue = new LinkedList<>(); queue.offer(10); // 入隊 int head = queue.poll(); // 出隊
6. 哈希表(HashMap)
- 特點:基于哈希表實現(xiàn),鍵值對存儲,查找高效(平均 O(1)),無序。
- 用途:快速查找、去重。
- Java 實現(xiàn):
import java.util.HashMap;
HashMap<String, Integer> map = new HashMap<>();
map.put("Alice", 25); // 添加鍵值對
int age = map.get("Alice"); // 查找7. 樹(TreeSet/TreeMap)
- 特點:基于紅黑樹實現(xiàn),元素自動排序(按自然順序或自定義比較器),查找/插入/刪除時間復(fù)雜度為 O(log n)。
- 用途:需要有序存儲的場景。
- Java 實現(xiàn):
import java.util.TreeSet; TreeSet<Integer> treeSet = new TreeSet<>(); treeSet.add(10); treeSet.add(5); // 自動排序為 [5, 10]
8. 堆(PriorityQueue)
- 特點:基于堆(默認最小堆)實現(xiàn),元素按優(yōu)先級排序。
- 用途:任務(wù)調(diào)度、求 Top K 問題。
- Java 實現(xiàn):
import java.util.PriorityQueue; PriorityQueue<Integer> heap = new PriorityQueue<>(); heap.offer(10); heap.offer(5); // 堆頂為 5 int min = heap.poll(); // 彈出最小值 5
9. 圖(Graph)
- 特點:節(jié)點和邊的集合,通常通過鄰接表或鄰接矩陣實現(xiàn)。
- 用途:社交網(wǎng)絡(luò)、路徑規(guī)劃。
- Java 實現(xiàn)(鄰接表):
import java.util.*;
class Graph {
private Map<Integer, List<Integer>> adjacencyList = new HashMap<>();
public void addEdge(int src, int dest) {
adjacencyList.computeIfAbsent(src, k -> new ArrayList<>()).add(dest);
adjacencyList.computeIfAbsent(dest, k -> new ArrayList<>()).add(src); // 無向圖
}
}10. 集合(Set)
- 特點:不允許重復(fù)元素。
- Java 實現(xiàn)(
HashSet和TreeSet):
import java.util.HashSet;
HashSet<String> set = new HashSet<>();
set.add("Apple");
set.add("Apple"); // 重復(fù)元素會被忽略11. 雙向隊列(Deque)
- 特點:支持兩端插入和刪除。
- 用途:滑動窗口、雙端操作。
- Java 實現(xiàn):
import java.util.ArrayDeque; ArrayDeque<Integer> deque = new ArrayDeque<>(); deque.addFirst(10); deque.addLast(20); int first = deque.removeFirst();
12. 自定義鏈表(手動實現(xiàn))
class Node {
int data;
Node next;
Node(int data) {
this.data = data;
this.next = null;
}
}
class LinkedList {
Node head;
public void add(int data) {
Node newNode = new Node(data);
if (head == null) {
head = newNode;
} else {
Node current = head;
while (current.next != null) {
current = current.next;
}
current.next = newNode;
}
}
}總結(jié)
Java 提供了豐富的內(nèi)置數(shù)據(jù)結(jié)構(gòu)(通過 java.util 包),開發(fā)者可以根據(jù)需求選擇合適的結(jié)構(gòu):
- 快速查找:
HashMap、HashSet - 有序存儲:
TreeMap、TreeSet - ???????高效插入/刪除:
LinkedList、ArrayDeque - ???????動態(tài)擴容:
ArrayList - ???????優(yōu)先級處理:
PriorityQueue
掌握這些數(shù)據(jù)結(jié)構(gòu)的特點和使用場景,可以顯著提升代碼效率和可維護性!
到此這篇關(guān)于java手動實現(xiàn)常見數(shù)據(jù)結(jié)構(gòu)的文章就介紹到這了,更多相關(guān)java常見數(shù)據(jù)結(jié)構(gòu)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java數(shù)據(jù)結(jié)構(gòu)之紅黑樹的實現(xiàn)方法和原理詳解
- Java數(shù)據(jù)結(jié)構(gòu)中七種排序算法實現(xiàn)詳解
- Java數(shù)據(jù)結(jié)構(gòu)中關(guān)于AVL樹的實現(xiàn)方法詳解
- Java數(shù)據(jù)結(jié)構(gòu)和算法之鏈表詳解
- Java數(shù)據(jù)結(jié)構(gòu)篇之實現(xiàn)二叉搜索樹的核心方法
- Java數(shù)據(jù)結(jié)構(gòu)與算法之二分查找詳解
- Java數(shù)據(jù)結(jié)構(gòu)中的HashMap和HashSet詳解
- Java常見的數(shù)據(jù)結(jié)構(gòu)之棧和隊列詳解
相關(guān)文章
為什么不推薦使用BeanUtils屬性轉(zhuǎn)換工具示例詳解
這篇文章主要介紹了為什么不推薦使用BeanUtils屬性轉(zhuǎn)換工具,本文通過示例代碼給大家詳細介紹,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07
淺談Java內(nèi)部類與靜態(tài)內(nèi)部類的區(qū)別
本文主要介紹了淺談Java內(nèi)部類與靜態(tài)內(nèi)部類的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
SpringBoot實現(xiàn)RAS+AES自動接口解密
本文主要介紹了SpringBoot實現(xiàn)RAS+AES自動接口解密,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03

