1、奇偶性
return (n % 2 == 1);
问对于int n, 上式可否判断n奇偶性?
刚开始,认为可以的,但其实是错误的,对于整数n对2取余, 结果有1, 0, -1。 所以如果说 return (n % 2 != 0) 这样完全是可以的
高效版本:return (n & 1) != 0;
2、浮点数的精度问题
System.out.println(2.00 - 1.10);
输出的结果是?
我已经想到结果不会是0.9, 或者0.90这样就没有必要写在java解惑上了
果然一运行,看到的是0.899999999999999999999(具体几个9忘了)
因为java不知道最后要保留几位小数。
按书上所说:
1)并不是所有的小数都可以用二进制浮点数精确标示
2)二进制浮点对于货币计算是非常不适合的
另外,需要注意的是“在需要精确答案的地方,要避免使用float和double, 对于货币计算, 要使用int, long, BigDecimal”
3、长整除
final long NUM_A = 24 * 60 * 60 * 1000 * 1000
final long NUM_B = 24 * 60 * 60 * 1000
问 NUM_A/NUM_b结果
一看不就是1000吗?但是仔细一看的话,24 60 1000都是int, 在NUM_A的运算过程中,已经超出int的范围而溢出了。
解决方法就是写成
final long NUM_A = 1L * 24 * 60 * 60 * 1000 * 1000
当然,1L的位置也有讲究的,运算是从左到右的,所以要再最开始就把运算转成long型的
另外对于 1L, 千万别写成1l, 虽然这两者对程序来讲是一样的。但小写的L容易与1混淆
问下面代码会做什么?
System.out.print("hello );
http://www.youkuaiyun.com;
System.out.println(" world");
这个问题比较简单,没有中计
第二行代码可以拆成:
http:
//www.youkuaiyun.com
这样就比较清楚了
23、不劳无获
StringBuffer sb = null;
Random r = new Random();
switch (r.nextInt(2)) {
case 1:
sb = new StringBuffer('A');
case 2:
sb = new StringBuffer('B');
default:
sb = new StringBuffer('C');
}
sb.append('D');
System.out.println(sb);
以上代码输出什么?
显然我注意到没有break, 所以我不会说答案不一定,但是我给的答案是输出CD。
但显然我还是错了, 对于StringBuffer(char) 这个构造方法, 跟进去后发现实际函数如下:
public StringBuffer(int capacity) {//实际调用的int形参, 没有传char的构造函数
super(capacity);
}
再跟进super():
AbstractStringBuilder(int capacity) {
value = new char[capacity];//看到这里就发现实际是开了char对应的int大小的空间, 我想当然的以为是把sb初始化为传进来的字符
}
24、尽情享受每一个字节
for(byte b = Byte.MIN_VALUE; b < Byte.MAX_VALUE; b++){
if(b == 0x90){
System.out.println("JOY!");
}
}
问上面代码打印上面?
对byte的范围我并不知道, 而且也不知道0x90的值是多少, 显然我不知道答案, 并且我以为考点在b < Byte.MAX_VALUE;上
所以我觉得当b和0x90相等时会打印JOY,且b到Byte.MAX_VALU时b++溢出, 所以这是一个死循环。
不过我错了题目中是小于号, 不是小于等于号。
根据书上的解释0x90超出了byte的范围, 所以并不会打印"JOY!"
25、无情的增量操作
int j = 0;
for(int i = 0; i < 100; i++){
j = j++;
}
问最后j等于多少?
书上说了一大堆, 只看懂了它的一个等价语句序列:
int tmp = j;
j = j + 1;
j = tmp;
所以最后j的值还是0
26、在循环中
int cnt = 0;
for(int i = Integer.MAX_VALUE - 10; i <= Integer.MAX_VALUE; i++){
cnt++;
}
System.out.println(cnt);
问打印什么?
这就像上面24中说的i 等于Integer.MAX_VALUE后i++, 溢出, 此时i等于Integer.MIN_VALUE, 其值还是小于等于Integer.MAX_VALUE,所以讲无法跳出for,即不会打印任何东西
-----------------------------------------------
先写这么多,都是书上的,用来备忘。。。