Java中常見的數據結構及示例講解
Java中常見的數據結構包括以下幾種:
1.數組(Array):是一種線性數據結構,用于存儲相同類型的元素,通過索引訪問和修改元素。
2.鏈表(Linked List):也是一種線性數據結構,由節點組成,每個節點包含數據和指向下一個節點的引用。
3.棧(Stack):是一種后進先出(LIFO)的數據結構,只能在棧頂進行插入和刪除操作。
4.隊列(Queue):是一種先進先出(FIFO)的數據結構,可以在隊尾插入元素,在隊頭刪除元素。
5.哈希表(HashMap):是一種使用鍵-值對存儲數據的數據結構,通過哈希函數將鍵映射到一個索引,可以快速訪問和修改數據。
6.集合(Set):是一種不允許重復元素的數據結構,常見的實現類有HashSet和TreeSet。
7.列表(List):是一種有序的數據結構,允許重復元素,常見的實現類有ArrayList和LinkedList。
8.樹(Tree):是一種非線性數據結構,由節點和邊組成,每個節點可以有多個子節點,常見的實現有二叉樹、AVL樹等。
9.圖(Graph):是一種由節點和邊組成的非線性數據結構,節點之間可以有多個連接關系。
10.堆(Heap):是一種特殊的樹形數據結構,用于高效地找到最大或最小值。
除了上述常見的數據結構,Java還提供了許多其他數據結構的實現,如優先隊列、雙向鏈表、散列表等,可以根據具體的需求選擇適合的數據結構。
接下來,我門通過一些示例代碼來介紹這些常見的數據結構。下面是一些簡單的示例代碼:
1.數組(Array):
int[] numbers = new int[5]; // 創建一個長度為5的整型數組
numbers[0] = 1; // 設置第一個元素的值為1
int element = numbers[2]; // 獲取第三個元素的值
System.out.println(element); // 輸出結果:0(默認值,因為沒有賦值)
2.鏈表(Linked List):
// 創建鏈表節點
class ListNode {
int value;
ListNode next;
ListNode(int value) {
this.value = value;
this.next = null;
}
}
// 創建鏈表
ListNode head = new ListNode(1); // 頭節點
ListNode node2 = new ListNode(2);
ListNode node3 = new ListNode(3);
head.next = node2;
node2.next = node3;
// 遍歷鏈表
ListNode current = head;
while (current != null) {
System.out.println(current.value);
current = current.next;
}
3.棧(Stack):
import java.util.Stack;
Stack<Integer> stack = new Stack<>();
stack.push(1); // 添加元素到棧頂
stack.push(2);
stack.push(3);
int topElement = stack.peek(); // 獲取棧頂元素(不移除)
System.out.println(topElement); // 輸出結果:3
int poppedElement = stack.pop(); // 彈出棧頂元素
System.out.println(poppedElement); // 輸出結果:3
4.隊列(Queue):
import java.util.LinkedList;
import java.util.Queue;
Queue<Integer> queue = new LinkedList<>();
queue.offer(1); // 添加元素到隊尾
queue.offer(2);
queue.offer(3);
int frontElement = queue.peek(); // 獲取隊頭元素(不移除)
System.out.println(frontElement); // 輸出結果:1
int dequeuedElement = queue.poll(); // 出隊隊頭元素
System.out.println(dequeuedElement); // 輸出結果:1
當談到哈希和集合這兩個概念時,通常會涉及到哈希表和集合數據結構。
5.哈希表(Hash Table)示例:
import java.util.HashMap;
HashMap<String, Integer> hashMap = new HashMap<>();
hashMap.put("apple", 1); // 向哈希表中插入鍵值對
hashMap.put("banana", 2);
hashMap.put("orange", 3);
int value = hashMap.get("banana"); // 通過鍵獲取對應的值
System.out.println(value); // 輸出結果:2
boolean containsKey = hashMap.containsKey("apple"); // 檢查哈希表中是否包含某個鍵
System.out.println(containsKey); // 輸出結果:true
hashMap.remove("orange"); // 移除指定鍵的鍵值對
for (String key : hashMap.keySet()) {
int val = hashMap.get(key);
System.out.println(key + ": " + val);
}
在上面的例子中,我們使用HashMap類來實現哈希表。我們插入了幾個鍵值對,然后通過鍵來獲取對應的值,檢查是否存在某個鍵,并移除指定鍵的鍵值對。還展示了如何遍歷哈希表的鍵集合,并獲取每個鍵對應的值。
6.集合(Set)示例:
import java.util.HashSet;
HashSet<Integer> set = new HashSet<>();
set.add(1); // 向集合中添加元素
set.add(2);
set.add(3);
boolean contains = set.contains(2); // 檢查集合中是否包含某個元素
System.out.println(contains); // 輸出結果:true
set.remove(3); // 從集合中移除指定元素
for (Integer num : set) {
System.out.println(num);
}
在上面的例子中,我們使用HashSet類來實現集合。我們添加了一些元素,檢查集合是否包含某個元素,并移除指定的元素。還展示了如何迭代集合中的元素并進行輸出。
哈希表和集合是常用的數據結構,它們提供了高效的存儲和查找操作。通過使用哈希函數來計算鍵的散列值,它們能夠快速地定位和訪問元素。在實際編程中,你可以根據具體的需求選擇使用適當的哈希表或集合實現類,并根據需要調用相應的方法
7.樹(Tree)示例:
BinarySearchTree:
class TreeNode {
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val) {
this.val = val;
this.left = null;
this.right = null;
}
}
class BinarySearchTree {
private TreeNode root;
public void insert(int val) {
root = insertNode(root, val);
}
private TreeNode insertNode(TreeNode node, int val) {
if (node == null) {
return new TreeNode(val);
}
if (val < node.val) {
node.left = insertNode(node.left, val);
} else if (val > node.val) {
node.right = insertNode(node.right, val);
}
return node;
}
public boolean search(int val) {
return searchNode(root, val);
}
private boolean searchNode(TreeNode node, int val) {
if (node == null) {
return false;
}
if (val == node.val) {
return true;
} else if (val < node.val) {
return searchNode(node.left, val);
} else {
return searchNode(node.right, val);
}
}
}
BinarySearchTree bst = new BinarySearchTree();
bst.insert(5);
bst.insert(2);
bst.insert(8);
bst.insert(1);
System.out.println(bst.search(2)); // 輸出結果:true,搜索值為2的節點
System.out.println(bst.search(10)); // 輸出結果:false,搜索值為10的節點
8.圖(Graph)示例:
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
class Graph {
private int vertices; // 圖中的頂點數
private List<List<Integer>> adjacencyList; // 鄰接表表示圖
public Graph(int vertices) {
this.vertices = vertices;
adjacencyList = new ArrayList<>(vertices);
for (int i = 0; i < vertices; i++) {
adjacencyList.add(new ArrayList<>());
}
}
public void addEdge(int source, int destination) {
adjacencyList.get(source).add(destination);
adjacencyList.get(destination).add(source);
}
public void breadthFirstSearch(int startVertex) {
boolean[] visited = new boolean[vertices];
Queue<Integer> queue = new LinkedList<>();
visited[startVertex] = true;
queue.offer(startVertex);
while (!queue.isEmpty()) {
int currentVertex = queue.poll();
System.out.print(currentVertex + " ");
List<Integer> neighbors = adjacencyList.get(currentVertex);
for (int neighbor : neighbors) {
if (!visited[neighbor]) {
visited[neighbor] = true;
queue.offer(neighbor);
}
}
}
}
}
Graph graph = new Graph(6);
graph.addEdge(0, 1);
graph.addEdge(0, 2);
graph.addEdge(1, 3);
graph.addEdge(2, 4);
graph.addEdge(3, 5);
graph.breadthFirstSearch(0); // 從頂點0開始進行廣度優先搜索
在上面的例子中,我們創建了一個簡單的圖,并使用鄰接表來表示圖的結構。然后,我們實現了廣度優先搜索算法來遍歷圖中的頂點。
9.堆(Heap)示例:
import java.util.PriorityQueue;
PriorityQueue<Integer> minHeap = new PriorityQueue<>(); // 創建一個最小堆
minHeap.offer(5); // 向堆中添加元素
minHeap.offer(2);
minHeap.offer(8);
minHeap.offer(1);
int minElement = minHeap.peek(); // 獲取堆頂元素(最小值)
System.out.println(minElement); // 輸出結果:1
while (!minHeap.isEmpty()) {
int currentElement = minHeap.poll(); // 彈出并移除堆頂元素
System.out.println(currentElement);
}
10. 列表示例:
import java.util.ArrayList;
ArrayList<Integer> myList = new ArrayList<>();
myList.add(1); // 在列表末尾添加元素
myList.add(2);
myList.add(3);
System.out.println(myList); // 輸出結果:[1, 2, 3]
myList.remove(1); // 移除指定索引位置的元素
System.out.println(myList); // 輸出結果:[1, 3]
int element = myList.get(0); // 獲取指定索引位置的元素
System.out.println(element); // 輸出結果:1
for (int i = 0; i < myList.size(); i++) { // 遍歷列表中的元素
System.out.println(myList.get(i));
}
在上面的例子中,我們使用優先隊列實現了一個最小堆。我們向堆中添加一些元素,然后通過peek()方法獲取最小的元素。最后,我們使用poll()方法逐個彈出并移除堆中的元素。
這些示例代碼展示了如何使一些常見數據結構的基本用法。你可以根據實際需求對代碼進行修改和擴展。