1. Java刷题必备:集合与类型转换实战指南
作为一名常年混迹LeetCode和各类算法竞赛的老兵,我深刻体会到Java集合框架和类型转换在解题中的重要性。很多初学者在刷题时往往卡在数据结构的选择和类型处理上,导致明明思路正确却因为实现细节浪费大量时间。本文将结合我多年刷题经验,手把手带你掌握这些核心技能。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心集合类实战解析
2.1 ArrayList与LinkedList的抉择之道
ArrayList作为动态数组实现,其随机访问时间复杂度为O(1),这得益于数组内存连续存储的特性。但在中间位置插入/删除元素时,需要移动后续所有元素,最坏情况下时间复杂度达到O(n)。来看个典型场景:
java复制// 初始化容量为10的ArrayList
ArrayList<Integer> arrayList = new ArrayList<>(10);
// 尾部添加元素 - 平均O(1)
arrayList.add(1);
// 中间插入元素 - O(n)
arrayList.add(0, 2);
实战技巧:预先估算数据规模并设置合理初始容量,可避免频繁扩容。比如知道数据量在1000左右,直接new ArrayList<>(1000)
LinkedList采用双向链表结构,任何位置的插入删除都是O(1)时间复杂度,但随机访问需要遍历链表,最坏O(n)。特别适合实现队列和栈:
java复制LinkedList<String> linkedList = new LinkedList<>();
// 实现栈的push/pop
linkedList.push("A"); // O(1)
String top = linkedList.pop(); // O(1)
// 实现队列的enqueue/dequeue
linkedList.addLast("B"); // O(1)
String head = linkedList.removeFirst(); // O(1)
2.2 HashMap的高效查找秘诀
HashMap的O(1)时间复杂度背后是哈希函数和数组+链表的存储结构。JDK8后当链表长度超过8时会转为红黑树,保证最坏情况下的O(log n)性能。刷题中常用操作:
java复制HashMap<Character, Integer> freqMap = new HashMap<>();
// 统计字符频率 - 比数组更灵活
String s = "leetcode";
for (char c : s.toCharArray()) {
freqMap.put(c, freqMap.getOrDefault(c, 0) + 1);
}
// 快速查找 - O(1)
if (freqMap.containsKey('e')) {
System.out.println("e出现的次数: " + freqMap.get('e'));
}
避坑指南:使用自定义类作为Key时,必须正确重写hashCode()和equals()方法,否则会导致查找失败。这是面试常考点!
2.3 TreeSet的有序魔法
基于红黑树实现的TreeSet保持元素自然排序,所有操作都是O(log n)时间复杂度。特别适合需要维护有序集合的场景:
java复制TreeSet<Integer> sortedSet = new TreeSet<>();
// 自动排序
sortedSet.add(3);
sortedSet.add(1);
sortedSet.add(2); // 内部顺序:1,2,3
// 查找大于等于给定值的最小元素 - O(log n)
Integer ceiling = sortedSet.ceiling(2); // 返回2
// 查找小于等于给定值的最大元素
Integer floor = sortedSet.floor(2); // 返回2
3. 高频工具函数深度剖析
3.1 数组工具类实战技巧
Arrays类提供了丰富的静态方法,其中sort()使用双轴快速排序算法,平均时间复杂度O(n log n):
java复制int[] nums = {3,1,4,2};
// 基本排序
Arrays.sort(nums); // [1,2,3,4]
// 自定义Comparator(Java8+)
Integer[] nums2 = {3,1,4,2};
Arrays.sort(nums2, (a, b) -> b - a); // 降序排列 [4,3,2,1]
// 部分排序
Arrays.sort(nums, 0, 2); // 只排序前两个元素
``
