对于希望精通Java编程语言复杂细节的应用程序员来说,本书是一本全面的参考书,内容详尽,深入浅出。本书彻底地讲述了Java编程语言和Java虚拟机(JVM)的核心细节,使读者能够有效地深入理解Java平台。
基于Java语言规范的第二版和Java虚拟机规范,本书以更加友好的教程风格,展现了这些规范的一个子集。 从平台基础到API,这本百科全书式的指南全面地展示了Java语言的方方面面——包括以前没有文档化的一些特性。实用的指导遍布全书,都由官方的语言文档或权威技术领导者们的真知灼见所支持。
独特的编排、对话式的风格,使本书成为对Java语言有一定了解,寻求精通捷径的程序员的理想读物。
译者序
前言
关于本书
Java传统
第1章 词法结构
1.1 简介
1.2 空白
1.2.1 缩进
1.3 注释
1.3.1 注释掉大块代码
1.4 标识符
1.4.1 Java命名惯例
1.5 关键字
1.6 直接量
1.6.1 字符直接量
1.6.2 转义序列
1.6.3 字符串直接量
1.6.4 数值直接量
1.6.5 类直接量
1.7 分隔符
1.8 操作符
第2章 编译单元
2.1 引言
2.2 类体声明中的术语
2.2.1 Java中对成员变量的定义
2.2.2 在源代码中识别构造方法
2.3 编译单元的剖析
2.3.1 专用初始化方法
2.3.2 原文顺序
2.3.3 惟一public包成员的限制
2.4 包声明
2.4.1 包名
2.4.2 包的成员
2.4.3 使用SDK创建包
2.5 导入声明
2.5.1 自动导入
2.5.2 冗余导入
2.5.3 各种嵌套类的导入(顶层类或内部类)
2.5.4 编译器对导入语句的解析
2.5.5 按需类型导入声明的效能
2.6 类型声明
2.6.1 类的类型声明
2.6.2 接口类型声明
2.7 顶层类的定义
2.8 辅助类并没有根本性的不同
2.8.1 不使用辅助类的技术争论
2.9 类和接口的五种分类
2.9.1 public的顶层类
2.9.2 非public的成员类
2.9.3 局部类和匿名类
2.9.4 嵌套的接口
2.10 选择使用不同类型的类
2.10.1 从VectorEnumerator到匿名类
2.11 容器和内部类层次的基本原理
2.12 容器和内部类层次
2.12.1 容器层次
2.12.2 内部类层次
第3章 static修饰符.this和super
3.1 简介
3.2 static修饰符
3.2.1 static成员变量
3.2.2 static方法
3.2.3 static类
3.3 static上下文的定义
3.3.1 内部类层次中的static上下文
3.4 this和super关键字
3.4.1 当前对象(this)
3.4.2 直接超类(super)
3.5 this和super关键字的实际用法
3.5.1 使用super引用不同的包中的成员
3.6 多个当前实例 (又名层级)
3.6.1 深度嵌套类型的一个注意事项
3.6.2 限定this关键字
3.6.3 限定new关键字
3.6.4 限定super关键字
第4章 原始数据类型和Object类
4.1 简介
4.2 数据类型定义
4.2.1 作为数值集的数据类型
4.2.2 面向对象的类型定义
4.3 数值(Numeric)数据类型
4.3.1 整数类型
4.3.2 浮点类型
4.3.3 理解浮点类型
4.4 字符(char)数据类型
4.5 布尔(boolean)数据类型
4.6 空(null)类型
4.7 Number类
4.8 java.math包
4.8.1 BigInteger类
4.8.2 BigDecimal类
4.9 货币计算
4.9.1 不精确的结果和比较运算符
4.9.2 浮点操作结果凑整
4.9.3 用整数类型存储货币值
4.10 原始数据类型的包装器(Wrapper)类
4.10.1 字符串的基本类型值解析
4.10.2 把原始数值类型转换成字符串
4.10.3 位模式操作
4.10.4 访问原始数据类型的系统属性
4.10.5 Unicode工具方法
4.11 Object类
4.11.1 引用相等vs.等价关系
4.11.2 解散列表(Hash Table)
4.11.3 五个内务(Housekeeping)方法
4.12 比较方法
4.12.1 什么是默认顺序?
4.12.2 什么是自然顺序?
4.12.3 倒序(递减)排序
4.12.4 根据一个以上的成员变量排序
4.12.5 Comparable接口
4.12.6 Comparator接口
第5章 字符串和其他通用数据类型
5.1 简介
5.2 可以进行修改操作的方法
5.3 String或StringBuffer的长度
5.4 StringBuffer的容量
5.4.1 StringBuffer容量的确定
5.5 String索引
5.5.1 String和StringBuffer的右开区间
5.6 String和StringBuffer类中的已检查异常
5.7 String类
5.7.1 大小写映射
5.7.2 字符串比较
5.7.3 访问单个字符或子字符串
5.7.4 char[]和String之间的相互转换
5.7.5 转换本地编码的字符串
5.7.6 String类的杂项方法
5.7.7 String类中的特殊构造方法
5.8 StringBuffer类
5.8.1 重载的方法append和insert
5.8.2 StringBuffer类中的其他方法
5.9 其他和字符串相关的类
5.9.1 StringCharacterIterator类
5.9.2 StringReader和StringWriter类
5.10 词法分析
5.10.1 BreakIterator类
5.10.2 StringTokenizer类
5.10.3 StreamTokenizer类
5.11 字符串连接操作
5.11.1 重载的二元+操作符的一个注意事项
5.11.2 隐含的字符串转换
5.11.3 内置机制
5.11.4 共享字符缓冲区
5.12 在应用平台上显示诊断信息
5.12.1 标准I/O
5.12.2 输出和println方法
5.13 Locale类
5.13.1 默认的区域
5.13.2 能够支持的区域
5.14 Date类
5.14.1 日期比较
5.15 Gregorian Calendar类
5.15.1 实例化GregorianCalendar类
5.15.2 矛盾的成员变量优先规则
5.15.3 最大DAY_OF_MONTH规则
5.16 Calendar类中的日期和时间成员变量
5.16.1 日期和时间成员变量的标准默认值
5.16.2 格式化日期和时间成员变量
5.16.3 日期和时间成员变量的操作方法
5.17 TimeZone类
5.18 理解i 18n和l 10n的不同
5.19 通用数据类型的本地化过程
5.19.1 数字的格式化
5.19.2 格式化日期和时间
第6章 数组和集合框架
6.1 介绍
6.2 数组.组件和元素类型
6.3 数组
6.3.1 for循环的标准格式
6.3.2 数组类是动态创建的
6.3.3 数组类型的成员
6.3.4 数组类型变量声明
6.3.5 初始化数组类型变量
6.3.6 数组访问表达式
6.4 忧愁河上的桥(toArray方法)
6.5 无类型引用和参数化类型
6.5.1 什么是运行时类型?
6.6 时间复杂性(或大-O表示法)
6.6.1 常数时间操作
6.6.2 折合常数时间
6.6.3 对数时间
6.6.4 线性时间
6.6.5 二次方时间
6.7 等价关系和元素
6.8 重复元素
6.8.1 用可变对象作为集的元素或映射的键
6.9 集合框架
6.9.1 批操作
6.9.2 最大普遍性原理
6.9.3 Collection接口
6.9.4 Map接口
6.9.5 容器的内务方法
6.10 通用实现
6.10.1 选择一个通用实现
6.10.2 通用实现的性能优化
6.11 专用实现
6.11.1 WeakHashMap
6.12 视图
6.12.1 同步视图
6.12.2 不可修改的视图
6.12.3 范围视图(子列表, 子集和子映射)
6.12.4 映射的集合视图
6.12.5 数组的列表视图
6.13 迭代器
6.13.1 列表迭代器
6.13.2 用集合视图迭代映射
6.13.3 笨人的集合
6.13.4 同步迭代器
6.13.5 fail-fast迭代器
6.13.6 用TreeSet或TreeMap向后迭代
6.14 Al-Khwarizmi是关于估算的印度艺术
6.15 Arrays和其他Collections的方法
6.15.1 集合排序
6.15.2 查找
6.15.3 克隆和拷贝容器
6.15.4 重组
6.15.5 填充
6.15.6 最小元素和最大元素
6.15.7 便利实现
6.15.8 数组的equals方法
6.16 核心集合接口的定制实现
6.16.1 抽象实现
6.16.2 可选操作
6.16.3 受限容器
6.16.4 标准构造方法
6.17 多映射和多维数组
6.17.1 多映射
6.17.2 多维数组
6.18 传统容器
本书已经持续写作了5年多的时间, 自1995年JDK 1. 0发布不久后即开始直到现在.
联姻Java规范
本书是基于JLS(Java Language Specification, Java语言规范)写作而成. 实际上, 我在开始写作此书时考虑将书名写为《应用程序员Java语言规范》. 然而, 此后不久我即意识到也应该包括JVMS(Java Virtual Machine Specification, Java虚拟机规范)的内容. 这个工作到后来就增长到包含大量的Java规范中的内容, 因为这些内容是那些主流的专职应用程序员感兴趣的, 这些规范包括第二版的JLS和JVMS.
读者对象
规范(specification)和本书的主要区别在于各自面向的读者不同. JVMS是为那些想实现一个JVM(Java Virtual Machine, Java虚拟机)的人写的, 而JLS是一个语法规范, 主要是为那些打算编写Java编译器的人写的, 例如IBM的jikes编译器团队(虽然这点并没有被广泛认同), 因此JLS包含了大量只能引起那些以神秘的编译器为生的程序员兴趣的内容. 这实在是很不幸的, 因为JLS实际上也包含了很多能让应用程序员感兴趣的信息, 但是这些内容很少出现在主流的Java书籍中. 这点对JVMS也同样成立. 本书提取了这些规范中各自有用的信息, 在必要的地方进行了详细说明, 并且以一种技术的写作风格呈现给那些主流的专职应用程序员.
主流的专职应用程序员是本书的读者对象, 我的意思是那些基层程序员, 他们中的大多数在硅谷以外的公司中. 他们是经验丰富的专职人员, 想以一种专业的水准学习Java语言. 这要求我们以这部分读者为重点, 也就是说主流专职应用程序员是我们所关注的对象. 他们专注于这个主题多年, 因此有强烈的学习动机.
更一般地讲, 本书适用于任何想掌握Java语言要素的程序员. 虽然形式和风格的标准迫使我将学生排除在读者的范围外, 但是我相信本书同样适用于教授Java语言(即便不作为主要教材, 也可以作为辅助参考读物).
致谢
我很高兴能借这个机会感谢那些参与本书编写. 出版的人. 18个月前, 送交Addison-Wesley(AW)进行技术评审的本书完全比不上现在展现在你面前的这本. 首先, 也是最主要的, 我想感谢技术评审人员, 特别是Stuart Halloway. 以下所列为本书的技术评审人员的列表(按姓氏排序):
Orson Alvarez
Simon Belanger
Robert Brenner
Carl Burnham
John R. Collins
Lisa Friendly
Stuart Halloway
Howard Lee Harkness
Christian Paquin
Gary Pavek
Moshe Sambol
Guy L. Steele, Jr.
Anton Stiglic
对于那些不愿公开身份的技术评审人, 我在此也一并对他们表示感谢.
然后是AW的编辑人员. AW的总编Mike Hendrickson将我和这本书从垃圾桶中拯救出来. Julie DiNicola和Heather Olszyk非常细致地协调了18个月的技术评审过程. 而Elizabeth Ryan是制作协调人. 能和他们一起工作是一件令人愉快的事情.
最后是Sue Stark. Sue是波士顿(Boston)的一名专业图书编辑, 也是第一个鼓励我完成这项工作的人. 在本书以电子版的形式在互联网上销售以前, Sue对其头三份草稿进行了通篇审读. Sue, 非常感谢你!
一些简短致谢:Don Box批准本书作为DevelopMentor系列的第一本Java书籍, Kenneth A.Dickey就有关数学的一些章节提供了意见, Mike Hedrick做了非常出色的审读工作, Darrell和Frank在本书的第一册出版前的几个月中给予了极大的帮助, 而Jeffrey Kesselman和Steve Wilson回答了Java高级内容讨论组中多个有关多线程(multi-threading)的问题, 该讨论组是Stuart Halloway为DevelopMentor组织的.