第一部分 Java语言 2
第1章 Java编程基础 2
1.1计算基础 3
1.1.1计算机的硬件组成 3
1.1.2位、字节和二进制 4
1.1.3操作系统 5
1.2程序 5
1.3编程语言 6
1.4 Java语言 7
1.4.1 Java的起源 7
1.4.2 Java对互联网的贡献 9
1.4.3 Java applet 9
1.4.4安全性 9
1.4.5可移植性 9
1.4.6 Java的解决方案:字节码 10
1.4.7 Java的演进 10
1.5面向对象编程的关键特性 11
1.5.1封装 12
1.5.2多态 12
1.5.3继承 13
1.6 Java开发工具包 13
1.7第一个简单的程序 14
1.7.1输入程序 15
1.7.2编译程序 15
1.7.3运行程序 15
1.7.4逐行解析第一个简单的程序 16
1.8处理语法错误 18
1.9第二个简单的程序 18
1.10另一种数据类型 20
1.11两种控制语句 23
1.11.1 if语句 23
1.11.2 for循环 25
1.12创建代码块 26
1.13分号和语句的位置 27
1.14关于缩进 28
1.15 Java关键字 30
1.16 Java中的标识符 30
1.17 Java类库 31
1.18习题 32
第2章 数据类型和运算符 34
2.1为什么数据类型很重要 34
2.2 Java的基本数据类型 34
2.2.1整数 35
2.2.2浮点类型 36
2.2.3字符 37
2.2.4布尔类型 38
2.3字面量 40
2.3.1十六进制、八进制和二进制字面量 41
2.3.2转义字符序列 41
2.3.3字符串字面量 42
2.4深入解析变量 43
2.4.1初始化变量 43
2.4.2动态初始化 44
2.5变量的作用域和生命周期 44
2.6运算符 47
2.7算术运算符 47
2.8关系运算符和逻辑运算符 49
2.9具有“短路”功能的逻辑运算符 50
2.10赋值运算符 52
2.11速记赋值运算符 53
2.12赋值中的类型转换 53
2.13使用强制类型转换 55
2.14运算符的优先级 56
2.15 表达式 58
2.15.1表达式中的类型转换 58
2.15.2空白和圆括号 60
2.16习题 60
第3章 程序控制语句 63
3.1从键盘输入字符 63
3.2 if语句 65
3.3嵌套的if语句 66
3.4 if-else-if梯队 67
3.5 switch语句 68
3.6嵌套的switch语句 71
3.7 for循环 74
3.8 for循环中的一些特殊情况 76
3.8.1缺少部分 76
3.8.2无限循环 77
3.8.3没有循环体的循环 78
3.9在for语句内部声明循环控制变量 78
3.10增强的for循环 79
3.11 while循环 80
3.12 do-while循环 81
3.13使用break语句退出循环 86
3.14像使用goto语句一样使用break语句 88
3.15 使用continue语句 91
3.16嵌套的循环 96
3.17习题 97
第4章 类、对象和方法初探 100
4.1类的基础知识 100
4.1.1类的一般形式 101
4.1.2定义类 101
4.2如何创建对象 104
4.3变量引用和赋值语句 105
4.4方法 106
4.5从方法返回 108
4.6返回值 109
4.7使用形参 111
4.8构造函数 119
4.9含有形参的构造函数 120
4.10 new运算符再探 123
4.11垃圾回收和终结器 123
4.12使用this关键字 126
4.13习题 128
第5章 更多数据类型和运算符 131
5.1数组 131
5.2多维数组 136
5.2.1二维数组 136
5.2.2不规则数组 137
5.2.3三维或多维数组 139
5.2.4初始化多维数组 139
5.3其他声明数组的语法 140
5.4对数组的引用赋值 141
5.5使用成员length 142
5.6 for-each风格的for循环 149
5.6.1遍历多维数组 152
5.6.2应用增强for循环 153
5.7字符串 154
5.7.1构造字符串 154
5.7.2操作字符串 155
5.7.3字符串数组 156
5.7.4字符串是不可改变的 157
5.7.5使用字符串控制switch语句 158
5.8使用命令行参数 159
5.9按位运算 161
5.9.1按位与、按位或、按位异或、按位非运算符 161
5.9.2移位运算符 165
5.9.3位速记赋值运算符 167
5.10问号运算符 170
5.11习题 171
第6章 深入解析类和方法 174
6.1控制对类成员的访问 174
6.2向方法传递对象 180
6.3如何传递实参 181
6.4返回对象 183
6.5重载方法 185
6.6重载构造函数 189
6.7递归 195
6.8理解关键字static 199
6.8.1静态变量 199
6.8.2静态方法 201
6.8.3静态代码块 203
6.9嵌套类和内部类 207
6.10长度可变的实参vararg 210
6.10.1 vararg基础 210
6.10.2重载varargs方法 213
6.10.3 vararg和二义性 214
6.11习题 215
第7章 继承 220
7.1继承基础 220
7.2成员访问和继承 223
7.3构造函数和继承 226
7.4用super关键字调用超类的构造函数 227
7.5用super关键字访问超类成员 232
7.6创建多层层次结构 235
7.7执行构造函数的时机 238
7.8超类引用与子类对象 239
7.9方法重写 244
7.10用重写方法支持多态 246
7.11为什么要重写方法 248
7.12使用抽象类 252
7.13使用final关键字 256
7.13.1用final关键字防止方法重写 256
7.13.2用final关键字防止继承 257
7.13.3对数据成员使用final关键字 257
7.14 Object类 258
7.15习题 259
第8章 接口 261
8.1接口的基础知识 261
8.2创建接口 262
8.3实现接口 263
8.4使用接口引用 266
8.5实现多个接口 268
8.6接口中的常量 276
8.7可扩展的接口 277
8.8嵌套的接口 278
8.9关于接口的最后思考 279
8.10习题 279
第9章 包 281
9.1包的基础知识 281
9.1.1定义包 282
9.1.2寻找包与环境变量CLASSPATH 282
9.1.3一个短小的包例子 283
9.2包与成员访问 284
9.2.1一个包访问的例子 285
9.2.2受保护的成员 287
9.3导入包 289
9.4静态导入 293
9.5习题 295
第10章 异常处理 298
10.1异常层次结构 298
10.2异常处理基础 299
10.2.1使用关键字try和catch 299
10.2.2一个简单的异常处理例子 300
10.3未捕获异常的后果 302
10.4异常可以优雅地处理错误 303
10.5使用多个catch子句 305
10.6捕获子类异常 306
10.7嵌套的try块 307
10.8抛出异常 309
10.9进一步解读Throwable类 311
10.10使用finally块 312
10.11使用throws关键字 314
10.12 Java的内置异常 315
10.13 JDK 7中新添加的异常特性 317
10.14创建异常子类 319
10.15习题 325
第11章 使用输入/输出 329
11.1 Java的输入/输出是建立在流上的 330
11.2字节流和字符流 330
11.3字节流类 330
11.4字符流类 331
11.5预定义的流 331
11.6使用字节流 332
11.6.1读控制台输入 333
11.6.2写控制台输出 334
11.7使用字节流读写文件 335
11.7.1从文件中输入 335
11.7.2写文件 339
11.8自动关闭文件 340
11.9读写二进制数据 343
11.10随机访问文件 347
11.11使用Java字符流 350
11.11.1用控制台获得字符流输入 351
11.11.2使用字符流进行控制台输出 353
11.12使用字符流进行文件输入/输出 354
11.12.1使用FileWriter类 355
11.12.2使用FileReader类 356
11.12.3 File类 357
11.12.4获得文件属性 357
11.12.5获得目录列表 359
11.12.6使用FilenameFilter接口 360
11.12.7 listFiles()方法 361
11.12.8多种文件实用方法 361
11.13使用Java的类型包装器来转换数值字符串 363
11.14习题 371
第12章 多线程编程 375
12.1多线程基础 375
12.2 Thread类和Runnable接口 376
12.3创建线程 376
12.4创建多个线程 384
12.5判定线程终止的时间 386
12.6线程的优先级 389
12.7同步 390
12.8使用同步方法 390
12.9 synchronized语句 393
12.10使用方法notify()、wait()和notifyAll()进行线程通信 396
12.11线程挂起、恢复和终止 402
12.12习题 406
第13章 枚举、自动装箱和注解 410
13.1枚举 410
13.2 Java的枚举是类类型 413
13.3 values()方法和valueOf()方法 413
13.4构造函数、方法、实例变量和枚举 415
13.5从Enum类继承枚举 416
13.6自动装箱 423
13.6.1类型包装器和装箱 424
13.6.2自动装箱基础 425
13.6.3装箱与方法 426
13.6.4表达式中的自动装箱和自动拆箱 427
13.6.5警告 429
13.7注解(元数据) 430
13.7.1创建和使用注解 430
13.7.2内置注解 431
13.8习题 432
第14章 泛型 436
14.1泛型基础 436
14.1.1一个简单的泛型例子 437
14.1.2泛型只能用于对象 440
14.1.3基于不同类型实参的不同泛型类型 440
14.1.4有两个类型形参的泛型类 441
14.1.5泛型类的一般形式 442
14.2有界的类型 443
14.3使用有通配符的实参 446
14.4有界的通配符 449
14.5泛型方法 452
14.6泛型构造函数 454
14.7泛型的类层次结构 454
14.8泛型接口 458
14.9原始类型和遗留代码 464
14.10带有菱形运算符的类型推断 467
14.11清除 468
14.12二义性错误 469
14.13泛型的一些限制 470
14.13.1不能实例化类型形参 470
14.13.2对静态成员的限制 470
14.13.3泛型数组的限制 470
14.13.4泛型异常的限制 471
14.14习题 472
第15章 applet与剩余的Java关键字 475
15.1 applet基础 475
15.2 applet的完整骨架 478
15.3 applet的初始化和终止 479
15.4 applet架构的关键点 480
15.5请求重绘 480
15.6使用状态窗口 485
15.7向applet传递形参 486
15.8剩余的Java关键字 488
15.8.1修饰符volatile 488
15.8.2修饰符transient 488
15.8.3关键字instanceof 488
15.8.4关键字strictfp 489
15.8.5关键字assert 489
15.8.6原生方法 489
15.9习题 491
第16章 面向对象设计介绍 493
16.1优雅的软件及其重要性 493
16.2优雅的方法 496
16.2.1命名约定 497
16.2.2方法的内聚 497
16.2.3形式良好的对象 499
16.2.4内部文档 500
16.2.5外部文档 501
16.3优雅的类 503
16.3.1类的内聚和专家模式 503
16.3.2避免重复 505
16.3.3完整的接口 507
16.3.4设计时要考虑变化 507
16.3.5最少知识原则 510
16.4继承与委托的比较 511
16.4.1 UML类图 512
16.4.2从代码重用的角度看 513
16.4.3 is-a关系 514
16.4.4类似的行为 516
16.4.5多态 518
16.4.6继承的代价 519
16.5设计模式 521
16.5.1适配者模式 522
16.5.2观察者模式 525
16.6习题 529
第二部分 利用Swing工具箱进行GUI编程 534
第17章 Swing基础 534
17.1 Swing的起源和设计理念 534
17.2组件和容器 536
17.2.1组件 536
17.2.2容器 537
17.2.3顶级容器窗格 537
17.3布局管理器 538
17.4第一个简单的Swing程序 539
17.5事件处理 544
17.5.1事件 544
17.5.2事件源 544
17.5.3事件侦听器 545
17.5.4事件类和侦听器接口 545
17.5.5适配器类 546
17.6使用按钮 547
17.7 JTextField类介绍 554
17.8使用匿名内部类来处理事件 564
17.9习题 565
第18章 探索Swing控件 567
18.1JLabel类和Imagelcon类 567
18.2 Swing按钮 570
18.2.1处理动作事件 571
18.2.2处理项事件 571
18.2.3 JButton类 572
18.2.4 JToggleButton类 574
18.2.5复选框 576
18.2.6单选按钮 579
18.3 JTextField类 581
18.4 JScrollPane类 590
18.5JList类 597
18.6 JComboBox类 601
18.7树 603
18.8 JTable类 606
18.9模型简介 609
18.10习题 609
第19章 使用菜单 612
19.1菜单基础 612
19.2 JMenuBar类、JMenu类和JMenuItem类概览 613
19.2.1 JMenuBar类 613
19.2.2 JMenu类 614
19.2.3 JMenuItem类 615
19.3创建主菜单 616
19.4为菜单项添加助记键和快捷键 620
19.5为菜单项添加图像和工具提示 622
19.6使用JRadioButtonMenultem类和JCheckBoxMenuItem类 629
19.7习题 632
第20章 对话框 634
20.1 JOptionPane类 634
20.2 showMessageDialog()方法 636
20.3 showConfimDialog()方法 640
20.4 showInputDialog()方法 644
20.5 showOptionDialog()方法 648
20.6 JDialog类 652
20.7创建无模式的对话框 656
20.8用JFileChooser类选择文件 657
20.9习题 667
第21章 线程、applet和绘图 670
21.1 Swing中的多线程 670
21.2使用Timer类 676
21.3创建Swing的applet 681
21.4绘图 689
21.4.1绘图基础 689
21.4.2图形上下文 689
21.4.3计算可绘图区域 690
21.4.4请求绘图 691
21.4.5绘图的例子 691
21.5习题 695
第三部分 畅游Java API库 698
第22章 处理字符串 698
22.1字符串的基础知识 698
22.2字符串的构造函数 699
22.3三个与字符串有关的语言特性 701
22.3.1字符串字面量 701
22.3.2字符串拼接 702
22.3.3字符串与其他数据类型拼接 702
22.3.4重写toString()方法 703
22.4 length()方法 707
22.5获得字符串中的字符 708
22.5.1 charAt()方法 708
22.5.2 getChars()方法 708
22.5.3 toCharArray()方法 709
22.6字符串比较 710
22.6.1 equals()方法和equalslgnoreCase()方法 710
22.6.2 equals()方法与“=”运算符的比较 711
22.6.3 regionMatches()方法 712
22.6.4 startsWith()方法和endsWith()方法 712
22.6.5 compareTo()方法和compareToIgnoreCase()方法 713
22.7使用indexOf()方法和lastIndexOf()方法 715
22.8获得修改的字符串 716
22.8.1 substring()方法 716
22.8.2 replace()方法 718
22.8.3 trim()方法 719
22.9改变字符串中字符的大小写 720
22.10 StringBuffer类和StringBuilder类 722
22.11习题 723
第23章 探索java.lang包 725
23.1基本类型包装器 726
23.1.1 Number类 726
23.1.2 Double类和Float类 726
23.1.3 Byte类、Short类、Integer类和Long类 728
23.1.4 Character类 731
23.1.5 Boolean类 734
23.1.6自动装箱和类型包装器 734
23.2 Math类 735
23.3 Process类 738
23.4 ProcessBuilder类 738
23.5 Runtime类 740
23.6 System类 742
23.6.1使用currentTimeMillis()方法测量程序执行的时间 743
23.6.2使用arraycopy()方法 744
23.6.3获得属性值 744
23.6.4重定向标准输入流和标准输出流 745
23.7 Object类 746
23.8 Class类 747
23.9 Enum类 749
23.10与线程有关的类和Runnable接口 749
23.11其他类 749
23.12 java.lang包中的接口 750
23.12.1 Comparable接口 750
23.12.2 Appendable接口 752
23.12.3 Iterable接口 752
23.12.4 Readable接口 753
23.12.5 CharSequence接口 753
23.12.6 AutoCloseable接口 753
23.13习题 754
第24章 探索java.util包 756
24.1 Locale类 757
24.2使用日期和时间 760
24.2.1 Date类 760
24.2.2 Calendar类和GregorianCalendar类 761
24.3用Formatter类格式化输出 766
24.3.1 Formatter类的构造函数 766
24.3.2格式化基础 768
24.3.3格式化字符串和字符 769
24.3.4格式化数字 769
24.3.5格式化日期和时间 770
24.3.6说明符和说明符% 772
24.3.7指定最小的域宽度 772
24.3.8指定精度 773
24.3.9使用格式标志 774
24.3.10大写字母选项 776
24.3.11使用实参索引 777
24.3.12为不同的地区设置格式化 778
24.3.13关闭Formatter对象 778
24.4格式化和printf()方法 781
24.5 Scanner类 783
24.5.1 Scanner类的构造函数 783
24.5.2 Scanner类的基础知识 783
24.5.3 Scanner类的例子 785
24.5.4 Scanner类的其他特性 789
24.6 Random类 790
24.7使用Observable类和Observer接口 792
24.8 Timer类和TimerTask类 795
24.9其他混杂的应用类和接口 797
24.10习题 798
第25章 使用集合框架中的数据结构 800
25.1数据结构概览 800
25.1.1栈和队列 801
25.1.2链表 801
25.1.3树 802
25.1.4散列表 803
25.1.5选择数据结构 803
25.2集合概览 804
25.3集合接口 805
25.3.1 Collection接口 806
25.3.2 List接口 807
25.3.3 Set接口 808
25.3.4 SortedSet接口 809
25.3.5 NavigableSet接口 809
25.3.6 Queue接口 810
25.3.7 Deque接口 811
25.4集合类 813
25.4.1 ArrayList类 814
25.4.2 LinkedList类 817
25.4.3 HashSet类 820
25.4.4 TreeSet类 822
25.4.5 LinkedHashSet类 824
25.4.6 ArrayDeque类 825
25.4.7 PriorityQueue类 827
25.5通过迭代器访问集合 828
25.5.1使用迭代器 829
25.5.2用for-each风格的循环代替迭代器 831
25.6使用映射 832
25.6.1映射接口 832
25.6.2映射类 835
25.7比较器 840
25.8集合算法 842
25.9 Arrays类 845
25.10遗留类和遗留接口 846
25.10.1 Enumeration接口 846
25.10.2 Vector类 846
25.10.3 Stack类 846
25.10.4 Dictionary类 846
25.10.5 Hashtable类 846
25.10.6 Properties类 847
25.11习题 847
第26章 使用java.net包进行网络编程 849
26.1网络基础 849
26.2网络类和网络接口 850
26.3 InetAddress类 851
26.4 Socket类 853
26.5 URL类 856
26.6 URLConnection类 858
26.7 HttpURLConnection类 862
26.8数据报 865
26.8.1 DatagramSocket类 865
26.8.2 DatagramPacket类 865
26.8.3数据报的例子 866
26.9习题 869
第27章 并发实用工具 870
27.1并发API包 871
27.1.1 java.util.concurrent包 871
27.1.2 java.util.concurrent.atomic包 872
27.1.3 java.util.concurrent.locks包 872
27.2使用同步对象 872
27.2.1 Semaphore类 872
27.2.2 CountDownLatch类 876
27.2.3 CyclicBarrier类 878
27.2.4 Exchanger类 881
27.2.5 Phaser类 883
27.3使用执行器 890
27.4使用Callable接口和Future接口 892
27.5 TimeUnit枚举 895
27.6并发集合 896
27.7锁 897
27.8原子操作 900
27.9通过Fork/Join框架并行编程 900
27.10主要的Fork/Join类 901
27.10.1 ForkJoinTask﹤V﹥类 901
27.10.2 RecursiveAction类 902
27.10.3 RecursiveTask﹤V﹥类 902
27.10.4 ForkJoinPool类 903
27.11分治策略 904
27.11.1第一个简单的Fork/Join示例 904
27.11.2理解并行度的影响 906
27.11.3使用RecursiveTask﹤V﹥类的一个例子 910
27.11.4异步执行任务 912
27.12并发实用工具与Java的传统方法的比较 912
27.13习题 913
附录A 使用Java文档注释 915
附录B 正则表达式介绍 921
附录C 部分习题的参考答案 928