介绍
Java API 提供了强大的日期时间管理与集合框架支持。在日期处理上,java.time包(Java 8+)彻底革新了旧版Date和Calendar的缺陷,引入了线程安全的LocalDate(日期)、LocalTime(时间)、LocalDateTime(日期时间)等不可变类,支持链式操作与精准时间计算。通过DateTimeFormatter可实现灵活格式化,ZonedDateTime则处理时区问题,显著提升了开发效率和代码可维护性。
集合框架位于java.util包,核心接口包括List(有序可重复,如ArrayList、LinkedList)、Set(唯一性,如HashSet、TreeSet)、Queue(队列)及Map(键值对,如HashMap、LinkedHashMap)。集合类通过泛型保证类型安全,支持迭代器遍历,并借助Collections工具类实现排序、同步等操作。Java 8引入的`Stream API`进一步简化集合数据处理,支持函数式编程的过滤、映射与归约。两者共同构建了Java高效处理时间逻辑与数据结构的基石。
Java日期与时间 API
Java API日期处理分为旧版(java.util.Date/Calendar,存在设计缺陷)和Java 8+新版(java.time包),提供LocalDate、LocalTime、ZonedDateTime等不可变类,支持时区、格式化和计算,API更清晰、线程安全,推荐使用新日期时间API。
核心类
- LocalDate:仅包含日期(年、月、日),如2023-10-01。
- LocalTime:仅包含时间(时、分、秒),如14:30:45。
- LocalDateTime:日期与时间的组合,如2023-10-01T14:30:45。
- ZonedDateTime:带时区的日期时间,如2023-10-01T14:30:45+08:00[Asia/Shanghai]。
- Instant:时间戳(Unix 时间,精确到纳秒)。
- Duration:时间间隔(基于时间,如秒、纳秒)。
- Period:日期间隔(基于日期,如年、月、日)。
基本操作
// 创建日期
LocalDate today = LocalDate.now();
LocalDate specificDate = LocalDate.of(2023, Month.OCTOBER, 1);
// 时间计算
LocalDate nextWeek = today.plusWeeks(1);
LocalDateTime threeHoursLater = LocalDateTime.now().plusHours(3);
// 格式化与解析
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String formattedDate = today.format(formatter);
LocalDate parsedDate = LocalDate.parse("2023-10-01", formatter);
// 时区处理
ZonedDateTime shanghaiTime = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));
旧版 API
- Date:表示特定时间点,但大部分方法已废弃。
- Calendar:用于日期计算,但设计复杂且非线程安全。
- SimpleDateFormat:格式化日期,但线程不安全。
Java集合框架
Java集合框架提供高效数据结构,如List、Set、Map等接口及实现类(ArrayList/HashMap)。支持动态存储、泛型、迭代器,含线程安全工具类(Collections),通过统一API简化数据操作与算法实现。
Collection 接口
- List:有序、可重复。
- ArrayList:基于数组,查询快,增删慢。
- LinkedList:基于链表,增删快,查询慢。
- Vector:线程安全,但性能差(已过时)。
- Set:无序、唯一。
- HashSet:基于哈希表,快速查找。
- LinkedHashSet:维护插入顺序的哈希表。
- TreeSet:基于红黑树,元素按自然顺序排序。
- Queue:队列。
- LinkedList:可用作队列。
- PriorityQueue:优先级队列。
Map 接口
- HashMap:基于哈希表,键唯一,允许 null 键/值。
- LinkedHashMap:维护插入顺序。
- TreeMap:基于红黑树,键按自然顺序排序。
- Hashtable:线程安全但过时,推荐用ConcurrentHashMap。
常用操作
// List 示例
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.remove(0); // 删除索引为0的元素
// Set 示例
Set<Integer> set = new HashSet<>();
set.add(1);
set.add(2);
set.add(1); // 重复元素不会添加
// Map 示例
Map<String, Integer> map = new HashMap<>();
map.put("Apple", 10);
map.put("Banana", 5);
int count = map.get("Apple"); // 获取值
// 遍历 Map
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
Java 8+ 增强
Stream API:对集合进行函数式操作(过滤、映射、归约)。
List<String> filteredList = list.stream()
.filter(s -> s.startsWith("J"))
.collect(Collectors.toList());
forEach方法:
list.forEach(System.out::println);
computeIfAbsent(Map):
map.computeIfAbsent("Orange", k -> 0); // 若不存在则初始化
线程安全集合
- Collections.synchronizedXXX:包装集合为线程安全。
- CopyOnWriteArrayList(写时复制列表)。
- ConcurrentHashMap:高并发场景下的高效 Map。
关键区别与选择
- ArrayList vs LinkedList:
- 随机访问多用 ArrayList。
- 频繁增删用 LinkedList。
- HashSet vs TreeSet:
- 需要快速查找用HashSet。
- 需要排序用TreeSet。
- HashMap vs TreeMap:
- 需要键无序用HashMap。
- 需要键排序用TreeMap。
总结
Java API中的日期与集合是开发中的核心组件。日期处理在Java 8后通过java.time包得到显著优化,提供了LocalDate、LocalTime和LocalDateTime等不可变类,支持明确的时间操作与时区管理(如ZonedDateTime)。相比旧版Date和Calendar的线程安全问题,新API设计更清晰,且通过DateTimeFormatter实现灵活格式化。时间计算可通过plusDays()或minusMonths()等方法完成,Period和Duration分别处理日期差与时间差。
集合框架以Collection和Map接口为核心,List实现类如ArrayList基于动态数组实现快速随机访问,LinkedList适合频繁增删场景。Set接口下HashSet依赖哈希表保证元素唯一性,TreeSet通过红黑树实现有序存储。Map中HashMap以键值对存储且查询高效,LinkedHashMap保留插入顺序。线程安全场景推荐ConcurrentHashMap替代遗留的Hashtable。集合遍历可通过Iterator或增强for循环,Java 8引入的Stream API支持函数式操作如过滤与映射,显著简化集合处理逻辑。日期与集合的合理使用需结合场景需求,兼顾性能与代码可维护性。