现在的位置: 首页 > 综合 > 正文

《java解惑》 笔记

2013年08月13日 ⁄ 综合 ⁄ 共 1984字 ⁄ 字号 评论关闭

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混淆

22、URL的愚弄

问下面代码会做什么?

System.out.print("hello );

http://www.csdn.net;

System.out.println(" world");

这个问题比较简单,没有中计

第二行代码可以拆成:

http:

 //www.csdn.net

这样就比较清楚了

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,即不会打印任何东西

-----------------------------------------------

先写这么多,都是书上的,用来备忘。。。

抱歉!评论已关闭.