数据机构java案例
一、数组(Array)与集合(Collection)的转换
1. 数组 → 集合
• 固定大小 List(不可增删):
Integer[] arr = {1, 2, 3};
List<Integer> list = Arrays.asList(arr); // 注意:list 是 Arrays 内部类,不能增删元素
• 可变 List(推荐):
List<Integer> list = new ArrayList<>(Arrays.asList(arr)); // 可增删
• 基本类型数组(需手动转换):
int[] arr = {1, 2, 3};
List<Integer> list = Arrays.stream(arr).boxed().collect(Collectors.toList()); // Java 8+
2. 集合 → 数组
• List → 数组:
List<Integer> list = new ArrayList<>();
Integer[] arr = list.toArray(new Integer[0]); // 推荐写法
• List → 基本类型数组:
List<Integer> list = new ArrayList<>();
int[] arr = list.stream().mapToInt(Integer::intValue).toArray(); // Java 8+
二、常用数据结构核心操作
1. 数组(Array)
• 初始化:
int[] arr1 = new int[5]; // 全默认值 0
int[] arr2 = {1, 2, 3}; // 直接赋值
int[][] matrix = new int[3][3]; // 二维数组
• 工具方法(java.util.Arrays
):
Arrays.sort(arr); // 排序(可自定义 Comparator)
Arrays.fill(arr, 0); // 填充值
int[] copy = Arrays.copyOf(arr, arr.length); // 复制数组
boolean equal = Arrays.equals(arr1, arr2); // 比较数组内容
2. 动态数组(ArrayList)
• 核心操作:
List<Integer> list = new ArrayList<>();
list.add(1); // 添加元素 O(1)
list.add(0, 10); // 在索引 0 插入(O(n))
list.remove(list.size() - 1); // 删除末尾元素 O(1)
list.get(0); // 访问元素 O(1)
list.set(0, 100); // 修改元素 O(1)
3. 哈希表(HashMap)
• 核心操作:
Map<String, Integer> map = new HashMap<>();
map.put("key", 1); // 插入/更新 O(1)
map.get("key"); // 获取值 O(1)
map.containsKey("key"); // 检查键存在 O(1)
map.remove("key"); // 删除键值对 O(1)
// 遍历方式
for (Map.Entry<String, Integer> entry : map.entrySet()) {
String key = entry.getKey();
int value = entry.getValue();
}
4. 堆(PriorityQueue)
• 核心操作:
// 默认小顶堆(最小值在堆顶)
Queue<Integer> minHeap = new PriorityQueue<>();
// 大顶堆(自定义 Comparator)
Queue<Integer> maxHeap = new PriorityQueue<>((a, b) -> b - a);
minHeap.offer(3); // 插入元素 O(log n)
minHeap.poll(); // 弹出堆顶元素 O(log n)
minHeap.peek(); // 查看堆顶元素 O(1)
三、高频工具方法与技巧
1. 字符串操作(String)
• 常用方法:
String s = "Hello";
char[] chars = s.toCharArray(); // 转为字符数组
String sub = s.substring(1, 3); // 截取子串 "el"
String[] parts = s.split("e"); // 分割为 ["H", "llo"]
String merged = String.join("-", "a", "b"); // 合并为 "a-b"
• 高效拼接(StringBuilder):
StringBuilder sb = new StringBuilder();
sb.append("Hello").append("World"); // 链式调用
sb.reverse(); // 反转字符串
String result = sb.toString(); // 转为 String
2. 集合工具类(Collections)
• 排序与操作:
List<Integer> list = new ArrayList<>();
Collections.sort(list); // 升序排序
Collections.sort(list, (a, b) -> b - a); // 降序排序
Collections.reverse(list); // 反转列表
Collections.shuffle(list); // 随机打乱
3. 数学工具(Math)
• 常用方法:
int max = Math.max(3, 5); // 5
int abs = Math.abs(-10); // 10
double pow = Math.pow(2, 3); // 8.0
long round = Math.round(3.6); // 4
四、刷题必备模板
1. 双指针(Two Pointers)
• 场景:有序数组去重、两数之和、滑动窗口
int left = 0, right = 0;
while (right < n) {
// 扩展右指针
while (窗口需要收缩) {
// 收缩左指针
left++;
}
right++;
}
2. 二叉树遍历(递归)
• 前序遍历:
void preOrder(TreeNode root) {
if (root == null) return;
System.out.println(root.val); // 处理当前节点
preOrder(root.left);
preOrder(root.right);
}
3. 动态规划(DP)初始化模板
int[] dp = new int[n]; |
五、高频转换操作速查表
操作 | 代码示例 |
---|---|
数组 → List | List<Integer> list = new ArrayList<>(Arrays.asList(arr)); |
List → 数组 | Integer[] arr = list.toArray(new Integer[0]); |
字符数组 → String | String s = new String(charArr); |
String → 字符数组 | char[] chars = s.toCharArray(); |
Map 的 Key → List | List<K> keys = new ArrayList<>(map.keySet()); |
Map 的 Value → List | List<V> values = new ArrayList<>(map.values()); |
六、注意事项
- 数组越界:访问
arr[-1]
或arr[arr.length]
会抛出ArrayIndexOutOfBoundsException
。 - 空指针:操作
null
对象(如调用list.add(null)
后再操作元素)。 - 时间复杂度:
• 避免在循环中嵌套LinkedList
的get(index)
(O(n) 时间复杂度)。
• 优先使用HashSet
或HashMap
实现 O(1) 查找。 - 空间优化:若输入数据规模大(如
n > 10^5
),避免使用递归(可能导致栈溢出)。
掌握这些内容后,可以快速解决大多数 LeetCode 题目!建议重点练习以下高频题型:
• 数组/字符串:双指针、滑动窗口、子数组问题
• 哈希表:两数之和、子数组和计数
• 链表:反转、环检测、合并链表
• 二叉树:DFS/BFS、路径和
• 动态规划:背包问题、最长子序列
如果需要具体题目的代码模板,可以随时告诉我!