在 java 中,常用的数据结构可以通过 集合框架(collections framework) 实现,也可以手动实现。以下是常见数据结构及其特点,以及对应的 java 实现示例:
1. 数组(array)
- 特点:固定大小、内存连续、随机访问高效。
- 用途:存储固定数量的元素。
java 实现:
int[] array = new int[5]; // 静态数组 array[0] = 10;
2. 动态数组
(arraylist)
- 特点:基于数组实现,支持动态扩容,随机访问高效(o(1)),插入/删除低效(o(n))。
- 用途:需要频繁随机访问的场景。
java 实现:
import java.util.arraylist; arraylist<integer> list = new arraylist<>(); list.add(10); // 添加元素 int value = list.get(0); // 访问元素
3. 链表(linkedlist)
- 特点:基于双向链表实现,插入/删除高效(o(1)),随机访问低效(o(n))。
- 用途:频繁插入/删除的场景。
- java 实现:
import java.util.linkedlist; linkedlist<integer> linkedlist = new linkedlist<>(); linkedlist.add(10); // 添加元素 linkedlist.addfirst(5); // 头部插入 int first = linkedlist.getfirst(); // 访问头部元素
4. 栈(stack)
- 特点:后进先出(lifo),支持
push
和pop
操作。 - 用途:函数调用栈、表达式求值。
- java 实现(推荐使用
deque
):
import java.util.arraydeque; arraydeque<integer> stack = new arraydeque<>(); stack.push(10); // 压栈 int top = stack.pop(); // 弹栈
5. 队列(queue)
- 特点:先进先出(fifo),支持
offer
和poll
操作。 - 用途:任务调度、广度优先搜索(bfs)。
- java 实现:
import java.util.queue; import java.util.linkedlist; queue<integer> queue = new linkedlist<>(); queue.offer(10); // 入队 int head = queue.poll(); // 出队
6. 哈希表(hashmap)
- 特点:基于哈希表实现,键值对存储,查找高效(平均 o(1)),无序。
- 用途:快速查找、去重。
- java 实现:
import java.util.hashmap; hashmap<string, integer> map = new hashmap<>(); map.put("alice", 25); // 添加键值对 int age = map.get("alice"); // 查找
7. 树(treeset/treemap)
- 特点:基于红黑树实现,元素自动排序(按自然顺序或自定义比较器),查找/插入/删除时间复杂度为 o(log n)。
- 用途:需要有序存储的场景。
- java 实现:
import java.util.treeset; treeset<integer> treeset = new treeset<>(); treeset.add(10); treeset.add(5); // 自动排序为 [5, 10]
8. 堆(priorityqueue)
- 特点:基于堆(默认最小堆)实现,元素按优先级排序。
- 用途:任务调度、求 top k 问题。
- java 实现:
import java.util.priorityqueue; priorityqueue<integer> heap = new priorityqueue<>(); heap.offer(10); heap.offer(5); // 堆顶为 5 int min = heap.poll(); // 弹出最小值 5
9. 图(graph)
- 特点:节点和边的集合,通常通过邻接表或邻接矩阵实现。
- 用途:社交网络、路径规划。
- java 实现(邻接表):
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)
- 特点:不允许重复元素。
- java 实现(
hashset
和treeset
):
import java.util.hashset; hashset<string> set = new hashset<>(); set.add("apple"); set.add("apple"); // 重复元素会被忽略
11. 双向队列(deque)
- 特点:支持两端插入和删除。
- 用途:滑动窗口、双端操作。
- java 实现:
import java.util.arraydeque; arraydeque<integer> deque = new arraydeque<>(); deque.addfirst(10); deque.addlast(20); int first = deque.removefirst();
12. 自定义链表(手动实现)
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; } } }
总结
java 提供了丰富的内置数据结构(通过 java.util
包),开发者可以根据需求选择合适的结构:
- 快速查找:
hashmap
、hashset
- 有序存储:
treemap
、treeset
- 高效插入/删除:
linkedlist
、arraydeque
- 动态扩容:
arraylist
- 优先级处理:
priorityqueue
掌握这些数据结构的特点和使用场景,可以显著提升代码效率和可维护性!
到此这篇关于java手动实现常见数据结构的文章就介绍到这了,更多相关java常见数据结构内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论