第1课 数组与内存控制 1
1.1数组初始化 2
1.1.1 Java数组是静态的 2
1.1.2数组一定要初始化吗 5
1.1.3基本类型数组的初始化 7
1.1.4引用类型数组的初始化 9
1.2使用数组 12
1.2.1数组元素就是变量 13
1.2.2没有多维数组 15
1.3小结 21
第2课 对象与内存控制 22
2.1实例变量和类变量 23
2.1.1实例变量和类变量的属性 25
2.1.2实例变量的初始化时机 27
2.1.3类变量的初始化时机 32
2.2父类构造器 34
2.2.1隐式调用和显式调用 34
2.2.2访问子类对象的实例变量 37
2.2.3调用被子类重写的方法 41
2.3父子实例的内存控制 43
2.3.1继承成员变量和继承方法的区别 43
2.3.2内存中子类实例 47
2.3.3父、子类的类变量 52
2.4 final修饰符 53
2.4.1 final修饰的变量 54
2.4.2执行“宏替换”的变量 59
2.4.3 final方法不能被重写 65
2.4.4内部类中的局部变量 67
2.5小结 70
第3课 常见Java集合的实现细节 71
3.1 Set和Map 72
3.1.1 Set和Map的关系 72
3.1.2 HashMap和HashSet 79
3.1.3 TreeMap和TreeSet 90
3.2 Map和List 98
3.2.1 Map的valuesxO方法 98
3.2.2 Map和List的关系 106
3.3 ArrayList和LinkedList 107
3.3.1 Vector和ArrayList的区别 109
3.3.2 ArrayList和LinkedList的实现差异 113
3.3.3 ArrayList和LinkedList的性能分析和适用场景 117
3.4 lterator迭代器 118
迭代时删除指定元素 120
3.5小结 123
第4课 Java的内存回收 124
4.1 Java引用的种类 125
4.1.1对象在内存中状态 125
4.1.2强引用 128
4.1.3软引用 129
4.1.4弱引用 132
4.1.5虚引用 136
4.2 Java的内存泄漏 138
4.3垃圾回收机制 142
4.3.1垃圾回收的基本算法 143
4.3.2堆内存的分代回收 144
4.3.3与垃圾回收的附加选项 146
4.3.4常见垃圾回收器 147
4.4内存管理的小技巧 150
4.4.1尽量使用直接量 150
4.4.2使用StringBuilder和StringBuffer进行字符串连接 151
4.4.3尽早释放无用对象的引用 151
4.4.4尽量少用静态变量 152
4.4.5避免在经常调用的方法、循环中创建Java对象 152
4.4.6缓存经常使用的对象 153
4.4.7尽量不要使用finalize方法 153
4.4.8考虑使用SoftReference 154
4.5小结 154
第5课 表达式中的陷阱 155
5.1关于字符串的陷阱 156
5.1.1 JVM对字符串的处理 156
5.1.2不可变的字符串 160
5.1.3字符串比较 162
5.2表达式类型的陷阱 164
5.2.1表达式类型的自动提升 165
5.2.2复合赋值运算符的陷阱 166
5.3输入法导致的陷阱 168
5.4注释的字符必须合法 169
5.5转义字符的陷阱 170
5.5.1慎用字符的Unicode转义形式 170
5.5.2中止行注释的转义字符 171
5.6泛型可能引起的错误 172
5.6.1原始类型变量的赋值 172
5.6.2原始类型带来的擦除 175
5.6.3创建泛型数组的陷阱 178
5.7正则表达式的陷阱 180
5.8多线程的陷阱 182
5.8.1不要调用run方法 182
5.8.2静态的同步方法 183
5.8.3静态初始化块启动新线程执行初始化 187
5.8.4注意多线程执行环境 192
5.9小结 198
第6课 流程控制的陷阱 199
6.1 switch语句陷阱 200
6.1.1 default分支永远会执行吗 200
6.1.2 break的重要性 201
6.1.3 switch表达式的类型 203
6.2标签引起的陷阱 205
6.3if语句的陷阱 206
6.3.1else隐含的条件 206
6.3.2小心空语句 209
6.4循环体的花括号 212
6.4.1什么时候可以省略花括号 212
6.4.2省略花括号的危险 213
6.5for循环的陷阱 214
6.5.1分号惹的祸 214
6.5.2小心循环计数器的值 218
6.5.3浮点数作循环计数器 219
6.6foreach循环的循环计数器 221
6.7小结 223
第7课 面向对象的陷阱 224
7.1 instanceof运算符的陷阱 225
7.2构造器的陷阱 229
7.2.1构造器之前的void 230
7.2.2构造器创建对象吗 231
7.2.3无限递归的构造器 237
7.3持有当前类的实例 238
7.4到底调用哪个重载的方法 240
7.5方法重写的陷阱 244
7.5.1重写private方法 244
7.5.2重写其他访问权限的方法 245
7.6非静态内部类的陷阱 246
7.6.1非静态内部类的构造器 246
7.6.2非静态内部类不能拥有静态成员 248
7.6.3 非静态内部类的子类 249
7.7 static关键字 252
7.7.1静态方法属于类 252
7.7.2静态内部类的限制 253
7.8 native方法的陷阱 254
7.9小结 256
第8课 异常捕捉的陷阱 257
8.1正确关闭资源的方式 258
8.2 finally块的陷阱 262
8.2.1 finally的执行规则 262
8.2.2 finally块和方法返回值 265
8.3 catch块的用法 267
8.3.1 catch块的顺序 267
8.3.2不要用catch代替流程控制 269
8.3.3只能catch可能抛出的异常 270
8.3.4做点实际的修复 274
8.4继承得到的异常 276
8.5小结 278
第9课 线性表 279
9.1线性表概述 280
9.1.1线性表的定义及逻辑结构 280
9.1.2线性表的基本操作 281
9.2顺序存储结构 282
9.3链式存储结构 288
9.3.1单链表上的基本运算 289
9.3.2循环链表 296
9.3.3双向链表 297
9.4线性表的分析 306
9.4.1线性表的实现分析 306
9.4.2线性表的功能 306
9.5小结 308
第10课 栈和队列 309
10.1栈 310
10.1.1栈的基本定义 310
10.1.2栈的常用操作 311
10.1.3栈的顺序存储结构及实现 311
10.1.4栈的链式存储结构及实现 317
10.1.5 Java集合中的栈 321
10.2队列 321
10.2.1队列的基本定义 322
10.2.2队列的常用操作 322
10.2.3队列的顺序存储结构及实现 323
10.2.4循环队列 327
10.2.5队列的链式存储结构及实现 332
10.2.6 Java集合中的队列 336
10.3双向队列 338
10.4小结 339
第11课 树和二叉树 340
11.1树的概述 341
11.1.1树的定义和基本术语 341
11.1.2树的基本操作 343
11.1.3父节点表示法 343
11.1.4子节点链表示法 348
11.2二叉树 354
11.2.1二叉树的定义和基本概念 354
11.2.2二叉树的基本操作 355
11.2.3二叉树的顺序存储 356
11.2.4二叉树的二叉链表存储 360
11.2.5二叉树的三叉链表存储 365
11.3遍历二叉树 369
11.3.1先序遍历 370
11.3.2中序遍历 371
11.3.3后序遍历 371
11.3.4广度优先(按层)遍历 372
11.4森林、树和二叉树的转换 373
11.4.1森林、树和二叉树的转换 374
11.4.2树的链表存储 375
11.5哈夫曼树 375
11.5.1哈夫曼树的定义和基本概念 375
11.5.2创建哈夫曼树 376
11.5.3哈夫曼编码 380
11.6排序二叉树 381
11.7红黑树 390
11.7.1插入操作 392
11.7.2删除操作 394
11.8小结 407
第12课 常用的内部排序 408
12.1排序的基本概念 409
12.1.1排序概述 409
12.1.2内部排序的分类 410
12.2选择排序法 411
12.2.1直接选择排序 411
12.2.2堆排序 415
12.3交换排序 420
12.3.1冒泡排序 420
12.3.2快速排序 423
12.4插入排序 425
12.4.1直接插入排序 425
12.4.2折半插入排序 427
12.4.3Shell排序 429
12.5归并排序 433
12.6桶式排序 437
12.7基数排序 440
12.8小结 443
第13课 程序开发 444
13.1扎实的基本功 445
13.1.1快速的输入能力 445
13.1.2编程实现能力 447
13.1.3快速排错 447
13.2程序开发之前 448
13.2.1分析软件的组件模型 448
13.2.2建立软件的数据模型 451
13.3弄清程序的具体实现 452
13.3.1各组件如何通信 452
13.3.2人机交互的实现 454
13.3.3复杂算法的分析 457
13.4编写开发文档 459
13.4.1绘制建模图、流程图 460
13.4.2提供简要说明 461
13.4.3编写伪码实现 462
13.5编码实现和开发心态 462
13.5.1开发是复杂的 462
13.5.2开发过程是漫长的 463
13.6小结 463
第14课 程序调试 464
14.1程序的可调试性 465
14.1.1增加注释 465
14.1.2使用log 466
14.2程序调试的基本方法 474
14.2.1借助编译器的代码审查 475
14.2.2跟踪程序执行流程 477
14.2.3断点调试 479
14.2.4隔离调试 481
14.2.5错误重现 482
14.3记录常见错误 484
14.3.1常见异常可能的错误原因 485
14.3.2常见运行时异常可能的错误原因 486
14.4程序调试的整体思路 488
14.4.1分段调试 488
14.4.2分模块调试 490
14.5调试心态 490
14.5.1谁都会出错 490
14.5.2调试比写程序更费时 491
14.6小结 491
第15课 使用lDE工具 492
15.1何时开始利用IDE工具 493
15.2IDE工具概述 494
15.2.1 lDE工具的基本功能 495
15.2.2常见的Java lDE工具 497
15.3项目管理 499
15.3.1建立项目 499
15.3.2自动编译 504
15.3.3自动部署、运行 504
15.4代码管理 505
15.4.1向导式的代码生成 506
15.4.2代码生成器 508
15.4.3代码提示 509
15.4.4自动代码补齐 510
15.4.5实时错误提示 510
15.5项目调试 511
15.5.1设置断点 512
15.5.2单步调试 514
15.5.3步入、步出 514
15.6团队协作功能 516
作为版本控制工具的客户端 516
15.7小结 519
第16课 软件测试 520
16.1软件测试概述 521
16.1.1软件测试的概念和目的 521
16.1.2软件测试的分类 523
16.1.3开发活动和测试活动 524
16.1.4常见的Bug管理工具 524
16.2单元测试 525
16.2.1单元测试概述 525
16.2.2单元测试的逻辑覆盖 527
16.2.3 JUnit介绍 530
16.2.4 JUnit的用法 531
16.3系统测试和自动化测试 538
16.3.1系统测试概述 538
16.3.2自动化测试 539
16.3.3常见自动化测试工具 540
16.4性能测试 541
16.4.1性能测试概述 541
16.4.2性能测试的相关概念 542
16.4.3常见性能测试工具 543
16.5小结 544