2.4使用扩展或其他打包API75
2.5使用Java模块系统.76
第3章字符串相关问题82
3.0引言82
3.1利用子串或词法分析分解字符串86
3.2用Stringuilder合并字符串.91
3.3逐字符处理字符串94
3.4字符串对齐、缩进和取消缩进.96
3.5Unicode字符与字符串之间的转换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程序:TempConverter200
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避免NPE311
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.7JavaMixin:方法混入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章数据科学与R431
11.1使用Java完成机器学习.432
11.2在ApacheSpark中使用数据433
11.3交互式使用R436
11.4比较/选择R实现.439
11.5在Java应用中使用R:Renjin441
11.6从R会话使用Java443
11.7使用FastR(R的GraalVM实现)445
11.8在We应用中使用R446
第12章网络客户端449
12.0引言449
12.1HTTP/RESTWe客户端452
12.2连接socket服务器454
12.3查找和报告网络地址456
12.4处理网络错误458
12.5读写文本数据459
12.6读写二进制或串行化数据462
12.7UDP数据报466
12.8URI,URL还是URN?469
12.9程序:TFTPUDP客户端470
12.10程序:基于Socket的聊天客户端475
12.11程序:简单的HTTP链接检查工具.480
第13章服务器端Java482
13.0引言482
13.1打开服务器Socket483
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直接生成JSON524
14.2用Jackson解析和写JSON526
14.3用org.json解析和写JSON527
14.4用JSON-解析和写JSON530
14.5用JSONPointer查找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从原生代码调用Java666
附录Java前世今生.669
后记681