1. 项目概述
作为一名Java开发者,我经常需要回顾和整理Java基础API的使用方法。这次我想重点梳理Java常用API的第二部分内容,主要涵盖集合框架、日期时间处理和IO操作等核心类库。这些API在日常开发中使用频率极高,但很多细节容易被忽略或混淆。
2. 集合框架深度解析
2.1 List接口及其实现类
ArrayList和LinkedList是List接口最常用的两个实现。ArrayList底层基于数组实现,查询效率高(O(1)),但插入删除效率低(O(n));LinkedList基于双向链表实现,插入删除效率高(O(1)),但查询效率低(O(n))。
java复制// ArrayList初始化示例
List<String> arrayList = new ArrayList<>(10); // 指定初始容量
arrayList.add("Java");
arrayList.add(0, "Python"); // 指定位置插入
注意:ArrayList默认初始容量为10,扩容时新容量=旧容量*1.5。频繁扩容会影响性能,预估数据量时可指定初始容量。
2.2 Map接口及其实现类
HashMap是最常用的Map实现,JDK8后采用数组+链表+红黑树结构。当链表长度超过8时转换为红黑树,提升查询效率。
java复制// HashMap使用示例
Map<String, Integer> map = new HashMap<>();
map.put("Java", 1);
map.computeIfAbsent("Python", k -> 2); // 不存在时计算值
3. 日期时间处理
3.1 Date与Calendar
虽然Date类仍然可用,但建议使用新的java.time包。Calendar类用于日期计算:
java复制Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_MONTH, 7); // 加7天
3.2 Java 8时间API
LocalDate、LocalTime和LocalDateTime是不可变且线程安全的:
java复制LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formatted = now.format(formatter);
4. IO流操作
4.1 字节流与字符流
字节流(InputStream/OutputStream)适合处理二进制数据,字符流(Reader/Writer)适合处理文本:
java复制// 使用try-with-resources自动关闭流
try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
}
4.2 NIO新特性
Java NIO提供了更高效的IO处理方式:
java复制Path path = Paths.get("file.txt");
List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
5. 常见问题与解决方案
-
ConcurrentModificationException异常:
- 原因:遍历集合时修改集合
- 解决:使用Iterator的remove方法或CopyOnWriteArrayList
-
日期格式化线程安全问题:
- SimpleDateFormat不是线程安全的
- 解决:每个线程使用独立实例或使用ThreadLocal
-
资源泄漏问题:
- 流未正确关闭
- 解决:使用try-with-resources语法
6. 性能优化建议
- 集合初始化时指定合理容量
- 频繁插入删除考虑LinkedList
- 大量数据排序使用Arrays.parallelSort
- IO操作使用缓冲流(BufferedInputStream等)
- 考虑使用对象池复用昂贵资源
在实际项目中,我发现很多性能问题都源于对这些基础API的不当使用。比如有一次线上OOM就是因为没有合理设置HashMap初始容量,导致频繁扩容。后来我们制定了编码规范,要求必须预估初始容量。