读<<Java解惑>>后的碎嘴子(第一章)

第一章--表达式问题

1.当取余(%)操作结果不为0时,余数的符号和左边操作数相同,如1%2=1,-1%2=-1
总结:将取余操作用来作判断分支条件时,尽量用0值来作参照

2.需要精确结果时,避免使用float和double计算,尤其是货币计算,要使用int,long来以整数的形式计算,System.out.printf(String,Object)并不是最好的解决方案,也可以用BigDecimal,但是构造方法的参数,一定要选用字符串,

如new BigDecimal("2.20"),而不是new BigDecimal(2.20)
总结:二进制浮点数不能精确表示10的任何次负幂

3.
long micro = 24 * 60 * 60 * 1000 * 1000;
结果竟然是500654080,尽管认为long型可以正常装下计算结果,但是算式每个元素默认都会是int,结果也会以int的容量来计算,解决方法只需要把任何一个元素强制声明为long型即可得

到正确结果86400000000,如:
long micro = 24L * 60 * 60 * 1000 * 1000;


long micro = 24 * 60L * 60 * 1000 * 1000;
总结:就算结果类型是long,不能保证计算过程中不溢出

4.这个没什么意思,主要是数字1和字母l不要搞混淆
总结:该不用l就不用,该大写L就大写L

5.
System.out.println(Long.toHexString(0x100000000L + 0xcafebabe));
结果是cafebabe,少了个开头的1,因为在非十进制里,表示负数无需加负号(-),0xcafebabe是int型并且最高位有值,因为它其实是个负数,在与

0x100000000L相加时被自动扩展成long型0xffffffffcafebabeL,解决方法为0xcafebabe改为0xcafebabeL,保证最高位是0,这样它就不是一个负数了
总结:在操作非十进制时,要注意其真正的正负,同时最好让他们初始有相同的类型而不是使其自动扩展

6.
System.out.println((int)(char)(byte)-1);
结果是65535,为什么不是-1?原因来一步一步看,开始-1自动是int型,用二进制表示是32个1,被砍成8位的byte变成了11111111,这是没有问题的,因为int和byte是有符号类型的,存在

正负,而char却不存在负数的问题,将8位byte转换为16位的无符号char类型,实质先把byte转回了int,其实(int)(char)(byte)-1和(int)(char)-1是等同的,不存在有符号8位(byte)变无符号16位(char)的情况,而是int转byte一样,

直接砍去16位,结果自然是16个1,又因为char无符号,最高位代表真正的值,16个1自然是65535
总结:强制转换要考虑到类型本质有无符号的问题,其实可以看作算是第5条的一个扩展

7.异或交换法,一些装13的面试题里遇到过(如怎么用一条语句交换两个变量的值,或交换两个变量的值有几种方法),这样的花活实在是没什么意思
总结:有兴趣可以看看具体内容,看看bloch大师的推理

8.
char x = 'X';
int i = 0;
System.out.println(false ? i : x);

结果是88而不是X,其中过程比较复杂,简单的说因三目运算符的自有特性,当第二三操作数的类型不同,返回的类型也不同(这里明显地把char提升为int了)
总结:用三目运算符时,最好保证两个返回值类型一致

9.
short x = 0;
System.out.println(x+=123456);

结果是-7616,根据上面的经验,这个一点都不难理解了
总结:byte,short,char这样的类型,参与+=这样的复合运算要注意自动转型

10.
Object obj = "a";
String str = "b";
obj+=str;

编译器不通过,而obj = obj + str;这和+=这样的复合赋值自身特性有关
总结:类型不一样,还是少用复合赋值符号
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值