Pitfall 1:判斷x的奇偶性

public static boolean isOdd(int x)
{
return x % 2 == 1;
}
當(dāng)x為負(fù)奇數(shù)時(shí),x % 2的值為負(fù)數(shù)。
Note:把 x % 2 == 1 改為 x % 2 != 0
Pitfall 2:長(zhǎng)整數(shù)計(jì)算
long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;
這個(gè)表達(dá)式先計(jì)算左邊幾個(gè)int的乘積,然后再把值轉(zhuǎn)換為long,因此仍會(huì)溢出
Note:把24改成24L
Pitfall 3:看看這句話(huà)的結(jié)果
System.out.println(12345+5432l);
Note:5432后面的l很容易被看成1,因此建議使用L表示長(zhǎng)整形時(shí)都使用大寫(xiě)。
Pitfall 4:下面這句話(huà)又會(huì)是什么結(jié)果
System.out.println(Long.toHexString(0x100000000L + 0xcafebabe));
Java計(jì)算時(shí)先用sign-extension把后面一個(gè)數(shù)轉(zhuǎn)成long,然后再計(jì)算
Note:盡量避免混合類(lèi)型計(jì)算
Pitfall 5:這句話(huà)呢?
System.out.println((int) (char) (byte) -1);
結(jié)果是65535
Note:char是無(wú)符號(hào)類(lèi)型,將char轉(zhuǎn)為int時(shí)使用zero-extension
Pitfall 6:交換變量值
int x = 1984;
int y = 2001;
x ^= y ^= x ^= y;
最終結(jié)果是x == 0, y == 1984
Note:Java中操作符是從左往右計(jì)算的 (JLS 15.7)
改成 y = (x ^ (y ^= x) ^ y; 就可以,但是永遠(yuǎn)不要這么做
Pitfall 7:?jiǎn)柼?hào)操作符
char x = 'X';
int i = 0;
System.out.print(true ? x : 0);
System.out.print(false ? i : x);
輸出結(jié)果為X88
Note:同樣是混合類(lèi)型計(jì)算導(dǎo)致的問(wèn)題,建議在條件表達(dá)式中使用類(lèi)型相同的第二和第三操作符。
Pitfall 8:看似相同的表達(dá)式的不同結(jié)果
short x = 0;
int i = 123456;
1) x += i; // 隱含了類(lèi)型轉(zhuǎn)換,結(jié)果為-7616
2) x = x + i; // 編譯無(wú)法通過(guò),因?yàn)閾p失了精度