# Java 速查

以下示例基于 JDK 17 及以上版本。

## 集合

列表有序可重复，集合去重，映射存键值。工厂方法创建的是不可变集合，需要增删时要再包一层可变实现；遍历时删除元素请用迭代器的删除方法，别用普通循环边遍历边删。

```java
List<String> a = new ArrayList<>();
```

## Stream API

中间操作惰性求值，遇到终止操作才真正执行；过滤、映射、收集是最常用组合，别在流里修改外部变量。大数据量可换并行流，但要留意共享状态的线程安全问题。

```java
long c = a.stream().count();
```

## Optional

显式表达可能为空的返回值，用映射、过滤、兜底值链式处理，替代层层判空，能明显减少空指针异常。别把它当字段或参数到处传，更适合作为方法返回值的边界约定。

```java
Optional.of(1).orElse(0);
```

## 记录类

record 一行声明不可变数据载体，自带构造器、访问器、相等判断与字符串表示；访问字段用同名方法，不是传统的 getter。字段默认不可变，省掉大量样板代码。

```java
record Point(int x, int y) { }
```

## 异常

受检异常必须声明或捕获；带资源的 try 会自动关闭实现自动关闭接口的资源，比手写 finally 更不容易漏掉。捕获后别只打印堆栈就了事，要么处理，要么包装后继续抛出。

```java
throw new IOException("x");
```

## 常用并发工具

线程池用执行器服务管理，可完成的 Future 编排异步任务，并发哈希映射的合并方法是线程安全的计数写法。用完记得关闭线程池，否则进程会迟迟不退出。

```java
pool.shutdown();
```
