第1章 Java编程简介 1
1.1 计算的基本概念 1
1.1.1 为什么要编程 1
1.1.2 硬件和软件 2
1.1.3 数字王国 2
1.1.4 程序设计的过程 4
1.1.5 为什么选择Java 5
1.1.6 Java编程环境 5
1.2 现在开始介绍Java 6
1.2.1 字符串常量 9
1.2.2 System.out.println 9
1.2.3 转义序列 10
1.2.4 print和println 10
1.2.5 标识符和关键字 12
1.2.6 一个复杂的例子:DrawFigures1 13
1.2.7 注释与程序可读性 14
1.3 程序中的错误 16
1.3.1 语法错误 16
1.3.2 逻辑错误 18
1.4 过程分解 18
1.4.1 静态方法 20
1.4.2 控制流程 22
1.4.3 调用其他方法的方法 24
1.4.4 运行时错误举例 26
1.5 案例分析:输出图形 27
1.5.1 结构化的版本 27
1.5.2 无冗余的最终版本 28
1.5.3 执行流程的分析 30
本章小结 31
第2章 基本数据类型和确定循环 32
2.1 数据的基本概念 32
2.1.1 基本类型 32
2.1.2 表达式 33
2.1.3 常值 34
2.1.4 算术运算符 35
2.1.5 优先级 36
2.1.6 类型混用和类型转换 38
2.2 变量 39
2.2.1 赋值和声明变量 42
2.2.2 字符串连接 44
2.2.3 增量和减量运算符 46
2.2.4 变量和混合类型 47
2.3 for循环 49
2.3.1 跟踪for循环 50
2.3.2 for循环模式 52
2.3.3 循环嵌套 53
2.4 复杂性管理 55
2.4.1 作用域 55
2.4.2 伪代码 59
2.4.3 类常量 61
2.5 案例分析:输出复杂的图形 63
2.5.1 问题分解和伪代码 63
2.5.2 第一个结构化版本 64
2.5.3 增加一个类常量 66
2.5.4 进一步修改 68
本章小结 69
第3章 参数和对象 70
3.1 参数 70
3.1.1 参数的机制 72
3.1.2 参数的限制 75
3.1.3 多重参数 77
3.1.4 参数和常量 79
3.1.5 方法重载 79
3.2 具有返回值的方法 80
3.2.1 Math类 81
3.2.2 编写具有返回值的方法 83
3.3 使用对象 85
3.3.1 String对象 86
3.3.2 交互式程序和Scanner对象 90
3.3.3 交互式程序示例 92
3.4 案例分析:抛物线轨迹 93
3.4.1 非结构化解决方案 96
3.4.2 结构化解决方案 98
本章小结 100
第3G章 图形(选学) 101
3G.1 图形简介 101
3G.1.1 DrawingPanel 101
3G.1.2 绘制线段和图形 102
3G.1.3 颜色 105
3G.1.4 循环绘图 106
3G.1.5 文本和字体 108
3G.2 图形处理中的过程分解 110
3G.3 案例分析:金字塔 113
3G.3.1 非结构的部分解决方案 113
3G.3.2 绘制金字塔的通用方法 114
3G.3.3 完全的结构化解决方案 116
本章小结 117
第4章 条件执行 118
4.1 if/else语句 118
4.1.1 关系运算符 119
4.1.2 嵌套if/else语句 120
4.1.3 对象的相等性 125
4.1.4 构造if/else语句 126
4.1.5 多重条件测试 127
4.2 积累式算法 128
4.2.1 累加和 128
4.2.2 最小/最大循环 130
4.2.3 使用if计算累加和 133
4.2.4 截断错误 134
4.3 文本处理 136
4.3.1 char类型 137
4.3.2 char与int 137
4.3.3 积累式文本处理算法 138
4.3.4 System.out.printf 139
4.4 条件执行的方法 142
4.4.1 前提条件和后置条件 142
4.4.2 抛出异常 143
4.4.3 重温返回值 145
4.4.4 推敲执行路径 148
4.5 案例分析:计算健康指数 150
4.5.1 单人版无结构化解决方案 151
4.5.2 两人版无结构化解决方案 153
4.5.3 两人版结构化解决方案 155
4.5.4 面向过程的程序设计原则 158
本章小结 161
第5章 程序逻辑和不确定循环 162
5.1 while循环 162
5.1.1 寻找最小约数的循环 163
5.1.2 随机数字 165
5.1.3 计算机模拟技术 168
5.1.4 do/while循环 169
5.2 篱笆桩算法 170
5.2.1 哨兵循环 171
5.2.2 使用if语句处理篱笆桩 172
5.3 布尔类型 174
5.3.1 逻辑运算符 175
5.3.2 短路特性 176
5.3.3 boolean变量和标志 180
5.3.4 boolean的禅意 181
5.3.5 布尔表达式的非运算 183
5.4 用户错误 184
5.4.1 初识Scanner对象 184
5.4.2 处理用户错误 186
5.5 断言和程序逻辑 187
5.5.1 分析断言 188
5.5.2 断言举例 190
5.6 案例分析:猜数字 192
5.6.1 无提示的初始版本 192
5.6.2 带有提示的随机版本 194
5.6.3 健壮的最终版本 197
本章小结 199
第6章 文件处理 201
6.1 读取文件的基本方法 201
6.1.1 随处可见的数据 201
6.1.2 文件与文件对象 202
6.1.3 使用Scanner对象读取文件内容 203
6.2 基于标记的文件处理 206
6.2.1 文件的结构和处理输入 208
6.2.2 Scanner对象的参数 211
6.2.3 路径和目录 212
6.2.4 一个更复杂的输入文件 214
6.3 基于行的处理 215
6.4 高级文件处理 220
6.4.1 使用PrintStream输出文件内容 220
6.4.2 保证文件可读 224
6.5 案例分析:邮政编码查询 225
本章小结 231
第7章 数组 232
7.1 数组的基本概念 232
7.1.1 创建并遍历数组 232
7.1.2 访问数组 235
7.1.3 一个使用数组的完整程序 237
7.1.4 随机访问 240
7.1.5 数组与方法 241
7.1.6 for-each循环 244
7.1.7 数组初始化 245
7.1.8 Arrays类 246
7.2 数组遍历算法 247
7.2.1 打印数组 247
7.2.2 查询与替换 249
7.2.3 判断相等性 251
7.2.4 逆序数组 252
7.2.5 字符串遍历算法 255
7.3 引用语义 256
7.4 高级数组技术 259
7.4.1 移动数组中的元素 259
7.4.2 对象数组 262
7.4.3 命令行参数 263
7.4.4 嵌套循环算法 263
7.5 多维数组 265
7.5.1 规则的二维数组 265
7.5.2 锯齿状二维数组 266
7.6 案例分析:本福德定律 270
7.6.1 计数器 270
7.6.2 完整的程序 273
本章小结 277
第8章 类 279
8.1 面向对象程序设计的基本概念 279
8.1.1 类和对象 280
8.1.2 Point对象 281
8.2 对象的状态与行为 282
8.2.1 对象的状态:字段 282
8.2.2 对象的行为:方法 284
8.2.3 隐含的参数 286
8.2.4 修改器和访问器 287
8.2.5 toString方法 289
8.3 对象的初始化:构造函数 290
8.3.1 关键字this 293
8.3.2 多个构造函数 295
8.4 封装 296
8.4.1 私有成员 296
8.4.2 类的不变式 301
8.4.3 改变类的内部实现 303
8.5 案例分析:设计一个表示股票信息的类 305
8.5.1 面向对象程序设计讨论 305
8.5.2 Stock类的字段和方法声明 307
8.5.3 Stock类的构造函数和实例方法的实现 308
本章小结 311
第9章 继承和接口 313
9.1 继承的基本概念 313
9.1.1 程序设计之外的层次结构 314
9.1.2 扩展类 315
9.1.3 重写方法 318
9.2 与父类交互 320
9.2.1 调用重写的方法 320
9.2.2 访问继承的字段 320
9.2.3 调用父类的构造函数 322
9.2.4 DividendStock类的行为 323
9.2.5 Object类 325
9.2.6 equals方法 326
9.2.7 instanceof关键字 328
9.3 多态性 329
9.3.1 多态机制 331
9.3.2 解析继承代码 333
9.3.3 解析复杂的调用关系 334
9.4 继承和设计 336
9.4.1 继承的误用 336
9.4.2 “是一个”和“有一个”关系 338
9.4.3 Graphics2D类 339
9.5 接口 340
9.5.1 形状类的接口 341
9.5.2 实现接口 342
9.5.3 接口的优点 344
9.6 案例分析:设计一组具有层次关系的金融类 346
9.6.1 设计类 346
9.6.2 初步实现 349
9.6.3 抽象类 352
本章小结 356
第10章 ArrayList 357
10.1 ArrayList 357
10.1.1 ArrayList的基本操作 358
10.1.2 ArrayList的查找方法 361
10.1.3 一个完整的ArrayList程序 363
10.1.4 向ArrayList添加或删除元素 364
10.1.5 使用for-each循环访问ArrayList 367
10.1.6 包装类 368
10.2 Comparable接口 370
10.2.1 自然排序和compareTo方法 372
10.2.2 实现Comparable接口 374
10.3 案例分析:词汇表比较 378
10.3.1 关于程序执行效率的考虑 379
10.3.2 版本1:计算词汇量 380
10.3.3 版本2:计算重叠部分 383
10.3.4 版本3:完整的程序 386
本章小结 390
第11章 Java的集合框架 391
11.1 列表 391
11.1.1 集合 391
11.1.2 LinkedList与ArrayList 392
11.1.3 迭代器 394
11.1.4 抽象数据类型 397
11.1.5 LinkedList类案例分析:筛法 398
11.2 数学集合 401
11.2.1 数学集合的概念 402
11.2.2 TreeSet与HashSet 403
11.2.3 数学集合上的运算 404
11.2.4 Set类案例分析:彩票机 406
11.3 映射 407
11.3.1 基本映射操作 408
11.3.2 映射视图(keySet和values) 409
11.3.3 TreeMap与HashMap 411
11.3.4 Map类案例分析:字数统计 411
11.3.5 集合综述 413
本章小结 414
第12章 递归 415
12.1 递归的思想 415
12.1.1 一个与编程无关的例子 415
12.1.2 将迭代方法改写为递归方法 417
12.1.3 递归方法的结构 419
12.2 一个更好的递归实例 420
12.3 递归函数和数据 428
12.3.1 整数的幂运算 428
12.3.2 求最大公约数 430
12.3.3 目录爬虫 434
12.3.4 助手方法 437
12.4 递归图形 439
12.5 递归回溯 442
12.5.1 一个简单的例子:移动路线问题 442
12.5.2 8皇后问题 445
12.5.3 数独问题 450
12.6 案例分析:求解前序表达式 453
12.6.1 中序、前序、后序表达式 453
12.6.2 计算前序表达式 454
12.6.3 完整的程序 456
本章小结 458
第13章 查找与排序 459
13.1 Java类库中的查找与排序 459
13.1.1 二分法查找 460
13.1.2 排序 462
13.1.3 洗牌 463
13.1.4 用比较器来自定义顺序 464
13.2 程序的复杂度 467
13.2.1 实验分析 469
13.2.2 算法的复杂度类型 471
13.3 查找和排序算法的实现 473
13.3.1 顺序查找 473
13.3.2 二分法查找 474
13.3.3 递归二分法查找 476
13.3.4 查找对象 479
13.3.5 选择排序 479
13.4 案例分析:归并排序算法的实现 482
13.4.1 分解与合并数组 482
13.4.2 递归的归并排序 484
13.4.3 完整的程序 487
本章小结 489
第14章 栈与队列 490
14.1 栈/队列基础 490
14.1.1 栈的概念 490
14.1.2 队列的概念 492
14.2 栈/队列常用操作 493
14.2.1 栈与队列互换 494
14.2.2 队列元素求和 495
14.2.3 栈元素求和 496
14.3 栈/队列高级操作 498
14.3.1 删除队列中的元素 498
14.3.2 比较两个栈 499
14.4 案例分析:表达式求值 501
14.4.1 标记分解 502
14.4.2 求值计算 505
本章小结 509
第15章 实现集合类 511
15.1 简单ArrayIntList类 511
15.1.1 添加数值和打印功能 511
15.1.2 关于封装的思考 515
15.1.3 处理列表的中间内容 516
15.1.4 引入另一个构造函数和常量 519
15.1.5 前提条件和后置条件 520
15.2 更完整的ArrayIntList类 523
15.2.1 抛出异常 523
15.2.2 方便的方法 525
15.3 高级功能 527
15.3.1 自动调整列表大小 527
15.3.2 添加迭代器 528
15.4 ArrayList<E>类 533
本章小结 536
第16章 链表 538
16.1 链表节点 538
16.1.1 创建链表 539
16.1.2 链表基础操作 541
16.1.3 操作节点 542
16.1.4 链表遍历 545
16.2 链表类 547
16.2.1 简单LinkedIntList类 547
16.2.2 追加新节点 549
16.2.3 操作中间节点 551
16.3 复杂的链表操作 557
16.4 IntList接口 561
16.5 LinkedList<E>类 564
16.5.1 链表的变体技术 564
16.5.2 链表的迭代器 566
16.5.3 其他代码细节 568
本章小结 570
第17章 二叉树 571
17.1 二叉树基础 571
17.2 遍历二叉树 574
17.3 树的常见操作 584
17.3.1 节点求和 584
17.3.2 计算树的层数 585
17.3.3 计算叶子节点数量 586
17.4 二叉搜索树 587
17.4.1 二叉搜索树性质 587
17.4.2 构建二叉搜索树 588
17.4.3 x=change(x)模式 591
17.4.4 在树中进行搜索 594
17.4.5 二叉搜索树的复杂性 597
17.5 SearchTree<E>类 597
本章小结 600
第18章 高级数据结构 602
18.1 散列技术 602
18.1.1 利用数组实现数学集合 602
18.1.2 散列函数和散列表 603
18.1.3 冲突 604
18.1.4 再散列 608
18.1.5 非整型数据的散列处理 610
18.1.6 HashMap的实现 612
18.2 优先级队列和堆 613
18.2.1 优先级队列 613
18.2.2 堆的概述 614
18.2.3 从堆中删除元素 615
18.2.4 向堆添加元素 616
18.2.5 利用数组实现堆 617
18.2.6 堆排序 620
本章小结 621
附录A Java总结 622
附录B Java API规范和Javadoc注释 631
附录C Java语法补充说明 635
索引 642