《Java 编程入门》附录 B 标准库地图

按包梳理 java.base 与常用 JDK 模块:java.lang、java.util、java.io、java.nio.file、java.time、java.net.http、java.util.concurrent、java.util.regex 等各自负责什么、关键类有哪些、什么时候该用,并给出按任务选包的速查表。

怎么用这一页

Java 的标准库很大,java.base 一个模块就有几千个类。这一页不追求完整,只回答三个问题:这个包是干什么的、常用类有哪些、什么时候该想到它。 需要完整 API 时,查官方 Javadoc;需要用法示例时,回到对应章节。

先记住一个事实:java.base 是唯一默认加载的模块,java.lang、java.util、java.io、java.nio.file、java.time、java.net.http、java.util.concurrent 都在里面,不需要 requires。其他模块(如 java.sql、java.logging、jdk.httpserver)在模块化项目里要显式声明,在 classpath 模式下通常由 JDK 提供。

java.lang:语言的地基

java.lang 自动导入,不用 import。

类/接口用途备注
Object所有类的根equals、hashCode、toString、getClass
String不可变字符串字符串常量池、intern()
StringBuilder可变字符串循环拼接优先用它
StringBuffer线程安全版只在确实需要同步时用
Math数学函数abs、max、min、round、pow
System标准输入输出、属性、时间out、err、getenv、currentTimeMillis
Runtime运行时信息version()、availableProcessors()、freeMemory()
Thread线程卷一只用基本 API
Class运行时类信息反射入口
Recordrecord 的父类判断 isRecord()
Enumenum 的父类name()、ordinal()
Throwable异常根getMessage、printStackTrace
Integer 等包装类parseInt、valueOf、MAX_VALUE
ProcessHandle进程信息pid()、info()
Module模块信息getName()、isNamed()

java.util:容器与工具

这是日常使用频率最高的包。

集合接口与实现

接口实现特点典型场景
ListArrayList数组,随机访问 O(1)大多数有序列表
LinkedList链表,头尾操作 O(1)频繁头插/尾插,队列
SetHashSet哈希,无序去重
LinkedHashSet哈希 + 插入顺序去重且保序
TreeSet红黑树,有序需要排序的集合
MapHashMap哈希,无序大多数键值对
LinkedHashMap哈希 + 插入顺序LRU 缓存、保序输出
TreeMap红黑树,按 key 排序范围查询、有序遍历
QueueArrayDeque双端队列栈、队列
PriorityQueue二叉堆优先队列、Top K
DequeArrayDeque双端队列替代 Stack

工具类

类用途
ObjectsrequireNonNull、equals、hash、toString
Arrays数组排序、查找、复制、转列表
Collections集合排序、不可变视图、同步包装
Optional显式表达「可能没有值」
Comparator自定义排序
Random随机数
Scanner简单文本解析(命令行)
StringJoiner拼接字符串
UUID生成唯一标识
BitSet位集合
EnumSet / EnumMap枚举专用集合,性能好
List<Book> books = new ArrayList<>();
books.add(new Book("978-7-111-1", "Java 入门"));

Map<String, Book> byIsbn = books.stream()
    .collect(Collectors.toMap(Book::isbn, b -> b));

Optional<Book> found = Optional.ofNullable(byIsbn.get("978-7-111-1"));

遗留类

Date、Calendar、Vector、Hashtable、Stack 仍然存在,但新代码不应使用。日期用 java.time,并发集合用 java.util.concurrent,栈用 ArrayDeque。

java.util.function:函数式接口

接口签名用途
Function<T,R>R apply(T t)转换
BiFunction<T,U,R>R apply(T t, U u)双参数转换
Supplier<T>T get()提供值
Consumer<T>void accept(T t)消费值
Predicate<T>boolean test(T t)判断
UnaryOperator<T>T apply(T t)一元运算
BinaryOperator<T>T apply(T a, T b)二元运算
Runnablevoid run()无参无返回
Function<String, Integer> length = String::length;
Predicate<Book> available = b -> b.status() == LoanStatus.AVAILABLE;
Supplier<List<Book>> empty = ArrayList::new;

基本类型特化版本(IntFunction、ToIntFunction、IntPredicate 等)可以避免装箱,性能敏感时优先用。

java.util.stream:流式处理

类用途
Stream<T>对象流
IntStream / LongStream / DoubleStream基本类型流,避免装箱
Collectors收集器工厂:toList、groupingBy、counting、joining
StreamSupport从 Spliterator 构造流
Map<String, List<Book>> byAuthor = books.stream()
    .collect(Collectors.groupingBy(Book::author));

String titles = books.stream()
    .map(Book::title)
    .collect(Collectors.joining(",", "《", "》"));

常用终端操作:toList、collect、forEach、count、anyMatch、allMatch、findFirst、reduce、min、max。

java.io:传统 IO

类用途备注
File文件路径遗留,新代码用 Path
InputStream / OutputStream字节流二进制
Reader / Writer字符流文本
BufferedReader / BufferedWriter缓冲按行读写
InputStreamReader / OutputStreamWriter字节转字符指定编码
PrintWriter格式化输出写文本
FileInputStream / FileOutputStream文件字节流配合缓冲
RandomAccessFile随机访问大文件定位读写
Serializable序列化标记接口新项目慎用
try (BufferedReader reader = new BufferedReader(
        new InputStreamReader(new FileInputStream("books.csv"), StandardCharsets.UTF_8))) {
    String line;
    while ((line = reader.readLine()) != null) {
        // ...
    }
}

新代码优先用 java.nio.file,它更完整、错误信息更清楚。

java.nio.file:现代文件 API

类/接口用途
Path路径抽象,替代 File
Files静态工具:读写、复制、移动、遍历
FileSystem文件系统
WatchService监听目录变化
StandardWatchEventKinds事件类型
StandardOpenOption打开选项
Path dir = Path.of("data");
Files.createDirectories(dir);

Path file = dir.resolve("books.csv");
Files.writeString(file, "isbn,title\n", StandardCharsets.UTF_8);

try (Stream<Path> paths = Files.walk(dir)) {
    paths.filter(Files::isRegularFile).forEach(System.out::println);
}

java.nio.charset.StandardCharsets 提供 UTF_8、US_ASCII、ISO_8859_1 等常量。凡是跨进程边界,显式指定编码。

java.time:日期与时间

类表示用途
LocalDate日期借期、生日
LocalTime时间营业时间
LocalDateTime日期 + 时间本地时间戳
InstantUTC 瞬间日志、事件时间
ZonedDateTime带时区跨时区业务
OffsetDateTime带偏移量API 交换
Duration时间量超时、耗时
Period日期量借期天数
ZoneId时区Asia/Shanghai
DateTimeFormatter格式化解析/输出
Clock时钟测试中替换时间
LocalDate today = LocalDate.now();
LocalDate due = today.plusDays(14);
boolean overdue = LocalDate.now().isAfter(due);

DateTimeFormatter fmt = DateTimeFormatter.ISO_LOCAL_DATE;
String text = due.format(fmt);

java.math:大数

类用途
BigInteger任意精度整数
BigDecimal任意精度十进制,金额计算
MathContext精度与舍入上下文
RoundingMode舍入模式
BigDecimal price = new BigDecimal("39.90");
BigDecimal total = price.multiply(new BigDecimal("3"));
BigDecimal rounded = total.setScale(2, RoundingMode.HALF_UP);

金额不要用 double。 0.1 + 0.2 != 0.3 不是 Java 的 bug,是二进制浮点的固有性质。

java.net 与 java.net.http:网络

类用途
URI统一资源标识符
URL统一资源定位符(遗留)
InetAddressIP 地址
Socket / ServerSocketTCP 套接字
HttpClient现代 HTTP 客户端(11+)
HttpRequest / HttpResponse请求/响应
WebSocketWebSocket 客户端
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://example.com/api/books"))
    .header("Accept", "application/json")
    .GET()
    .build();

HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());

HttpClient 支持同步 send 和异步 sendAsync,卷一只用同步版本。

java.util.concurrent:并发

类/接口用途
ExecutorService线程池接口
Executors线程池工厂
ThreadPoolExecutor自定义线程池
Future / CompletableFuture异步结果
CountDownLatch等待多个任务完成
CyclicBarrier多线程汇合
Semaphore限流
ConcurrentHashMap并发 Map
CopyOnWriteArrayList读多写少列表
BlockingQueue生产者-消费者
AtomicInteger 等原子操作
Lock / ReentrantLock显式锁
TimeUnit时间单位
try (ExecutorService pool = Executors.newFixedThreadPool(4)) {
    Future<Integer> future = pool.submit(() -> 1 + 1);
    System.out.println(future.get());
}

卷一只需要知道「有线程池、有 Future、有并发集合」,具体机制在卷三。

java.util.regex:正则

类用途
Pattern编译后的正则
Matcher匹配操作
MatchResult匹配结果
Pattern isbn = Pattern.compile("^97[89]-\\d-\\d{3}-\\d{5}-\\d$");
boolean valid = isbn.matcher("978-7-111-12345-6").matches();

java.lang.reflect:反射

类用途
Class<T>类信息
Method方法
Field字段
Constructor<T>构造器
Modifier修饰符判断
Proxy / InvocationHandler动态代理
Parameter参数元数据
Array反射操作数组
Class<?> type = Book.class;
for (Method method : type.getDeclaredMethods()) {
    System.out.println(method.getName());
}

反射是框架的基础,但性能低于直接调用,且会破坏封装。卷三展开。

java.lang.invoke:方法句柄

类用途
MethodHandle可执行的方法引用
MethodHandles查找工厂
MethodType方法签名
VarHandle变量句柄,替代部分 Unsafe 用法
CallSite调用点

invokedynamic 和 lambda 的底层实现依赖这个包。卷三讲字节码时会遇到。

java.lang.module:模块系统

类用途
ModuleDescriptor模块描述符
ModuleFinder查找模块
ResolvedModule已解析模块
Configuration模块配置

module-info.java 的运行时表示。卷一第 3 章只建立印象,卷三展开 JPMS。

java.lang.management:运行时管理

类用途
ManagementFactory获取各种 MXBean
MemoryMXBean堆/非堆内存
ThreadMXBean线程信息
GarbageCollectorMXBeanGC 统计
RuntimeMXBeanJVM 运行时
OperatingSystemMXBean操作系统
MemoryMXBean memory = ManagementFactory.getMemoryMXBean();
System.out.println(memory.getHeapMemoryUsage());

卷四会用这些接口和 JFR 做运行时观测。

java.lang.annotation:注解

注解用途
@Retention保留到源码/字节码/运行时
@Target可标注的位置
@Documented出现在 Javadoc
@Inherited子类继承
@Repeatable可重复标注
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Audited {
    String value() default "";
}

其他常用模块

模块包用途
java.loggingjava.util.loggingJDK 自带日志
java.sqljava.sqlJDBC
java.xmljavax.xml.*XML 解析
java.desktopjava.awt、javax.swing桌面 GUI
java.managementjavax.managementJMX
java.instrumentjava.lang.instrument字节码增强
java.compilerjavax.tools编译 API
jdk.jfrjdk.jfr飞行记录
jdk.httpservercom.sun.net.httpserver轻量 HTTP 服务
jdk.jcmd命令行工具jcmd、jps
jdk.jconsole命令行工具jconsole

第 18 章会用 jdk.httpserver;卷四会用 jdk.jfr 和 jdk.jcmd。

选包速查

我要做什么用哪个包
存一组对象java.util 集合
可能没有值java.util.Optional
转换/过滤集合java.util.stream
读写文本文件java.nio.file.Files
读写二进制java.io 字节流
日期与借期java.time
金额计算java.math.BigDecimal
发 HTTP 请求java.net.http.HttpClient
起一个轻量 HTTP 服务com.sun.net.httpserver
多线程任务java.util.concurrent
正则校验java.util.regex
反射/框架java.lang.reflect
日志java.util.logging 或 SLF4J
运行时观测java.lang.management、jdk.jfr

一页记忆

  • java.base 默认加载;java.lang 自动导入。
  • 集合先选接口(List/Set/Map),再选实现(ArrayList/HashSet/HashMap)。
  • 文本文件用 Path + Files,显式 UTF-8。
  • 日期用 java.time,金额用 BigDecimal。
  • HTTP 客户端用 HttpClient;轻量服务端用 com.sun.net.httpserver。
  • 并发先用 ExecutorService,不要直接 new Thread。
  • 反射和 MethodHandle 是框架的底层,业务代码少用。
  • 查 API 用官方 Javadoc,查用法回本书对应章节。

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「java」更多文章

  1. 《Netty 高性能网络编程》15.3 linkd-v2 验收与复盘
  2. 《Netty 高性能网络编程》15.2 限流、超时与降级
  3. 《Netty 高性能网络编程》15.1 网关路由与转发