全面掌握数据结构:Java 与 Go 定义方式 + 原理 + 使用场景

在算法竞赛(如蓝桥杯)、后端开发(如博客系统)、以及面试中,数据结构都是最核心的基础能力。

这篇文章不是简单罗列代码,而是帮你建立一个体系化认知

  • 每种数据结构怎么定义(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) si
删除 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算法

相关推荐
腻害兔1 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
SeaTunnel1 小时前
从 Python Script 地狱到标准化数据集成框架
大数据·开发语言·python·程序员·代码·seatunnel
碎光拾影2 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
奋发向前wcx2 小时前
y1,y2总复习笔记5 2026.7.19
数据结构·笔记·算法
Marst Code2 小时前
(python)2026Plotly 库评估:交互式可视化到底值不值得引入?
开发语言·python
Miao121313 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言
腻害兔3 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:支付模块 yudao-module-pay,一个让产品经理都看懂的支付中台设计
java·前端·vue.js·产品经理·ai编程
William.csj3 小时前
BaiduPCS-Go——下载百度网盘文件的工具
golang·baidupc
CRMEB系统商城4 小时前
开源自建还是SaaS订阅?算一笔3年经济账
java·大数据·开发语言·开源
keyipatience5 小时前
线程栈与TLS和线程互斥
java·linux·服务器·开发语言·ubuntu