一、数组(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];
// 初始化边界条件
dp[0] = 1;
for (int i = 1; i < n; i++) {
// 状态转移方程
dp[i] = dp[i - 1] + dp[i - 2];
}

五、高频转换操作速查表

操作 代码示例
数组 → 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());

六、注意事项

  1. 数组越界:访问 arr[-1]arr[arr.length] 会抛出 ArrayIndexOutOfBoundsException
  2. 空指针:操作 null 对象(如调用 list.add(null) 后再操作元素)。
  3. 时间复杂度
    • 避免在循环中嵌套 LinkedListget(index)(O(n) 时间复杂度)。
    • 优先使用 HashSetHashMap 实现 O(1) 查找。
  4. 空间优化:若输入数据规模大(如 n > 10^5),避免使用递归(可能导致栈溢出)。

掌握这些内容后,可以快速解决大多数 LeetCode 题目!建议重点练习以下高频题型:
数组/字符串:双指针、滑动窗口、子数组问题
哈希表:两数之和、子数组和计数
链表:反转、环检测、合并链表
二叉树:DFS/BFS、路径和
动态规划:背包问题、最长子序列

如果需要具体题目的代码模板,可以随时告诉我!