一些Tips

1 java puzzler 94 应该优先使用库函数提供的方法。

  

 

2 java puzzler 95

(1)操作符==的优先级大于?:

(2)?:操作符是从右向左结合的。

下例打印结果是false。

 

3 java puzzler 1 判断奇数性

  当取余操作返回一个非零的结果时,它与左操作数具有

 

 

 4 java puzzler 3

从int提升为long是一种拓宽原生类型转换(widening primitive conversion)

下面的代码演示了溢出:

 

5 java puzzler 12

 

 

5 java puzzler 14

Java 对在字符串字面常量中的Unicode 转义字符没有提供任何特殊处理。编译器在将程序解析成各种符号之前,先将Unicode
转义字符转换成为它们所表示的字符[JLS 3.2]。
因此,程序中的第一个Unicode转义字符将作为一个单字符字符串字面常量("a")的结束引号,而第二个Unicode 转义字符将作为另一个单字符字符串字面常量("b")的开始引号。程序打印的是表达式"a".length()+"b".length(),即2。

 

打印结果

 

6 java puzzler 18

(1)“在通过解码使用平台缺省字符集的指定byte 数组来构造一个新的String 时,该新String 的长度是字符集的一个函数,因此,它可能不等于byte 数组的长度。当给定的所有字节在缺省字符集中并非全部有效时,这个构造器的行为是不确定的”[Java-API]。

(2)J2SE 运行期环境(JRE)的缺省字符集依赖于底层的操作系统和语

 

7 java puzzler 20

打印结果

 

8 java puzzler25 15.14.2]:表达式j++的值等于j 在执行增量操作之前的初始值。

打印结果 0

 

9 java puzzler 26 所有的int变量都小于或等于Integer.MAX_VALUE;下面代码导致死循环

修改 for (long i = START; i <= END; i++)

 

10 java puzzler 27 

问题在于(-1 << 32)等于-1 而不是0,因为移位操作符之使用其右操作数的低5 位作为移位长度。或者是低6 位,如果其左操作数是一个long 类数值[JLS15.19]。

下面程序陷入死循环

 

 

11 java puzzler 31 制造一个无限循环

(1)i首先扩展为int型,short类型的-1,用0xffff表示,扩展为int,表示0xffffffff;执行算数右移,变成0x7fffffff,然后赋值给i;因为i是short类型,截断高两个字节,表示为0xffff,还是-1;

(2)复合赋值操作符包括*=、/=、%=、+=、-=、<<=、>>=、>>>=、&=、^=和|=。)有关混合操作符的一个不幸的事实是,它们可能会自动地执行窄化原始类型转换[JLS 15.26.2],

 

12 java puzzler 32

声明一个 i,j,使下面的语句变成无限循环

Integer i = new Integer(0);

Integer j = new Integer(0);

(1)Java 的数字比较操作符(<、<=、>和>=)要求它们的两个操作数都是原始数字类型的(byte、char、short、int、long、float 和double)[JLS 15.20.1]。但是在5.0 版中,规范作出了修改,新规范描述道:每一个操作数的类型必须可以转换成原始数字类型[JLS 15.20.1,5.1.8]

(2)为Java 的判等操作符(==和!=)在作用于对象引用时,执行的是引用ID 的比较,而不是值的比较

 

13 javapuzzler 34

当int i = Integer.MIN_VALUE;

   int i = 2^32;

上例可以无限循环

 

14 %和 * 的结合性是相等的

等价于 if ((ms % 60) * 1000 == 0)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值