JavaAPI — 日期与集合

介绍

      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。

核心类

  1. LocalDate:仅包含日期(年、月、日),如2023-10-01。
  2. LocalTime:仅包含时间(时、分、秒),如14:30:45。
  3. LocalDateTime:日期与时间的组合,如2023-10-01T14:30:45。
  4. ZonedDateTime:带时区的日期时间,如2023-10-01T14:30:45+08:00[Asia/Shanghai]。
  5. Instant:时间戳(Unix 时间,精确到纳秒)。
  6. Duration:时间间隔(基于时间,如秒、纳秒)。
  7. 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

  1. Date:表示特定时间点,但大部分方法已废弃。
  2. Calendar:用于日期计算,但设计复杂且非线程安全。
  3. SimpleDateFormat:格式化日期,但线程不安全。

Java集合框架

Java集合框架提供高效数据结构,如List、Set、Map等接口及实现类(ArrayList/HashMap)。支持动态存储、泛型、迭代器,含线程安全工具类(Collections),通过统一API简化数据操作与算法实现。

Collection 接口

  • List:有序、可重复。
    • ArrayList:基于数组,查询快,增删慢。
    • LinkedList:基于链表,增删快,查询慢。
    • Vector:线程安全,但性能差(已过时)。
  • Set:无序、唯一。
    • HashSet:基于哈希表,快速查找。
    • LinkedHashSet:维护插入顺序的哈希表。
    • TreeSet:基于红黑树,元素按自然顺序排序。
  • Queue:队列。
    • LinkedList:可用作队列。
    • PriorityQueue:优先级队列。

Map 接口

  1. HashMap:基于哈希表,键唯一,允许 null 键/值。
  2. LinkedHashMap:维护插入顺序。
  3. TreeMap:基于红黑树,键按自然顺序排序。
  4. 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); // 若不存在则初始化

线程安全集合

  1. Collections.synchronizedXXX:包装集合为线程安全。
  2. CopyOnWriteArrayList(写时复制列表)。
  3. ConcurrentHashMap:高并发场景下的高效 Map。

关键区别与选择

  • ArrayList vs LinkedList:
    1. 随机访问多用 ArrayList。
    2. 频繁增删用 LinkedList。
  • HashSet vs TreeSet:
    1. 需要快速查找用HashSet。
    2. 需要排序用TreeSet。
  • HashMap vs TreeMap:
    1. 需要键无序用HashMap。
    2. 需要键排序用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支持函数式操作如过滤与映射,显著简化集合处理逻辑。日期与集合的合理使用需结合场景需求,兼顾性能与代码可维护性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值