第1章 基本的编程结构 1
1.1第一个程序 2
1.1.1“Hello,World!”程序解析 2
1.1.2编译与运行Java程序 3
1.1.3方法调用 5
1.1.4JShell 7
1.2基本类型 11
1.2.1有符号整型 11
1.2.2浮点类型 12
1.2.3char型 13
1.2.4布尔型 14
1.3变量 14
1.3.1变量的声明 14
1.3.2名称 14
1.3.3初始化 15
1.3.4常量 15
1.4算术操作 17
1.4.1赋值 18
1.4.2基本运算 18
1.4.3数学方法 20
1.4.4数字类型转换 21
1.4.5关系操作符和逻辑操作符 22
1.4.6大数 24
1.5字符串 24
1.5.1字符串的连接 25
1.5.2子字符串 26
1.5.3字符串比较 26
1.5.4数字与字符串转换 28
1.5.5String类API 29
1.5.6编码点和编码单元 31
1.6输入与输出 33
1.6.1读取输入 33
1.6.2格式化输出 35
1.7控制流 37
1.7.1分支 37
1.7.2循环 39
1.7.3跳出循环与继续循环 41
1.7.4局部变量作用域 43
1.8数组和数组列表 44
1.8.1使用数组 44
1.8.2构造数组 45
1.8.3数组列表 47
1.8.4基本类型包装类 48
1.8.5增强的for循环 48
1.8.6数组与数组列表的复制 49
1.8.7数组算法 50
1.8.8命令行参数 51
1.8.9多维数组 52
1.9功能分解 55
1.9.1静态方法的声明与调用 55
1.9.2数组参数与返回值 55
1.9.3可变参数 56
练习 57
第2章 面向对象编程 61
2.1使用对象 62
2.1.1访问器方法和修改器方法 64
2.1.2对象引用 65
2.2实现类 67
2.2.1实例变量 67
2.2.2方法头 67
2.2.3方法体 68
2.2.4实例方法调用 69
2.2.5this引用 69
2.2.6值调用 70
2.3构造对象 72
2.3.1实现构造函数 72
2.3.2重载 73
2.3.3调用另一个构造函数 74
2.3.4默认初始化 74
2.3.5实例变量的初始化 75
2.3.6final实例变量 76
2.3.7无参构造函数 76
2.4静态变量和方法 77
2.4.1静态变量 77
2.4.2静态常量 78
2.4.3静态初始块 79
2.4.4静态方法 80
2.4.5工厂方法 81
2.5包 82
2.5.1包的声明 82
2.5.2jar命令 83
2.5.3类路径 84
2.5.4包访问权限 86
2.5.5导入类 87
2.5.6静态导入 88
2.6嵌套类 89
2.6.1静态嵌套类 89
2.6.2内部类 91
2.6.3内部类的特殊语法 93
2.7文档注释 95
2.7.1插入注释 95
2.7.2类注释 96
2.7.3方法注释 97
2.7.4变量注释 97
2.7.5通用注释 98
2.7.6链接 98
2.7.7包、模块和概述注释 99
2.7.8注释的提取 99
练习 100
第3章 接口和lambda表达式 105
3.1接口 106
3.1.1声明接口 106
3.1.2实现接口 107
3.1.3转换为接口类型 109
3.1.4强制类型转换和instanceof操作符 109
3.1.5继承接口 110
3.1.6实现多个接口 111
3.1.7常量 111
3.2静态方法、默认方法和私有方法 112
3.2.1静态方法 112
3.2.2默认方法 112
3.2.3解决默认方法冲突的问题 113
3.2.4私有方法 115
3.3接口示例 115
3.3.1Comparable接口 115
3.3.2Comparator接口 117
3.3.3Runnable接口 118
3.3.4UI回调 119
3.4lambda表达式 120
3.4.1lambda表达式语法 121
3.4.2函数式接口 122
3.5方法引用和构造函数引用 123
3.5.1方法引用 123
3.5.2构造函数引用 125
3.6使用lambda表达式 126
3.6.1实现延迟执行 126
3.6.2选择函数式接口 127
3.6.3实现自己的函数式接口 129
3.7lambda表达式和变量作用域 130
3.7.1lambda表达式的作用域 130
3.7.2访问来自闭合作用域的变量 131
3.8高阶函数 133
3.8.1返回函数的方法 134
3.8.2修改函数的方法 134
3.8.3Comparator方法 135
3.9局部类和匿名类 136
3.9.1局部类 136
3.9.2匿名类 137
练习 138
第4章 继承与反射 143
4.1继承一个类 144
4.1.1父类与子类 144
4.1.2定义和继承子类方法 145
4.1.3方法覆盖 145
4.1.4子类的构造 147
4.1.5父类赋值 147
4.1.6转换 148
4.1.7final方法和类 149
4.1.8抽象方法和类 149
4.1.9受保护访问 150
4.1.10匿名子类 151
4.1.11继承和默认方法 152
4.1.12带super的方法表达式 153
4.2Object:终极父类 153
4.2.1toString方法 154
4.2.2equals方法 156
4.2.3hashCode方法 159
4.2.4克隆对象 160
4.3枚举 163
4.3.1枚举方法 164
4.3.2构造函数、方法和域 165
4.3.3实例的实现体 165
4.3.4静态成员 166
4.3.5switch枚举对象 167
4.4运行时类型信息和资源 168
4.4.1Class类 168
4.4.2资源加载 172
4.4.3类加载器 172
4.4.4上下文类加载器 174
4.4.5服务加载器 176
4.5反射 178
4.5.1枚举类成员 178
4.5.2对象检查 179
4.5.3方法调用 180
4.5.4对象构造 181
4.5.5JavaBeans 182
4.5.6使用数组 183
4.5.7代理 185
练习 187
第5章 异常、断言和日志处理 191
5.1异常处理 192
5.1.1异常抛出 192
5.1.2异常继承层次 193
5.1.3已检查异常的声明 195
5.1.4异常捕获 196
5.1.5try-with-resources语句 197
5.1.6finally子句 199
5.1.7异常重抛和链接 200
5.1.8未捕获的异常和堆栈踪迹 202
5.1.9Objects.requireNonNull方法 203
5.2断言 204
5.2.1使用断言 205
5.2.2启用和禁用断言 205
5.3记录日志 206
5.3.1采用日志记录器 206
5.3.2日志记录器 207
5.3.3日志级别 207
5.3.4其他日志记录方法 208
5.3.5日志记录的配置项 210
5.3.6日志处理器 211
5.3.7过滤器和格式化器 214
练习 215
第6章 泛型编程 219
6.1泛型类 220
6.2泛型方法 221
6.3类型限定 222
6.4类型变异和通配符 223
6.4.1子类型通配符 224
6.4.2父类型通配符 225
6.4.3带类型变量的通配符 226
6.4.4无限定通配符 228
6.4.5通配符捕获 228
6.5Java虚拟机中的泛型 229
6.5.1类型擦除 229
6.5.2转换插入 230
6.5.3桥方法 230
6.6泛型约束 232
6.6.1无基本类型参数 232
6.6.2所有类型在运行时都是原始的 233
6.6.3不能实例化类型变量 234
6.6.4不能构造参数化类型的数组 236
6.6.5静态上下文中的类类型变量不是有效的 237
6.6.6类型擦除后的方法可能不冲突 238
6.6.7异常与泛型 239
6.7反射与泛型 240
6.7.1Class〈T〉类 240
6.7.2虚拟机中的泛型类型信息 242
练习 243
第7章 集合 249
7.1集合框架概要 249
7.2迭代器 254
7.3set 256
7.4map 257
7.5其他集合 261
7.5.1Properties 261
7.5.2位组 262
7.5.3枚举set和枚举map 264
7.5.4栈、队列、双端队列、优先级队列 264
7.5.5弱哈希映射表 266
7.6视图 266
7.6.1小集合 267
7.6.2范围 268
7.6.3不可修改的视图 268
练习 269
第8章 Stream 273
8.1从迭代到Stream操作 274
8.2创建Stream 275
8.3filter、map和flatMap方法 277
8.4提取子流和组合流 279
8.5其他流转换 280
8.6简单归约 281
8.7Optional类型 282
8.7.1如何使用Optional类型值 282
8.7.2如何不使用Optional类型值 284
8.7.3创建Optional类型值 284
8.7.4使用flatMap来组合可选值函数 285
8.7.5将Optional转变为流 286
8.8收集结果 287
8.9将结果收集到map中 289
8.10分组和分片 290
8.11下游收集器 291
8.12归约操作 294
8.13基本类型流 296
8.14并行流 297
练习 300
第9章 输入与输出处理 305
9.1输入/输出流、Reader和Writer 306
9.1.1获取流对象 306
9.1.2读取字节 307
9.1.3写字节 308
9.1.4字符编码 308
9.1.5文本输入 311
9.1.6文本输出 313
9.1.7读/写二进制数据 314
9.1.8随机存取文件 315
9.1.9内存映射文件 315
9.1.10文件锁 316
9.2路径、文件和目录 317
9.2.1路径 317
9.2.2创建文件和目录 319
9.2.3复制、移动和删除文件 320
9.2.4访问目录内容 321
9.2.5ZIP文件系统 324
9.3HTTP连接 325
9.3.1URLConnection类和HttpURLConnection类 326
9.3.2HTTP Client API 327
9.4正则表达式 330
9.4.1正则表达式概述 330
9.4.2找到一个匹配 334
9.4.3找到所有匹配 335
9.4.4分组 336
9.4.5以分隔符号分割 337
9.4.6替换匹配结果 338
9.4.7标记 339
9.5序列化 339
9.5.1Serializable接口 340
9.5.2瞬态实例变量 342
9.5.3readObject和writeobject方法 342
9.5.4readResolve和writeReplace方法 343
9.5.5版本化 345
练习 346
第10章 并发编程 351
10.1并发任务 352
10.1.1运行任务 352
10.1.2Future 354
10.2异步计算 357
10.2.1可完成的Future 357
10.2.2组合可完成的Future 359
10.2.3UI回调中的长时间运行任务 362
10.3线程安全 364
10.3.1可见性 364
10.3.2竞争条件 366
10.3.3安全并发的策略 369
10.3.4不可变类 369
10.4并行算法 370
10.4.1并行流 370
10.4.2并行数组操作 371
10.5线程安全的数据结构 372
10.5.1ConcurrentHashMap 373
10.5.2阻塞队列 374
10.5.3其他线程安全的数据结构 375
10.6原子计数器和累加器 376
10.7锁和条件 379
10.7.1锁 379
10.7.2synchronized关键字 380
10.7.3条件等待 382
10.8线程 385
10.8.1启动线程 385
10.8.2线程中断 386
10.8.3线程变量 388
10.8.4线程的其他属性 388
10.9进程 389
10.9.1构建进程 389
10.9.2运行进程 391
10.9.3ProcessHandle 392
练习 393
第11章 注解 401
11.1使用注解 402
11.1.1注解元素 402
11.1.2多注解和重复注解 403
11.1.3注解声明 404
11.1.4注解类型用途 405
11.1.5明确接收者 406
11.2定义注解 408
11.3标准注解 410
11.3.1编译相关的注解 411
11.3.2资源管理相关的注解 412
11.3.3元注解 412
11.4运行时注解处理 414
11.5源码级注解处理 418
11.5.1注解处理器 418
11.5.2语言模型API 419
11.5.3使用注解生成源码 419
练习 423
第12章 日期和时间API 427
12.1时间线 428
12.2本地日期 430
12.3日期调整器 433
12.4本地时间 435
12.5时区时间 436
12.6格式化和解析 439
12.7应对遗留代码 442
练习 443
第13章 国际化 447
13.1本地化 448
13.1.1指定本地化 448
13.1.2默认的locale 451
13.1.3显示名称 452
13.2数字格式化 453
13.3货币符号 454
13.4日期和时间格式化 455
13.5排序和规范化 457
13.6消息格式化 459
13.7资源束 461
13.7.1组织资源束 462
13.7.2资源束类 464
13.8字符编码 465
13.9首选项 466
练习 468
第14章 编译与脚本 471
14.1编译器API 471
14.1.1调用编译器 472
14.1.2启动编译任务 472
14.1.3从内存读取源文件 473
14.1.4向内存写入字节码 474
14.1.5捕获诊断信息 476
14.2脚本API 476
14.2.1获取脚本引擎 476
14.2.2绑定 477
14.2.3重定向输入与输出 478
14.2.4调用脚本函数和方法 479
14.2.5编译脚本 480
14.3Nashom脚本引擎 481
14.3.1从命令行运行Nashom 481
14.3.2调用getter、setter和重载方法 482
14.3.3构造Java对象 483
14.3.4JavaScript和Java中的字符串 485
14.3.5数字 485
14.3.6使用数组 486
14.3.7列表与映射 487
14.3.8lambda表达式 488
14.3.9继承Java类与实现Java接口 489
14.3.10异常 491
14.4shell脚本与Nashorn 491
14.4.1执行shell命令 492
14.4.2字符串插值 492
14.4.3脚本输入 493
练习 494
第15章 Java平台模块系统 499
15.1模块的概念 500
15.2模块命名 501
15.3模块化“Hello,World!”程序 502
15.4引入模块 504
15.5导出包 506
15.6模块化和反射访问 510
15.7模块化的JAR 513
15.8自动模块和未命名模块 515
15.9用于迁移的命令行标识 516
15.10传递和静态引入 518
15.11限定导入和打开 520
15.12服务加载 521
15.13模块化用的工具 522
练习 525