第Ⅰ部分 Java语言 3
第1章 Java的历史和演变 3
1.1 Java的家世 3
1.1.1 现代编程语言的诞生:C语言 3
1.1.2 C++:下一个阶段 4
1.1.3 Java出现的时机已经成熟 4
1.2 Java的诞生 5
1.3 Java改变Internet的方式 6
1.3.1 Java applet 6
1.3.2 安全性 6
1.3.3 可移植性 6
1.4 Java的魔力:字节码 7
1.5 不再推荐使用applet 7
1.6 servlet:服务器端的Java 8
1.7 Java的关键特性 8
1.7.1 简单性 8
1.7.2 面向对象 8
1.7.3 健壮性 8
1.7.4 多线程 9
1.7.5 体系结构中立 9
1.7.6 解释执行和高性能 9
1.7.7 分布式 9
1.7.8 动态性 9
1.8 Java的演变历程 9
1.9 Java SE 9 11
1.10 文化革新 12
第2章 Java综述 13
2.1 面向对象编程 13
2.1.1 两种范式 13
2.1.2 抽象 13
2.1.3 OOP三原则 14
2.2 第一个简单程序 16
2.2.1 输入程序 17
2.2.2 编译程序 17
2.2.3 深入分析第一个示例程序 17
2.3 第二个简短程序 19
2.4 两种控制语句 20
2.4.1 if语句 20
2.4.2 for循环 21
2.5 使用代码块 22
2.6 词汇问题 23
2.6.1 空白符 23
2.6.2 标识符 23
2.6.3 字面值 23
2.6.4 注释 23
2.6.5 分隔符 23
2.6.6 Java关键字 24
2.7 Java类库 24
第3章 数据类型、变量和数组 25
3.1 Java是强类型化的语言 25
3.2 基本类型 25
3.3 整型 25
3.3.1 byte 26
3.3.2 short 26
3.3.3 int 26
3.3.4 long 26
3.4 浮点型 27
3.4.1 float 27
3.4.2 double 27
3.5 字符型 27
3.6 布尔型 29
3.7 深入分析字面值 29
3.7.1 整型字面值 29
3.7.2 浮点型字面值 30
3.7.3 布尔型字面值 30
3.7.4 字符型字面值 31
3.7.5 字符串字面值 31
3.8 变量 31
3.8.1 变量的声明 31
3.8.2 动态初始化 32
3.8.3 变量的作用域和生存期 32
3.9 类型转换和强制类型转换 34
3.9.1 Java的自动类型转换 34
3.9.2 强制转换不兼容的类型 34
3.10 表达式中的自动类型提升 35
3.11 数组 36
3.11.1 一维数组 36
3.11.2 多维数组 38
3.11.3 另一种数组声明语法 41
3.12 关于字符串的一些说明 41
第4章 运算符 43
4.1 算术运算符 43
4.1.1 基本算术运算符 43
4.1.2 求模运算符 44
4.1.3 算术与赋值复合运算符 44
4.1.4 自增与自减运算符 45
4.2 位运算符 46
4.2.1 位逻辑运算符 47
4.2.2 左移 49
4.2.3 右移 50
4.2.4 无符号右移 51
4.2.5 位运算符与赋值的组合 52
4.3 关系运算符 52
4.4 布尔逻辑运算符 53
4.5 赋值运算符 54
4.6 “?”运算符 55
4.7 运算符的优先级 55
4.8 使用圆括号 56
第5章 控制语句 57
5.1 Java的选择语句 57
5.1.1 if语句 57
5.1.2 switch语句 59
5.2 迭代语句 62
5.2.1 while语句 63
5.2.2 do-while语句 64
5.2.3 for语句 66
5.2.4 for循环的for-each版本 68
5.2.5 嵌套的循环 72
5.3 跳转语句 72
5.3.1 使用break语句 72
5.3.2 使用continue语句 75
5.3.3 return语句 76
第6章 类 77
6.1 类的基础知识 77
6.1.1 类的一般形式 77
6.1.2 一个简单的类 78
6.2 声明对象 79
6.3 为对象引用变量赋值 80
6.4 方法 81
6.4.1 为Box类添加方法 81
6.4.2 返回值 83
6.4.3 添加带参数的方法 84
6.5 构造函数 85
6.6 this关键字 87
6.7 垃圾回收 88
6.8 堆栈类 88
第7章 方法和类的深入分析 91
7.1 重载方法 91
7.2 将对象用作参数 94
7.3 实参传递的深入分析 96
7.4 返回对象 97
7.5 递归 98
7.6 访问控制 100
7.7 理解static 102
7.8 final介绍 104
7.9 重新审视数组 104
7.10 嵌套类和内部类 105
7.11 String类介绍 107
7.12 使用命令行参数 109
7.13 varargs:可变长度实参 110
7.13.1 重载varargs方法 112
7.13.2 varargs方法与模糊性 113
第8章 继承 115
8.1 继承的基础知识 115
8.1.1 成员访问与继承 116
8.1.2 一个更实际的例子 117
8.1.3 超类变量可以引用子类对象 118
8.2 使用super关键字 119
8.2.1 使用super调用超类的构造函数 119
8.2.2 super的另一种用法 122
8.3 创建多级继承层次 123
8.4 构造函数的执行时机 125
8.5 方法重写 126
8.6 动态方法调度 128
8.6.1 重写方法的目的 129
8.6.2 应用方法重写 129
8.7 使用抽象类 130
8.8 在继承中使用final关键字 132
8.8.1 使用final关键字阻止重写 132
8.8.2 使用final关键字阻止继承 133
8.9 Object类 133
第9章 包和接口 135
9.1 包 135
9.1.1 定义包 135
9.1.2 包查找与CLASSPATH 136
9.1.3 一个简短的包示例 136
9.2 包和成员访问 137
9.3 导入包 140
9.4 接口 141
9.4.1 定义接口 141
9.4.2 实现接口 142
9.4.3 嵌套接口 144
9.4.4 应用接口 144
9.4.5 接口中的变量 147
9.4.6 接口可以扩展 148
9.5 默认接口方法 149
9.5.1 默认方法的基础知识 149
9.5.2 一个更加实用的例子 151
9.5.3 多级继承的问题 151
9.6 在接口中使用静态方法 152
9.7 私有接口方法 152
9.8 关于包和接口的最后说明 153
第10章 异常处理 155
10.1 异常处理的基础知识 155
10.2 异常类型 155
10.3 未捕获的异常 156
10.4 使用try和catch 157
10.5 多条catch子句 158
10.6 嵌套的try语句 159
10.7 throw 161
10.8 throws 162
10.9 finally 162
10.10 Java的内置异常 164
10.11 创建自己的异常子类 165
10.12 链式异常 166
10.13 其他三个异常特性 167
10.14 使用异常 168
第11章 多线程编程 169
11.1 Java线程模型 169
11.1.1 线程优先级 170
11.1.2 同步 170
11.1.3 消息传递 171
11.1.4 Thread类和Runnable接口 171
11.2 主线程 171
11.3 创建线程 172
11.3.1 实现Runnable接口 172
11.3.2 扩展Thread类 174
11.3.3 选择一种创建方式 175
11.4 创建多个线程 175
11.5 使用isAlive()和join()方法 176
11.6 线程优先级 178
11.7 同步 179
11.7.1 使用同步方法 179
11.7.2 synchronized语句 180
11.8 线程间通信 182
11.9 挂起、恢复与停止线程 187
11.10 获取线程的状态 189
11.11 使用工厂方法创建和启动线程 189
11.12 使用多线程 190
第12章 枚举、自动装箱与注解 191
12.1 枚举 191
12.1.1 枚举的基础知识 191
12.1.2 values()和valueOf()方法 193
12.1.3 Java枚举是类类型 194
12.1.4 枚举继承自Enum类 195
12.1.5 另一个枚举示例 196
12.2 类型封装器 198
12.2.1 Character封装器 198
12.2.2 Boolean封装器 198
12.2.3 数值类型封装器 198
12.3 自动装箱 199
12.3.1 自动装箱与方法 200
12.3.2 表达式中发生的自动装箱/拆箱 201
12.3.3 布尔型和字符型数值的自动装箱/拆箱 202
12.3.4 自动装箱/拆箱有助于防止错误 202
12.3.5 一些警告 203
12.4 注解 203
12.4.1 注解的基础知识 203
12.4.2 指定保留策略 204
12.4.3 在运行时使用反射获取注解 204
12.4.4 AnnotatedElement接口 208
12.4.5 使用默认值 208
12.4.6 标记注解 209
12.4.7 单成员注解 210
12.4.8 内置注解 211
12.5 类型注解 213
12.6 重复注解 216
第13章 I/O、带资源的try语句以及其他主题 219
13.1 I/O的基础知识 219
13.1.1 流 219
13.1.2 字节流和字符流 219
13.1.3 预定义流 221
13.2 读取控制台输入 221
13.2.1 读取字符 222
13.2.2 读取字符串 222
13.3 向控制台写输出 223
13.4 PrintWriter类 224
13.5 读/写文件 225
13.6 自动关闭文件 229
13.7 transient和volatile修饰符 231
13.8 使用instanceof运算符 232
13.9 strictfp 233
13.10 本地方法 234
13.11 使用assert 234
13.12 静态导入 236
13.13 通过this()调用重载的构造函数 238
13.14 紧凑API配置文件 239
第14章 泛型 241
14.1 什么是泛型 241
14.2 一个简单的泛型示例 241
14.2.1 泛型只使用引用类型 244
14.2.2 基于不同类型参数的泛型类型是不同的 244
14.2.3 泛型提升类型安全性的原理 244
14.3 带两个类型参数的泛型类 246
14.4 泛型类的一般形式 247
14.5 有界类型 247
14.6 使用通配符参数 249
14.7 创建泛型方法 255
14.8 泛型接口 257
14.9 原始类型与遗留代码 259
14.10 泛型类层次 260
14.10.1 使用泛型超类 260
14.10.2 泛型子类 262
14.10.3 泛型层次中的运行时类型比较 263
14.10.4 强制转换 265
14.10.5 重写泛型类的方法 265
14.11 泛型的类型推断 266
14.12 擦除 267
14.13 模糊性错误 268
14.14 使用泛型的一些限制 269
14.14.1 不能实例化类型参数 269
14.14.2 对静态成员的一些限制 269
14.14.3 对泛型数组的一些限制 270
14.14.4 对泛型异常的限制 271
第15章 lambda表达式 273
15.1 lambda表达式简介 273
15.1.1 lambda表达式的基础知识 273
15.1.2 函数式接口 274
15.1.3 几个lambda表达式示例 275
15.2 块lambda表达式 277
15.3 泛型函数式接口 278
15.4 作为参数传递lambda表达式 280
15.5 lambda表达式与异常 282
15.6 lambda表达式和变量捕获 282
15.7 方法引用 283
15.7.1 静态方法的方法引用 283
15.7.2 实例方法的方法引用 284
15.7.3 泛型中的方法引用 287
15.8 构造函数引用 289
15.9 预定义的函数式接口 293
第16章 模块 295
16.1 模块基础知识 295
16.1.1 简单的模块示例 295
16.1.2 编译、运行第一个模块示例 298
16.1.3 requires和exports 299
16.2 java.base和平台模块 299
16.3 旧代码和未命名的模块 300
16.4 导出到特定的模块 300
16.5 使用requires transitive 301
16.6 使用服务 304
16.6.1 服务和服务提供程序的基础知识 304
16.6.2 基于服务的关键字 305
16.6.3 基于模块的服务示例 305
16.7 模块图 310
16.8 三个特殊的模块特性 310
16.8.1 open模块 310
16.8.2 opens语句 310
16.8.3 requires static 311
16.9 jlink工具和模块JAR文件介绍 311
16.9.1 链接exploded directory中的文件 311
16.9.2 链接模块化的JAR文件 311
16.9.3 JMOD文件 312
16.10 层与自动模块简述 312
16.11 小结 312
第Ⅱ部分 Java库 315
第17章 字符串处理 315
17.1 String类的构造函数 315
17.2 字符串的长度 317
17.3 特殊的字符串操作 317
17.3.1 字符串字面值 317
17.3.2 字符串连接 317
17.3.3 字符串和其他数据类型的连接 318
17.3.4 字符串转换和toString()方法 318
17.4 提取字符 319
17.4.1 charAt() 319
17.4.2 getChars() 319
17.4.3 getBytes() 320
17.4.4 toCharArray() 320
17.5 比较字符串 320
17.5.1 equals()和equalsIgnoreCase() 320
17.5.2 regionMatches() 321
17.5.3 startsWith()和endsWith() 321
17.5.4 equals()与= 321
17.5.5 compareTo() 322
17.6 查找字符串 323
17.7 修改字符串 324
17.7.1 substring() 324
17.7.2 concat() 325
17.7.3 replace() 325
17.7.4 trim() 325
17.8 使用valueOf()转换数据 326
17.9 改变字符串中字符的大小写 326
17.10 连接字符串 327
17.11 其他String方法 327
17.12 StringBuffer类 328
17.12.1 SuingBuffer类的构造函数 328
17.12.2 length()与capacity() 329
17.12.3 ensureCapacity() 329
17.12.4 setLength() 329
17.12.5 charAt()与setCharAt() 329
17.12.6 getChars() 330
17.12.7 append() 330
17.12.8 insert() 330
17.12.9 reverse() 331
17.12.10 delete()与deleteCharAt() 331
17.12.11 replace() 332
17.12.12 substring() 332
17.12.13 其他StringBuffer方法 332
17.13 StringBuilder类 333
第18章 探究java.lang 335
18.1 基本类型封装器 335
18.1.1 Number 336
18.1.2 Double与Float 336
18.1.3 理解isInfinite()与isNaN() 338
18.1.4 Byte、Short、Integer和Long 339
18.1.5 Character 346
18.1.6 对Unicode代码点的附加支持 348
18.1.7 Boolean 349
18.2 Void类 349
18.3 Process类 349
18.4 Runtime类 350
18.4.1 内存管理 351
18.4.2 执行其他程序 352
18.5 Runtime.Version 353
18.6 ProcessBuilder类 353
18.7 System类 355
18.7.1 使用currentTimeMillis()计时程序的执行 356
18.7.2 使用arraycopy()方法 357
18.7.3 环境属性 357
18.8 System.Logger和System.LoggerFinder 358
18.9 Object类 358
18.10 使用clone()方法和Cloneable接口 358
18.11 Class类 360
18.12 ClassLoader类 362
18.13 Math类 362
18.13.1 三角函数 362
18.13.2 指数函数 363
18.13.3 舍入函数 363
18.13.4 其他数学方法 364
18.14 StrictMath类 365
18.15 Compiler类 365
18.16 Thread类、ThreadGroup类和Runnable接口 366
18.16.1 Runnable接口 366
18.16.2 Thread类 366
18.16.3 ThreadGroup类 368
18.17 ThreadLocal和InheritableThreadLocal类 371
18.18 Package类 371
18.19 Module类 372
18.20 ModuleLayer类 372
18.21 RuntimePermission类 372
18.22 Throwable类 373
18.23 SecurityManager类 373
18.24 StackTraceElement类 373
18.25 StackWalker类和StackWalker.StackFrame接口 373
18.26 Enum类 373
18.27 ClassValue类 374
18.28 CharSequence接口 374
18.29 Comparable接口 374
18.30 Appendable接口 375
18.31 Iterable接口 375
18.32 Readable接口 375
18.33 AutoCloseable接口 375
18.34 Thread.UncaughtExceptionHandler接口 376
18.35 java.lang子包 376
18.35.1 java.lang.annotation 376
18.35.2 java.lang.instrument 376
18.35.3 java.lang.invoke 376
18.35.4 java.lang.module 376
18.35.5 java.lang.management 376
18.35.6 java.lang.ref 376
18.35.7 java.lang.reflect 377
第19章 java.util第1部分:集合框架 379
19.1 集合概述 380
19.2 集合接口 380
19.2.1 Collection接口 381
19.2.2 List接口 382
19.2.3 Set接口 384
19.2.4 SortedSet接口 384
19.2.5 NavigableSet接口 385
19.2.6 Queue接口 385
19.2.7 Deque接口 386
19.3 集合类 387
19.3.1 ArrayList类 388
19.3.2 LinkedList类 390
19.3.3 HashSet类 391
19.3.4 LinkedHashSet类 392
19.3.5 TreeSet类 392
19.3.6 PriorityQueue类 393
19.3.7 ArrayDeque类 394
19.3.8 Enumset类 395
19.4 通过迭代器访问集合 395
19.4.1 使用迭代器 396
19.4.2 使用for-each循环替代迭代器 398
19.5 Spliterator 398
19.6 在集合中存储用户定义的类 400
19.7 RandomAccess接口 401
19.8 使用映射 401
19.8.1 映射接口 402
19.8.2 映射类 406
19.9 比较器 409
19.10 集合算法 415
19.11 Arrays类 420
19.12 遗留的类和接口 423
19.12.1 Enumeration接口 424
19.12.2 Vector类 424
19.12.3 Stack类 427
19.12.4 Dictionary类 428
19.12.5 Hashtable类 429
19.12.6 Properties类 431
19.12.7 使用store()和load()方法 434
19.13 集合小结 435
第20章 java.util第2部分:更多实用工具类 437
20.1 StringTokenizer类 437
20.2 BitSet类 438
20.3 Optional、OptionalDouble、OptionalInt和OptionalLong 440
20.4 Date类 442
20.5 Calendar类 443
20.6 GregorianCalendar类 445
20.7 TimeZone类 446
20.8 SimpleTimeZone类 447
20.9 Locale类 448
20.10 Random类 449
20.11 Timer和TimerTask类 450
20.12 Currency类 452
20.13 Formatter类 453
20.13.1 Formatter类的构造函数 453
20.13.2 Formatter类的方法 453
20.13.3 格式化的基础知识 454
20.13.4 格式化字符串和字符 455
20.13.5 格式化数字 455
20.13.6 格式化时间和日期 456
20.13.7 %n和%%说明符 458
20.13.8 指定最小字段宽度 458
20.13.9 指定精度 459
20.13.10 使用格式标志 460
20.13.11 对齐输出 460
20.13.12 空格、“+”、“0”以及“(”标志 461
20.13.13 逗号标志 462
20.13.14 “#”标志 462
20.13.15 大写选项 462
20.13.16 使用参数索引 462
20.13.17 关闭Formatter对象 463
20.13.18 printf()方法 464
20.14 Scanner类 464
20.14.1 Scanner类的构造函数 464
20.14.2 扫描的基础知识 465
20.14.3 一些Scanner示例 467
20.14.4 设置定界符 470
20.14.5 其他Scanner特性 471
20.15 ResourceBundle、ListResourceBundle和PropertyResourceBundle类 472
20.16 其他实用工具类和接口 475
20.17 java.util子包 475
20.17.1 java.util.concurrent、java.util.concurrent.atomic和java.util.concurrent.locks 476
20.17.2 java.util.function 476
20.17.3 java.util.jar 478
20.17.4 java.util.logging 478
20.17.5 java.util.prefs 478
20.17.6 java.util.regex 478
20.17.7 java.util.spi 478
20.17.8 java.util.stream 478
20.17.9 java.util.zip 478
第21章 输入/输出:探究java.io 479
21.1 I/O类和接口 479
21.2 File类 480
21.2.1 目录 482
21.2.2 使用FilenameFilter接口 483
21.2.3 listFiles()方法 483
21.2.4 创建目录 484
21.3 AutoCloseable、Closeable和Flushable接口 484
21.4 I/O异常 484
21.5 关闭流的两种方式 484
21.6 流类 485
21.7 字节流 486
21.7.1 InputStream类 486
21.7.2 OutputStream类 486
21.7.3 FileInputStream类 487
21.7.4 FileOutputStream类 488
21.7.5 ByteArrayInputStream类 490
21.7.6 ByteArrayOutputStream类 491
21.7.7 过滤的字节流 492
21.7.8 缓冲的字节流 492
21.7.9 SequenceInputStream类 495
21.7.10 PrintStream类 496
21.7.11 DataOutputStream和DataInputStream类 498
21.7.12 RandomAccessFile类 499
21.8 字符流 500
21.8.1 Reader类 500
21.8.2 Writer类 501
21.8.3 FileReader类 501
21.8.4 FileWriter类 502
21.8.5 CharArrayReader类 503
21.8.6 CharArrayWriter类 504
21.8.7 BufferedReader类 505
21.8.8 BufferedWriter类 506
21.8.9 PushbackReader类 506
21.8.10 PrintWriter类 507
21.9 Console类 508
21.10 串行化 509
21.10.1 Serializable接口 509
21.10.2 Externalizable接口 509
21.10.3 ObjectOutput接口 509
21.10.4 ObjectOutputStream类 510
21.10.5 ObjectInput接口 510
21.10.6 ObjectInputStream类 511
21.10.7 串行化示例 512
21.11 流的优点 513
第22章 探究NIO 515
22.1 NIO类 515
22.2 NIO的基础知识 515
22.2.1 缓冲区 515
22.2.2 通道 517
22.2.3 字符集和选择器 518
22.3 NIO.2对NIO的增强 518
22.3.1 Path接口 518
22.3.2 Files类 519
22.3.3 Path接口 521
22.3.4 文件属性接口 521
22.3.5 FileSystem、FileSystems和FileStore类 522
22.4 使用NIO系统 522
22.4.1 为基于通道的I/O使用NIO 523
22.4.2 为基于流的I/O使用NIO 529
22.4.3 为路径和文件系统操作使用NIO 531
第23章 联网 539
23.1 联网的基础知识 539
23.2 联网类和接口 540
23.3 InetAddress类 540
23.3.1 工厂方法 540
23.3.2 实例方法 541
23.4 Inet4Address类和Inet6Address类 541
23.5 TCP/IP客户端套接字 542
23.6 URL类 544
23.7 URLConnection类 545
23.8 HttpURLConnection类 547
23.9 URI类 549
23.10 cookie 549
23.11 TCP/IP服务器套接字 549
23.12 数据报 549
23.12.1 DatagramSocket类 550
23.12.2 DatagramPacket类 550
23.12.3 数据报示例 551
第24章 事件处理 553
24.1 两种事件处理机制 553
24.2 委托事件模型 553
24.2.1 事件 554
24.2.2 事件源 554
24.2.3 事件监听器 554
24.3 事件类 554
24.3.1 ActionEvent类 555
24.3.2 AdjustmentEvent类 556
24.3.3 ComponentEvent类 556
24.3.4 ContainerEvent类 557
24.3.5 FocusEvent类 557
24.3.6 InputEvent类 558
24.3.7 ItemEvent类 558
24.4 KeyEvent类 559
24.4.1 MouseEvent类 559
24.4.2 MouseWheelEvent类 560
24.4.3 TextEvent类 561
24.4.4 WindowEvent类 561
24.5 事件源 562
24.6 事件监听器接口 562
24.6.1 ActionListener接口 563
24.6.2 AdjustmentListener接口 563
24.6.3 ComponentListener接口 563
24.6.4 ContainerListener接口 563
24.6.5 FocusListener接口 563
24.6.6 ItemListener接口 563
24.6.7 KeyListener接口 564
24.6.8 MouseListener接口 564
24.6.9 MouseMotionListener接口 564
24.6.10 MouseWheelListener接口 564
24.6.11 TextListener接口 564
24.6.12 WindowFocusListener接口 564
24.6.13 WindowListener接口 564
24.7 使用委托事件模型 565
24.7.1 一些重要的GUI概念 565
24.7.2 处理鼠标事件 565
24.7.3 处理键盘事件 568
24.8 适配器类 571
24.9 内部类 572
第25章 AWT介绍:使用窗口、图形和文本 577
25.1 AWT类 577
25.2 窗口基本元素 579
25.2.1 Component类 579
25.2.2 Container类 579
25.2.3 Panel类 580
25.2.4 Window类 580
25.2.5 Frame类 580
25.2.6 Canvas类 580
25.3 使用框架窗口 580
25.3.1 设置窗口的尺寸 580
25.3.2 隐藏和显示窗口 580
25.3.3 设置窗口的标题 581
25.3.4 关闭框架窗口 581
25.3.5 paint()方法 581
25.3.6 显示字符串 581
25.3.7 设置前景色和背景色 581
25.3.8 请求重画 582
25.3.9 创建基于框架的应用程序 583
25.4 使用图形 583
25.4.1 绘制直线 583
25.4.2 绘制矩形 583
25.4.3 绘制椭圆和圆 584
25.4.4 绘制弧形 584
25.4.5 绘制多边形 584
25.4.6 演示绘制方法 584
25.4.7 改变图形的大小 586
25.5 使用颜色 587
25.5.1 Color类的方法 587
25.5.2 设置当前图形的颜色 588
25.5.3 一个演示颜色的applet 588
25.6 设置绘图模式 589
25.7 使用字体 590
25.7.1 确定可用字体 591
25.7.2 创建和选择字体 592
25.7.3 获取字体信息 594
25.8 使用FontMetrics管理文本输出 595
第26章 使用AWT控件、布局管理器和菜单 599
26.1 AWT控件的基础知识 599
26.1.1 添加和移除控件 599
26.1.2 响应控件 600
26.1.3 HeadlessException异常 600
26.2 使用标签 600
26.3 使用命令按钮 601
26.4 使用复选框 604
26.5 使用复选框组 606
26.6 使用下拉列表 607
26.7 使用列表框 609
26.8 管理滚动条 611
26.9 使用TextField 613
26.10 使用TextArea 615
26.11 理解布局管理器 617
26.11.1 FlowLayout布局管理器 617
26.11.2 BorderLayout布局管理器 618
26.11.3 使用Insets 619
26.11.4 GridLayout布局管理器 620
26.11.5 CardLayout布局管理器 621
26.11.6 GridBagLayout布局管理器 623
26.12 菜单栏和菜单 627
26.13 对话框 630
26.14 关于重写paint()方法 634
第27章 图像 635
27.1 文件格式 635
27.2 图像基础:创建、加载与显示 635
27.2.1 创建Image对象 635
27.2.2 加载图像 636
27.2.3 显示图像 636
27.3 双缓冲 637
27.4 ImageProducer接口 639
27.5 ImageConsumer接口 641
27.6 ImageFilter类 643
27.6.1 CropImageFilter类 643
27.6.2 RGBImageFilter类 645
27.7 其他图像类 653
第28章 并发实用工具 655
28.1 并发API包 655
28.1.1 java.util.concurrent包 655
28.1.2 java.util.concurrent.atomic包 656
28.1.3 java.util.concurrent.locks包 656
28.2 使用同步对象 657
28.2.1 Semaphore类 657
28.2.2 CountDownLatch类 661
28.2.3 CyclicBarrier类 662
28.2.4 Exchanger类 664
28.2.5 Phaser类 666
28.3 使用执行器 671
28.3.1 一个简单的执行器示例 672
28.3.2 使用Callable和Future接口 673
28.4 TimeUnit枚举 675
28.5 并发集合 676
28.6 锁 676
28.7 原子操作 678
28.8 通过Fork/Join框架进行并行编程 679
28.8.1 主要的Fork/Join类 680
28.8.2 分而治之的策略 682
28.8.3 一个简单的Fork/Join示例 682
28.8.4 理解并行级别带来的影响 684
28.8.5 一个使用RecursiveTask<V>的例子 686
28.8.6 异步执行任务 688
28.8.7 取消任务 688
28.8.8 确定任务的完成状态 689
28.8.9 重新启动任务 689
28.8.10 深入研究 689
28.8.11 关于Fork/Join框架的一些提示 690
28.9 并发实用工具与Java传统方式的比较 690
第29章 流API 691
29.1 流的基础知识 691
29.1.1 流接口 691
29.1.2 如何获得流 693
29.1.3 一个简单的流示例 693
29.2 缩减操作 696
29.3 使用并行流 697
29.4 映射 699
29.5 收集 702
29.6 迭代器和流 705
29.6.1 对流使用迭代器 705
29.6.2 使用Spliterator 706
29.7 流API中更多值得探究的地方 708
第30章 正则表达式和其他包 709
30.1 正则表达式处理 709
30.1.1 Pattern类 709
30.1.2 Matcher类 709
30.1.3 正则表达式的语法 710
30.1.4 演示模式匹配 710
30.1.5 模式匹配的两个选项 714
30.1.6 探究正则表达式 715
30.2 反射 715
30.3 远程方法调用 718
30.4 使用java.text格式化日期和时间 720
30.4.1 DateFormat类 720
30.4.2 SimpleDateFormat类 722
30.5 java.time的时间和日期API 723
30.5.1 时间和日期的基础知识 723
30.5.2 格式化日期和时间 724
30.5.3 解析日期和时间字符串 726
30.6 探究java.time包的其他方面 727
第Ⅲ部分 使用Swing进行GUI编程 731
第31章 Swing简介 731
31.1 Swing的起源 731
31.2 Swing以AWT为基础 731
31.3 两个关键的Swing特性 731
31.3.1 Swing组件是轻量级的 732
31.3.2 Swing支持可插入外观 732
31.4 MVC连接 732
31.5 组件与容器 733
31.5.1 组件 733
31.5.2 容器 733
31.5.3 顶级容器窗格 733
31.6 Swing包 734
31.7 一个简单的Swing应用程序 734
31.8 事件处理 737
31.9 在Swing中绘图 739
31.9.1 绘图的基础知识 739
31.9.2 计算可绘制区域 740
31.9.3 一个绘图示例 740
第32章 探索Swing 743
32.1 JLabel与ImageIcon 743
32.2 JTextField 744
32.3 Swing按钮 745
32.3.1 JButton 746
32.3.2 JToggleButton 748
32.3.3 复选框 749
32.3.4 单选按钮 750
32.4 JTabbedPane 752
32.5 JScrollPane 754
32.6 JList 756
32.7 JComboBox 758
32.8 树 760
32.9 JTable 762
第33章 Swing菜单简介 765
33.1 菜单的基础知识 765
33.2 JMenuBar、JMenu和JMenuItem概述 766
33.2.1 JMenuBar 766
33.2.2 JMenu 767
33.2.3 JMenuItem 767
33.3 创建主菜单 768
33.4 向菜单项添加助记符和加速键 771
33.5 向菜单项添加图片和工具提示 773
33.6 使用JRadioButtonMenuItem和JCheckBoxMenuItem 773
33.7 创建弹出菜单 775
33.8 创建工具栏 777
33.9 使用动作 778
33.10 完整演示MenuDemo程序 782
33.11 继续探究Swing 787
第Ⅳ部分 使用JavaFX进行GUI编程 791
第34章 JavaFXGUI编程简介 791
34.1 JavaFX的基础概念 791
34.1.1 JavaFX包 791
34.1.2 Stage和Scene类 792
34.1.3 节点和场景图 792
34.1.4 布局 792
34.1.5 Application类和生命周期方法 792
34.1.6 启动JavaFX应用程序 792
34.2 JavaFX应用程序的骨架 793
34.3 编译和运行JavaFX程序 795
34.4 应用程序线程 795
34.5 一个简单的JavaFX控件:Label 796
34.6 使用按钮和事件 797
34.6.1 事件的基础知识 797
34.6.2 按钮控件简介 798
34.6.3 演示事件处理和按钮 798
34.7 直接在画布上绘制 800
第35章 探究JavaFX控件 805
35.1 使用Image和ImageView 805
35.1.1 向标签添加图片 807
35.1.2 在按钮中使用图片 808
35.2 ToggleButton 810
35.3 RadioButton 812
35.3.1 处理开关组中的变化事件 814
35.3.2 处理单选按钮的另一种方式 815
35.4 CheckBox 817
35.5 ListView 820
35.5.1 ListView的滚动条 822
35.5.2 启用多项选择 823
35.6 ComboBox 823
35.7 TextField 826
35.8 ScrollPane 828
35.9 TreeView 830
35.10 效果和变换简介 833
35.10.1 效果 834
35.10.2 变换 834
35.10.3 演示效果和变换 835
35.11 添加工具提示 837
35.12 禁用控件 838
第36章 JavaFX菜单简介 839
36.1 菜单的基础知识 839
36.2 MenuBar、Menu和MenuItem概述 840
36.2.1 MenuBar 840
36.2.2 Menu 841
36.2.3 MenuItem 841
36.3 创建主菜单 841
36.4 向菜单项添加助记符和加速键 845
36.5 向菜单项添加图片 846
36.6 使用RadioMenuItem和CheckMenuItem 847
36.7 创建上下文菜单 848
36.8 创建工具栏 850
36.9 完整的MenuDemo程序 852
36.10 继续探究JavaFX 857
第Ⅴ部分 应用Java 861
第37章 Java Bean 861
37.1 Java Bean是什么 861
37.2 Java Bean的优势 861
37.3 内省 861
37.3.1 属性的设计模式 862
37.3.2 事件的设计模式 863
37.3.3 方法与设计模式 863
37.3.4 使用BeanInfo接口 863
37.4 绑定属性与约束属性 863
37.5 持久性 864
37.6 定制器 864
37.7 Java Bean API 864
37.7.1 Introspector类 865
37.7.2 PropertyDescriptor类 865
37.7.3 EventSetDescriptor类 865
37.7.4 MethodDescriptor类 866
37.8 一个Bean示例 866
第38章 servlet 869
38.1 背景 869
38.2 servlet的生命周期 869
38.3 servlet开发选项 870
38.4 使用Tomcat 870
38.5 一个简单的servlet 871
38.5.1 创建和编译servlet源代码 871
38.5.2 启动Tomcat 872
38.5.3 启动Web浏览器并请求servlet 872
38.6 Servlet API 872
38.7 javax.servlet包 872
38.7.1 Servlet接口 873
38.7.2 ServletConfig接口 873
38.7.3 ServletContext接口 873
38.7.4 ServletRequest接口 874
38.7.5 ServletResponse接口 874
38.7.6 GenericServlet类 875
38.7.7 ServletInputStream类 875
38.7.8 ServletOutputStream类 875
38.7.9 servlet异常类 875
38.8 读取servlet参数 875
38.9 javax.servlet.http包 876
38.9.1 HttpServletRequest接口 877
38.9.2 HttpServletResponse接口 878
38.9.3 HttpSession接口 878
38.9.4 Cookie类 879
38.9.5 HttpServlet类 879
38.10 处理HTTP请求和响应 880
38.10.1 处理HTTP GET请求 880
38.10.2 处理HTTP POST请求 881
38.11 使用cookie 882
38.12 会话跟踪 884
第Ⅵ部分 附录 889
附录A 使用Java的文档注释 889
附录B Java Web Start概述 895
附录C JShell简介 901
附录D applet基础 909
附录E JDK 10的两个重要特性 915