目录
前言 .1
第1 章 入门:编译和运行Java .19
1.0 引言 19
1.1 编译和运行Java:标准JDK . 20
1.2 编译和运行Java:GraalVM 提高性能 . 22
1.3 用IDE 编译、运行和测试 24
1.4 用JShell 探索Java . 29
1.5 有效地使用CLASSPATH 32
1.6 下载和使用代码示例 . 34
1.7 用Apache Maven 自动管理依赖、编译、测试和部署 . 42
1.8 用Gradle 自动管理依赖、编译、测试和部署 48
1.9 处理废弃警告 50
1.10 利用单元测试维护代码正确性:JUnit 52
1.11 利用持续集成维护代码 56
1.12 获取可读的栈轨迹 61
1.13 查找更多Java 源代码 . 61
1.14 查找可运行的Java 库 . 62
第2 章 环境交互 66
2.0 引言 66
2.1 获得环境变量 66
2.2 从系统属性获得信息 . 68
2.3 处理依赖于Java 版本或操作系统的代码 70
2.4 使用扩展或其他打包API 75
2.5 使用Java 模块系统 . 76
第3 章 字符串相关问题 82
3.0 引言 82
3.1 利用子串或词法分析分解字符串 86
3.2 用Stringuilder 合并字符串 . 91
3.3 逐字符处理字符串 94
3.4 字符串对齐、缩进和取消缩进 . 96
3.5 Unicode 字符与字符串之间的转换 100
3.6 按单词或字符逆转字符串 . 103
3.7 展开和压缩制表符 104
3.8 控制大小写 109
3.9 输入非打印字符 111
3.10 删除字符串末尾的空白符 112
3.11 使用国际化资源创建消息 115
3.12 使用特定的本地化环境 118
3.13 创建资源包 120
3.14 程序:一个简单的文本格式化工具 121
3.15 程序:Soundex 名字比较 123
第4 章 使用正则表达式实现模式匹配 127
4.0 引言 . 127
4.1 正则表达式语法 . 130
4.2 在Java 中使用正则表达式:测试模式 137
4.3 查找匹配文本 . 141
4.4 替换匹配文本 . 144
4.5 打印一个模式的所有匹配 . 148
4.6 打印包含一个模式的行 . 151
4.7 用正则表达式控制大小写 . 152
4.8 匹配重音或组合字符 154
4.9 匹配文本中的换行符 155
4.10 程序: Apache 日志文件解析 157
4.11 程序: 完整的Grep . 159
第5 章 数字 166
5.0 引言 . 166
5.1 检查字符串是否是一个合法的数 . 169
5.2 数字与对象的转换 170
5.3 直接使用分数而不使用浮点数 172
5.4 处理浮点数 173
5.5 格式化数字 179
5.6 二进制、八进制、十进制和十六进制间的转换 183
5.7 处理整数序列 . 184
5.8 格式化为正确的复数形式 . 186
5.9 生成随机数 189
5.10 矩阵乘法 . 192
5.11 使用复数 . 194
5.12 处理非常大的数 197
5.13 程序:TempConverter 200
5.14 程序:数字回文 202
第6 章 日期和时间 207
6.0 引言 . 207
6.1 获得当天日期 . 210
6.2 格式化日期和时间 212
6.3 日期/ 时间、YMDHMS 和纪元秒之间的转换 214
6.4 将字符串解析为日期 216
6.5 两个日期之差 . 217
6.6 日期加上或减去一个时间段 219
6.7 处理重复事件 . 220
6.8 计算涉及时区的日期 223
6.9 与遗留Date 和Calendar 类交互 225
第7 章 Java 数据结构. 227
7.0 引言 . 227
7.1 用数组建立数据结构 228
7.2 调整数组大小 . 230
7.3 集合框架 231
7.4 与数组类似,但更动态 . 233
7.5 自己的类中使用泛型类型 . 237
7.6 所有迭代方法 . 241
7.7 用Set 避免重复 . 245
7.8 用链表建立数据结构 246
7.9 用Hashtale 和HashMap 建立映射. 252
7.10 在Properties 和Preferences 中存储字符串 255
7.11 集合排序 . 260
7.12 避免显式排序 265
7.13 在集合中查找对象 . 267
7.14 将一个Collection 转换为数组 . 270
7.15 使数据可迭代 271
7.16 使用对象栈 274
7.17 多维结构 . 278
7.18 用Lomok 或Record 简化数据对象 280
7.19 程序: 计时比较 283
第8 章 面向对象技术 286
8.0 引言 . 286
8.1 对象方法:用toString() 格式化对象,用equals 比较对象 . 289
8.2 使用内部类 298
8.3 通过接口提供回调 300
8.4 多态/ 抽象方法 . 305
8.5 使用类型安全的枚举 307
8.6 用Optional 避免NPE 311
8.7 保证单例模式 . 314
8.8 创建自己的异常 316
8.9 使用依赖注入 . 318
8.10 程序:绘图仪 322
第9 章 函数式编程技术:函数接口、流和并行集合 326
9.0 引言 . 326
9.1 使用Lamda/Closures 而不是内部类 . 330
9.2 使用lamda 预定义接口而不是自定义接口 334
9.3 用Stream 简化处理 . 337
9.4 用Collector 简化流 339
9.5 用并行流和集合提高吞吐量 342
9.6 利用方法引用将已有代码用作为函数式接口 344
9.7 Java Mixin:方法混入 349
第10 章 输入和输出:读、写和目录技巧 351
10.0 引言 351
10.1 关于InputStream/OutputStream 和Reader/Writer . 353
10.2 读文本文件 355
10.3 从标准输入或控制台/ 控制终端读取 358
10.4 用Formatter 和printf 打印 362
10.5 用StreamTokenizer 扫描输入 366
10.6 用Scanner 类扫描输入 371
10.7 扫描有语法结构的输入 375
10.8 复制文件 . 380
10.9 重新分配标准流 382
10.10 写时复制流,重新分配标准流 . 383
10.11 读/ 写不同的字符集 386
10.12 讨厌的行尾字符 388
10.13 当心依赖平台的文件代码 389
10.14 读/ 写二进制数据 390
10.15 读写JAR 或ZIP 归档 391
10.16 使用getResource() 和getResourceAsStream()
采用文件系统中立方式查找文件 395
10.17 获取文件信息:Files 和Path . 397
10.18 创建新文件或目录 406
10.19 改变文件名或其他属性 408
10.20 删除文件 410
10.21 创建瞬时/ 临时文件 413
10.22 列出目录内容 416
10.23 获得目录的根 417
10.24 使用FileWatcher 服务得到文件变更通知 418
10.25 程序:将用户数据保存到磁盘 . 421
10.26 程序:查找—遍历文件树 425
第11 章 数据科学与R 431
11.1 使用Java 完成机器学习 . 432
11.2 在Apache Spark 中使用数据 433
11.3 交互式使用R 436
11.4 比较/ 选择R 实现 . 439
11.5 在Java 应用中使用R:Renjin 441
11.6 从R 会话使用Java 443
11.7 使用FastR(R 的GraalVM 实现) 445
11.8 在We 应用中使用R 446
第12 章 网络客户端 449
12.0 引言 449
12.1 HTTP/REST We 客户端 452
12.2 连接socket 服务器 454
12.3 查找和报告网络地址 456
12.4 处理网络错误 458
12.5 读写文本数据 459
12.6 读写二进制或串行化数据 462
12.7 UDP 数据报 466
12.8 URI, URL 还是URN? 469
12.9 程序: TFTP UDP 客户端 470
12.10 程序: 基于Socket 的聊天客户端 475
12.11 程序: 简单的HTTP 链接检查工具 . 480
第13 章 服务器端Java 482
13.0 引言 482
13.1 打开服务器Socket 483
13.2 查找网络接口 486
13.3 返回响应(字符串或二进制数据) 487
13.4 通过网络连接返回对象信息 . 491
13.5 处理多个客户端 493
13.6 提供HTTP 协议 498
13.7 用SSL 和JSSE 保护We 服务器 501
13.8 用JAX-RS 创建REST 服务 504
13.9 网络日志 . 507
13.10 创建SLF4J . 509
13.11 使用Log4j 生成网络日志 511
13.12 用java.util.logging 生成网络日志 517
第14 章 处理JSON 数据 522
14.0 引言 522
14.1 直接生成JSON 524
14.2 用Jackson 解析和写JSON 526
14.3 用org.json 解析和写JSON 527
14.4 用JSON- 解析和写JSON 530
14.5 用JSON Pointer 查找JSON 元素 . 531
第15 章 包和打包 . 535
15.0 引言 535
15.1 创建包 . 536
15.2 用Javadoc 建立类文档 538
15.3 超越Javadoc: 注解/ 元数据 . 542
15.4 准备一个类作为Javaean . 544
15.5 用JAR 归档 549
15.6 从一个JAR 运行程序 550
15.7 将We 层组件打包到WAR 文件 553
15.8 用jlink 创建更小的发布包 554
15.9 使用JPMS 创建模块. 556
第16 章 Java 线程 560
16.0 引言 560
16.1 在不同线程中运行代码 562
16.2 用动画显示动图 567
16.3 停止线程 . 573
16.4 交会和超时 576
16.5 用synchronized 关键字同步线程 577
16.6 用锁简化同步 585
16.7 用Queue 接口简化生产者/ 消费者 589
16.8 用Fork/Join 优化并行处理 592
16.9 调度任务:将来,编辑器的后台保存 . 596
第17 章 反射或“名为Class 的类” 601
17.0 引言 601
17.1 获得类描述符 602
17.2 查找和使用方法和字段 603
17.3 通过反射访问私有方法和字段 608
17.4 动态加载和实例化一个类 609
17.5 用ClassLoader 从头构造一个类 . 612
17.6 用JavaCompiler 从头构造一个类 614
17.7 性能计时 . 617
17.8 打印类信息 622
17.9 列出一个包中的类 . 624
17.10 使用和定义注解 627
17.11 通过注解查找类似插件的类 633
17.12 程序: CrossRef . 636
第18 章 结合使用Java 和其他语言 641
18.0 引言 641
18.1 从Java 运行外部程序 642
18.2 运行程序并捕获输出 647
18.3 通过javax.script 调用其他语言 651
18.4 用GraalVM 混合语言 654
18.5 结合Java 和Perl . 655
18.6 通过原生代码调用其他语言 . 659
18.7 从原生代码调用Java 666
附录 Java 前世今生 . 669
后记 681