1.2 基本数据类型 Q. 为什么 -0/3 结果是 0,而 -0.0/3.0 结果是 -0.0?(注意后边的结果0带负号) A. 在Java里,整数是用补码表示的。在补码中0只有一种表示方法。另一方面,浮点数则是用 IEEE 标准表示的, 对于0有两种表示方法, 0 和 -0。 Q. 我可以用 % 除以一个小数吗? A. 当然可以。比如,如果 angle 是一个非负数,那么 angle % (2 * Math.PI) 就会把 angle 转换到 0 到 2 π 之间。 Q. 当 a b 都是基本类型变量时,a += b 和 a = a + b 的效果有区别吗? A. 当 a 和 b 的类型不同时,那两条语句的效果就可能有区别。 a += b 等同于 a = (int) (a + b),这种情况下可以是 a是int型,b是float型。但是同等情况下 a = a + b 就会编译报错。
1.3 条件语句和循环语句 Q. 为什么判断字符串相等不能使用 == ? A. 这反映了基础类型(int, double, boolean)和引用类型(String)的区别。 Q. 有没有在什么情况下,一条语句块的花括号不能省略的? A. 在下面的例子中,第一段代码是合法的,第二段代码会引发编译错误。从技术角度说,那一条语句是一个变量声明,而不是语句,所以会报错。 - // legal
- for (int i = 0; i <= N; i++) {
- int x = 5;
- }
-
- // illegal
- for (int i = 0; i <= N; i++)
- int x = 5;
Q. 在下面的两段代码里,有没有情况,它们的效果不一样? - for (<init stmnt> <boolean expr>; <incr stmnt>) {
- <body statements>
- }
-
- <init stmnt>;
- while (<boolean expr>) {
- <body statements>
- <incr stmnt>
- }
A. 有的。如果在循环块里使用 continue 语句。在for的代码里,计数器会加一;而在while的代码里,因为被continue略过了,计数器不加一。
1.4 数组 Q. 某些Java开发人员使用 int a[] 而不是 int[] a 去声明一个数组。这两者有什么区别? A. 在Java中这两种用法都是合法的,他们的作用都是一样的。前者是在C中的定义数组的方法。后者是JAVA推荐的方法,因为它的写法 int[] 更能表明这是一个 int 的数组。 Q. 为什么数组下标从0 开始 而不是从 1 开始? A. 这种传统起源于机器语言的编程方法。在机器语言中,数组下标被用来计算元素位置与第一个元素之间的偏移量。如果从1开始的话,计算偏移时还需要做一次减法运算,那是种浪费。 Q. 如果我用 负数 作为数组下标会发生什么事? A. 下标小于0 或者 大于等于数组长度,JAVA运行时会抛出 ArrayIndexOutOfBoundsException 异常,并且中止程序运行。 Q. 使用数组时还有其他需要注意的陷阱吗? A. 需要记住,JAVA在你创建一个数组时会去初始化它,所以声明一个数组需要 O(N)的时间。 Q. 既然 a[] 是一个数组,为什么 System.out.println(a) 会打印出一个16进制的数,就像 @f62373 这样,而不是打印出数组的元素? A. 好问题。这条语句打印出的是 数组在内存中的地址,不幸的是,在绝大多数情况下,这不是你需要的。
|