在算法竞赛(如蓝桥杯)、后端开发(如博客系统)、以及面试中,数据结构都是最核心的基础能力。
这篇文章不是简单罗列代码,而是帮你建立一个体系化认知:
-
每种数据结构怎么定义(Java / Go)
-
底层原理
-
时间复杂度
-
实战中怎么用(非常关键)
一、数组(Array)
Java
int[] arr = new int[10];
int[] arr2 = {1, 2, 3};
int[][] matrix = new int[3][4];
Go
var arr [10]int
arr2 := [3]int{1, 2, 3}
var matrix [3][4]int
📌 特点
-
固定长度
-
连续内存
-
支持随机访问
⏱️ 复杂度
-
访问:O(1)
-
插入/删除:O(n)
二、动态数组(Java ArrayList vs Go Slice)
Java:ArrayList
import java.util.*;
List<Integer> list = new ArrayList<>();
list.add(1);
list.get(0);
list.set(0, 100);
list.remove(0);
int size = list.size();
Go:Slice
s := make([]int, 0, 10)
s = append(s, 1)
x := s[0]
s[0] = 100
// 删除
i := 0
s = append(s[:i], s[i+1:]...)
len(s)
cap(s)
📌 核心理解(非常重要)
| 对比 | Java ArrayList | Go Slice |
|---|---|---|
| 本质 | 封装数组 | 数组引用 |
| 扩容 | 1.5倍 | 约2倍 |
| 访问 | list.get(i) | s[i] |
| 删除 | remove | append拼接 |
⚠️ 常见坑(Go)
func modify(s []int) {
s[0] = 999
}
👉 会影响原数组(引用语义)
三、链表(Linked List)
Java
class ListNode {
int val;
ListNode next;
ListNode(int val) { this.val = val; }
}
Go
type ListNode struct {
Val int
Next *ListNode
}
📌 特点
-
非连续内存
-
插入删除快
-
查找慢
⏱️ 复杂度
-
插入:O(1)
-
查找:O(n)
四、栈(Stack)
Java(推荐)
Deque<Integer> stack = new ArrayDeque<>();
stack.push(1);
stack.pop();
Go
type Stack []int
func (s *Stack) Push(x int) {
*s = append(*s, x)
}
func (s *Stack) Pop() int {
n := len(*s)
val := (*s)[n-1]
*s = (*s)[:n-1]
return val
}
📌 使用场景
-
括号匹配
-
表达式计算
-
DFS
五、队列(Queue)
Java
Queue<Integer> q = new LinkedList<>();
q.offer(1);
q.poll();
Go
type Queue []int
func (q *Queue) Push(x int) {
*q = append(*q, x)
}
func (q *Queue) Pop() int {
val := (*q)[0]
*q = (*q)[1:]
return val
}
📌 使用场景
-
BFS
-
任务队列
-
消息队列思想
六、双端队列(Deque)
Java
Deque<Integer> deque = new ArrayDeque<>();
deque.addFirst(1);
deque.addLast(2);
Go
type Deque []int
func (d *Deque) PushFront(x int) {
*d = append([]int{x}, *d...)
}
func (d *Deque) PushBack(x int) {
*d = append(*d, x)
}
七、哈希表(Map)
Java
HashMap<String, Integer> map = new HashMap<>();
map.put("a", 1);
Go
m := make(map[string]int)
m["a"] = 1
📌 特点
-
快速查找
-
无序
⏱️ 复杂度
- 平均 O(1)
八、集合(Set)
Java
HashSet<Integer> set = new HashSet<>();
set.add(1);
Go
set := make(map[int]struct{})
set[1] = struct{}{}
九、二叉树(Binary Tree)
Java
class TreeNode {
int val;
TreeNode left, right;
}
Go
type TreeNode struct {
Val int
Left, Right *TreeNode
}
📌 使用场景
-
搜索
-
排序
-
表达式树
十、堆(Heap / 优先队列)
Java
PriorityQueue<Integer> pq = new PriorityQueue<>();
Go
import "container/heap"
// 需要实现接口(略)
📌 使用场景
-
TopK问题
-
调度系统
-
优先级任务
十一、图(Graph)
Java
List<List<Integer>> graph = new ArrayList<>();
Go
graph := make([][]int, n)
📌 使用场景
-
路径问题
-
社交关系
-
推荐系统
十二、并查集(Union Find)
Java
class UnionFind {
int[] parent;
}
Go
type UnionFind struct {
parent []int
}
📌 使用场景
-
连通性问题
-
Kruskal算法