我来详细介绍Java刷题过程中常用的集合用法。
一、List接口及实现类
ArrayList
List<Integer> list = new ArrayList<>(); list.add(1); // 添加元素 list.add(0, 2); // 在指定位置添加元素 list.get(0); // 获取元素 list.set(1, 3); // 修改元素 list.remove(0); // 删除指定位置元素 list.remove(Integer.valueOf(3)); // 删除指定元素 list.contains(1); // 判断是否包含 list.size(); // 获取大小 list.isEmpty(); // 判断是否为空 list.clear(); // 清空列表
LinkedList
LinkedList<String> linkedList = new LinkedList<>(); linkedList.add("a"); // 添加元素 linkedList.addFirst("b"); // 添加到头部 linkedList.addLast("c"); // 添加到尾部 linkedList.getFirst(); // 获取头部元素 linkedList.getLast(); // 获取尾部元素 linkedList.removeFirst(); // 删除头部元素 linkedList.removeLast(); // 删除尾部元素 linkedList.poll(); // 检索并删除头部元素(为空返回null) linkedList.peek(); // 检索但不删除头部元素(为空返回null)
二、Set接口及实现类
HashSet
Set<Character> set = new HashSet<>(); set.add('a'); // 添加元素 set.remove('a'); // 删除元素 set.contains('b'); // 判断是否包含 set.size(); // 获取大小 set.isEmpty(); // 判断是否为空 set.clear(); // 清空集合
TreeSet
// 默认升序排列 TreeSet<Integer> treeSet = new TreeSet<>(); // 自定义排序 TreeSet<Integer> customSet = new TreeSet<>((a, b) -> b - a); // 降序 treeSet.add(3); treeSet.add(1); treeSet.add(2); treeSet.first(); // 获取最小元素 treeSet.last(); // 获取最大元素 treeSet.lower(2); // 返回小于指定元素的最大元素 treeSet.higher(2); // 返回大于指定元素的最小元素 treeSet.floor(2); // 返回小于等于指定元素的最大元素 treeSet.ceiling(2); // 返回大于等于指定元素的最小元素
三、Map接口及实现类
HashMap
Map<Integer, String> map = new HashMap<>();
map.put(1, "one"); // 添加键值对
map.get(1); // 获取值
map.getOrDefault(2, "unknown"); // 获取值,不存在返回默认值
map.containsKey(1); // 判断是否包含键
map.containsValue("one"); // 判断是否包含值
map.remove(1); // 删除键值对
map.size(); // 获取大小
map.isEmpty(); // 判断是否为空
map.putIfAbsent(1, "one"); // 不存在则添加
// 遍历Map
for (Map.Entry<Integer, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
for (Integer key : map.keySet()) {
System.out.println(key);
}
for (String value : map.values()) {
System.out.println(value);
}
TreeMap
// 默认键升序排列 TreeMap<Integer, String> treeMap = new TreeMap<>(); // 自定义排序 TreeMap<Integer, String> customMap = new TreeMap<>((a, b) -> b - a); // 键降序 treeMap.put(3, "three"); treeMap.put(1, "one"); treeMap.put(2, "two"); treeMap.firstKey(); // 获取最小键 treeMap.lastKey(); // 获取最大键 treeMap.floorKey(2); // 返回小于等于指定键的最大键 treeMap.ceilingKey(2); // 返回大于等于指定键的最小键
四、优先队列
// 默认小顶堆 PriorityQueue<Integer> minHeap = new PriorityQueue<>(); // 大顶堆 PriorityQueue<Integer> maxHeap = new PriorityQueue<>((a, b) -> b - a); minHeap.add(3); // 添加元素 minHeap.add(1); minHeap.add(2); minHeap.peek(); // 获取堆顶元素但不删除 minHeap.poll(); // 获取并删除堆顶元素 minHeap.size(); // 获取大小 minHeap.isEmpty(); // 判断是否为空
五、双端队列Deque
Deque<Integer> deque = new ArrayDeque<>(); deque.addFirst(1); // 添加到队首 deque.addLast(2); // 添加到队尾 deque.offerFirst(3); // 添加到队首,有容量限制时返回是否成功 deque.offerLast(4); // 添加到队尾,有容量限制时返回是否成功 deque.getFirst(); // 获取队首元素 deque.getLast(); // 获取队尾元素 deque.peekFirst(); // 获取队首元素,为空返回null deque.peekLast(); // 获取队尾元素,为空返回null deque.removeFirst(); // 移除并返回队首元素 deque.removeLast(); // 移除并返回队尾元素 deque.pollFirst(); // 移除并返回队首元素,为空返回null deque.pollLast(); // 移除并返回队尾元素,为空返回null
六、集合工具类Collections
List<Integer> list = new ArrayList<>(Arrays.asList(3, 1, 2)); Collections.sort(list); // 升序排序 Collections.sort(list, (a, b) -> b - a); // 自定义排序 Collections.reverse(list); // 反转 Collections.shuffle(list); // 随机打乱 Collections.swap(list, 0, 1); // 交换元素 Collections.binarySearch(list, 2); // 二分查找(需先排序) Collections.max(list); // 最大值 Collections.min(list); // 最小值 Collections.fill(list, 0); // 填充
七、数组工具类Arrays
int[] arr = {3, 1, 2}; Arrays.sort(arr); // 升序排序 Arrays.sort(arr, 0, 2); // 部分排序 Arrays.binarySearch(arr, 2); // 二分查找(需先排序) Arrays.fill(arr, 0); // 填充 Arrays.equals(arr, new int[]{0, 0, 0}); // 判断数组是否相等 List<Integer> list = Arrays.asList(1, 2, 3); // 数组转List
八、常见算法场景应用
- 滑动窗口
Map<Character, Integer> window = new HashMap<>(); // 添加元素到窗口 window.put(c, window.getOrDefault(c, 0) + 1); // 移除元素 window.put(c, window.get(c) - 1); if (window.get(c) == 0) window.remove(c);
- 单调队列
Deque<Integer> deque = new ArrayDeque<>(); // 维护单调递减队列 while (!deque.isEmpty() && nums[deque.peekLast()] < nums[i]) { deque.pollLast(); } deque.offerLast(i);
- 两个堆维护中位数
PriorityQueue<Integer> minHeap = new PriorityQueue<>(); PriorityQueue<Integer> maxHeap = new PriorityQueue<>((a, b) -> b - a);
按类别整理的Java常用函数:
字符串操作函数
String str = "hello world";
str.length(); // 获取字符串长度
str.charAt(0); // 获取指定位置字符
str.substring(0, 5); // 截取子串(起始索引,结束索引)
str.substring(6); // 从指定位置截取到结尾
str.indexOf("world"); // 查找子串首次出现位置,未找到返回-1
str.lastIndexOf("l"); // 查找子串最后出现位置
str.startsWith("he"); // 判断是否以指定前缀开始
str.endsWith("ld"); // 判断是否以指定后缀结束
str.contains("wor"); // 判断是否包含子串
str.replace("l", "L"); // 替换所有匹配字符
str.replaceAll("\\s+", ""); // 使用正则表达式替换
str.toLowerCase(); // 转小写
str.toUpperCase(); // 转大写
str.trim(); // 去除首尾空格
str.split(" "); // 按空格分割字符串
str.toCharArray(); // 转换为字符数组
转换为字符数组
数组操作函数
int[] nums = {1, 2, 3, 4, 5}; Arrays.toString(nums); // 数组转字符串 Arrays.sort(nums); // 数组排序 Arrays.sort(nums, 1, 4); // 部分排序(起始索引,结束索引) Arrays.sort(nums, Collections.reverseOrder()); // 降序排序(需要包装类数组) Arrays.sort(nums, (a, b) -> b - a); // 自定义排序 Arrays.binarySearch(nums, 3); // 二分查找(需已排序) Arrays.fill(nums, 0); // 填充数组 Arrays.equals(nums, new int[]{0,0,0,0,0}); // 比较数组 Arrays.copyOf(nums, nums.length); // 复制数组 Arrays.copyOfRange(nums, 1, 3); // 复制数组的一部分
数字处理函数
Math.max(a, b); // 最大值 Math.min(a, b); // 最小值 Math.abs(-10); // 绝对值 Math.pow(2, 3); // 幂运算(2的3次方) Math.sqrt(9); // 平方根 Math.ceil(4.3); // 向上取整 Math.floor(4.7); // 向下取整 Math.round(4.5); // 四舍五入 Math.random(); // 随机数[0,1) Integer.parseInt("123"); // 字符串转整数 Double.parseDouble("123.45"); // 字符串转小数 Integer.toBinaryString(10); // 十进制转二进制字符串 Integer.toString(10, 16); // 十进制转十六进制字符串 Character.isDigit('9'); // 判断是否为数字 Character.isLetter('a'); // 判断是否为字母 Character.isLetterOrDigit('a'); // 判断是否为字母或数字 Character.toLowerCase('A'); // 转小写 Character.toUpperCase('a'); // 转大写
位操作函数
java
& (与) // 两位都为1才为1 | (或) // 两位有一个为1就为1 ^ (异或) // 两位不同为1,相同为0 ~ (取反) // 0变1,1变0 << (左移) // 每左移一位相当于乘2 >> (右移) // 每右移一位相当于除2 >>> (无符号右移) // 右移补0 Integer.bitCount(n); // 计算二进制中1的个数 Integer.highestOneBit(n); // 获取最高位的1 Integer.lowestOneBit(n); // 获取最低位的1 Integer.numberOfLeadingZeros(n); // 前导0的个数 Integer.numberOfTrailingZeros(n); // 后置0的个数
常用算法工具函数
// 判断质数 boolean isPrime(int n) { if (n <= 1) return false; if (n <= 3) return true; if (n % 2 == 0 || n % 3 == 0) return false; for (int i = 5; i * i <= n; i += 6) { if (n % i == 0 || n % (i + 2) == 0) return false; } return true; } // 最大公约数 int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); } // 最小公倍数 int lcm(int a, int b) { return a * b / gcd(a, b); } // 快速幂 long fastPow(long base, long exponent, long mod) { long result = 1; while (exponent > 0) { if ((exponent & 1) == 1) result = (result * base) % mod; base = (base * base) % mod; exponent >>= 1; } return result; } // 求组合数 int[][] generateCombinations(int n) { int[][] C = new int[n+1][n+1]; for (int i = 0; i <= n; i++) { C[i][0] = 1; for (int j = 1; j <= i; j++) { C[i][j] = (C[i-1][j-1] + C[i-1][j]); } } return C; }
输入输出处理
// 读取输入 Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); // 读取整数 double d = scanner.nextDouble(); // 读取小数 String s = scanner.next(); // 读取一个单词 String line = scanner.nextLine(); // 读取一行 // 更高效的输入 BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String line = reader.readLine(); String[] parts = line.split(" "); int n = Integer.parseInt(parts[0]); // 更高效的输出 BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out)); writer.write(String.valueOf(result)); writer.newLine(); writer.flush();
二叉树遍历模板
// 前序遍历 void preorder(TreeNode root) { if (root == null) return; // 处理当前节点 preorder(root.left); preorder(root.right); } // 中序遍历 void inorder(TreeNode root) { if (root == null) return; inorder(root.left); // 处理当前节点 inorder(root.right); } // 后序遍历 void postorder(TreeNode root) { if (root == null) return; postorder(root.left); postorder(root.right); // 处理当前节点 } // 层序遍历 void levelOrder(TreeNode root) { if (root == null) return; Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); while (!queue.isEmpty()) { int size = queue.size(); for (int i = 0; i < size; i++) { TreeNode node = queue.poll(); // 处理当前节点 if (node.left != null) queue.offer(node.left); if (node.right != null) queue.offer(node.right); } } }
图算法模板
// DFS模板 void dfs(int[][] graph, boolean[] visited, int node) { visited[node] = true; // 处理当前节点 for (int next : graph[node]) { if (!visited[next]) { dfs(graph, visited, next); } } } // BFS模板 void bfs(int[][] graph, boolean[] visited, int start) { Queue<Integer> queue = new LinkedList<>(); queue.offer(start); visited[start] = true; while (!queue.isEmpty()) { int node = queue.poll(); // 处理当前节点 for (int next : graph[node]) { if (!visited[next]) { visited[next] = true; queue.offer(next); } } } } 补充:
System.arraycopy()
// System.arraycopy(源数组, 源数组起始位置, 目标数组, 目标数组起始位置, 要复制的元素个数) int[] source = {1, 2, 3, 4, 5}; int[] dest = new int[5]; System.arraycopy(source, 0, dest, 0, source.length); // 完整复制 System.arraycopy(source, 1, dest, 2, 2); // 部分复制: 将source的索引1开始的2个元素复制到dest的索引2开始的位置