《java解惑》 笔记
2012-03-12 19:04
127 查看
1、奇偶性
刚开始,认为可以的,但其实是错误的,对于整数n对2取余, 结果有1, 0, -1。 所以如果说 return (n % 2 != 0) 这样完全是可以的
高效版本:return (n & 1) != 0;
2、浮点数的精度问题
我已经想到结果不会是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、不劳无获
显然我注意到没有break, 所以我不会说答案不一定,但是我给的答案是输出CD。
但显然我还是错了, 对于StringBuffer(char) 这个构造方法, 跟进去后发现实际函数如下:
public StringBuffer(int capacity) {//实际调用的int形参, 没有传char的构造函数
super(capacity);
}
再跟进super():
AbstractStringBuilder(int capacity) {
value = new char[capacity];//看到这里就发现实际是开了char对应的int大小的空间, 我想当然的以为是把sb初始化为传进来的字符
}
24、尽情享受每一个字节
对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、在循环中
这就像上面24中说的i 等于Integer.MAX_VALUE后i++, 溢出, 此时i等于Integer.MIN_VALUE, 其值还是小于等于Integer.MAX_VALUE,所以讲无法跳出for,即不会打印任何东西
-----------------------------------------------
先写这么多,都是书上的,用来备忘。。。
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,即不会打印任何东西
-----------------------------------------------
先写这么多,都是书上的,用来备忘。。。
相关文章推荐
- java解惑系列笔记
- java解惑笔记四
- java解惑_奇数性(笔记)
- UML学习笔记(二):复习面向对象的一些基本概念
- Tapest笔记(四)
- InputStreamReader类和OutputStreamWriter类学习笔记
- 我的学习笔记 --Ubuntu8.10下jdk与tomcat的安装设置
- (网管学习笔记34)虚拟机应用Virtual PC,VMware和VirtualBox
- 读《发掘孩子的大脑潜能》笔记
- 新浪网内部讲师进阶研习会之笔记
- MFC学习笔记之:7种访问对话框控件的方式
- Oracle 分页排序 笔记
- mysql数据库课堂笔记2
- playMaker插件学习笔记之控制cube
- SQL反模式笔记9——取整错误
- linux学习笔记-设置开机启动
- uboot移植到Keil(mdk-arm)笔记
- Oracle基础学习笔记(1)
- Ruby 学习笔记 - RakeFile
- Jquery 取 s:checkbox 的值 ——工作笔记