谜题: 下面的程序打印出什么? private static void abc(){ String letters = "ABC"; char[] numbers = {'1', '2', '3'}; System.out.println(letters + "easy as" + numbers); } 1.String.valueOf(char[])
谜题: 下面的程序打印出什么? private static void lastLaugh01(){ System.out.println("H" + "a"); System.out.println('H' + 'a'); } 1.StringBuilder sb = new StringBuilder(); sb.append('H'); sb.append('a'); System.out.println(sb.toString()); 2.System.out.println("" + 'H' + 'a'); 3.System.out.printf("%c%c", 'H' ...
谜题: 给出变量x和i的声明使x = x + i合法但是x += i非法。 1.复合赋值操作符要求两个操作数都是基本类型或者是基本类型的包装类型。有个特例:当+=的左操作数位String时,那么允许右侧的操作数是任意类型。 2.简单赋值操作数允许左操作数是对象引用类型。 谜底: Object x = "ck"; String i = "ck"; x = x + i; // 合法 x += i; // 非法
谜题: 给一个变量x和i的声明,使得 x += i; 合法但是 x = x + i;不合法。 1.复合赋值E1 op= E2等价于简单赋值E1 = (T)(E1 op E2), 其中T是E1的类型,除非E1只被计算一次。也就是说:复合赋值表达式自动地将所执行计算的结果转型为其左侧变量的类型。或者说复合赋值表达式不会产生类型提升。 2.复合类型会悄悄的产生一个转型,请不要将复合类型操作符作用于byte,short,char类型的变量。 谜底: int i = 10; short x += i; // 合法 short x = x + i; // 将int型的值赋给short型,非法
谜题: 下面的程序打印什么? private static void dosEquis(){ char x = 'X'; int i = 15; System.out.println(true ? x : 0); System.out.println(false ? i : x); } 1.混合类型的计算会引起混乱,这一点在条件表达式里面尤其明显。 2.条件表达式结果类型的确定: a>如果第二个,第三个操作数具有相同的类型,那么它就是条件表达式结果的类型。 b>如果一个操作数的类型是T, T表示byte, short或者char, 而另一个操作数是int类型的常量表达式, ...
谜题: 下面程序使用了复合的异或赋值操作符想不使用临时变量来交换两个变量的值,它所展示的技术是一种编程习惯。它将会打印什么? private static void cleverSwap01(){ int x = 1984; // 0x7c0 int y = 2001; // 0x7d1 x ^= y ^= x ^= y; System.out.println("x = " + x); System.out.println("y = " + y); } 1.操作符的操作数是从左向右求值的。也就是说为求表达式x ^= expr的值,要在计算x之前提取x的值。 2.依 ...
谜题: 下面的程序打印什么? private static void multicast(){ System.out.println((int)(char)(byte)-1); } 1.执行步骤: a>-1的补码为32个1,强转为byte型,截取高24位,只保留低8位。 b>byte有符号,强转为char为带符号位扩展,16位均为1。 c>char无符号,强转为int为无符号位扩展,这时int类型的值为高16位均为0,低16为均位1。 2.这样的程序的执行结果严重依赖于转型的符号扩展行为。极为不好的做法,如果需要用到这种转型,那么也应该清楚的表明意图。如下: a>将char的c ...
谜题: 下面的程序打印什么? private static void joyOfHex01(){ System.out.println(Long.toHexString(0x100000000L + 0xcafebabe)); } 1.十六进制和八进制的字面常量的正负是由最高位决定的,而不向十进制字面常量是显式设置的。 2.混合类型的计算,若被扩充类型位是有符号类型的则带符号扩充,否则无符号扩充。 3.混合类型的计算可能会引起混淆,尤其需要注意的是十六进制和八进制字面常量无显式表示正负。 正确方法: private static void joyOfHex01(){ ...
谜题: 下面的程序打印什么? private static void elementary01(){ System.out.println(12345 + 5432l); } 1.相当的恶心,但是必须谨记:在long类型的字面常量里,一定要用大写的L。 2.要避免用单个的l作为变量名。 正确方法: private static void elementary01(){ System.out.println(12345 + 5432L); }
谜题: 下面的程序将打印什么? private static void longDivision(){ final long MICROS_PRE_DAY = 24 * 60 * 60 * 1000 * 1000; final long MILLIS_PRE_DAY = 24 * 60 * 60 * 1000; System.out.println(MICROS_PRE_DAY/MILLIS_PRE_DAY); } 1.执行步骤: a>用int类型进行计算(虽然它们都被定义成了long类型),计算的过程中就已经溢出了,这是问题的关键。 b>将计算得到的int类 ...
谜题:应付1.1元,给你2元,找我0.9元。 private static void change00(){ System.out.println("2.00 - 1.10 = " + (2.00 - 1.10)); } 1.并不是所以浮点数都可以用二进制浮点数精确表示的。它不可能将0.1或者10的其他任何次负幂精确表示成一个有限长度的二进制小数。但是2.00 - 0.01可以得到1.99???? 2.在需要精确答案的地方,要避免使用float和double,对于货币计算,要使用int,long或者BigDecimal。 正确方法: 之一:实际问题中进行单位换算: private ...
谜题:下面判断整数是否为奇数的方法是否正确: private static boolean isOdd00(int i){ return i % 2 == 1; } 1.java中对%的定义如下: a%b = a - (a/b)*b, 可以看出:当取余操作返回一个非零的结果时,它的符号和左操作数相同。所以上述方法在25%的时间里返回错误的结果。 正确方法: 之一:用相反的比较含义 private static boolean isOdd01(int i){ return i % 2 != 0; } 之二: private static boolean isOdd02(int ...