看了一段北風網的視頻,總結幾個經典的java陷阱給大家。
答案隱藏了,Ctrl+A顯示。建議先思考一下結果,然後運行代碼實驗。也許你會恍然大悟。
1、找奇數:
public static boolean isOdd(int i){<br /> return i % 2 == 1;<br />}
上面的方法真的能找到所有的奇數嗎?
A:沒有考慮到負數問題,如果傳參是負數,那麼永遠不能得到結果!應該是:return i % 2 != 0;
2、浮點數想減
System.out.println(2.0-1.9);
上面會列印0.1嗎?
A:不會,自己實驗就知道結果了。正確做法:用decimal。
3、交換
int x = 2010;<br />int y = 2012;<br />x^=y^=x^=y;<br />System.out.println("x= " + x + "; y= " + y);
x、y的值呼喚了嗎?
A:沒有,java運算順序是從左至右的,應該這麼寫:y=(x^= (y^= x))^ y;
4、字元和字串
System.out.println("H" + "a");<br />System.out.println('H' + 'a');
上面兩個語句輸出結果相同嗎?
A:不想同,字元會被轉換成在數字。所以第一句輸出:Ha,第二句輸出兩個字元的assii碼相加的數字。
5、無限迴圈
public static final int END = Integer.MAX_VALUE;<br />public static final int START = END - 100;<br />public static void main(String[] args) {<br />int count = 0;<br />for (int i = START; i <= END; i++)<br />count++;<br />System.out.println(count);<br />}
上面程式啟動並執行結果是什嗎?
A:無限迴圈。將i<=END改成i<END?為什麼呢?你知道的,呵呵!
6、計數器問題
int minutes = 0;<br />for (int ms = 0; ms < 60*60*1000; ms++)<br />if (ms % 60*1000 == 0)<br /> minutes++;<br />System.out.println(minutes);
結果跟你想的一樣嗎?
A:呵呵,括弧問題,不多說!
7、到底返回什嗎?
public static boolean decision() {<br /> try {<br /> return true;<br />} finally {<br /> return false;<br />}<br />}
true?false?
A:一般情況下,不管怎麼說try/catch代碼塊中,finally總是最後被執行的 。
8、錯誤裡聚集遍曆
public static void main(String[] args) {<br /> Vector v = new Vector();<br /> v.add("one");<br /> v.add("two");<br /> v.add("three");<br /> v.add("four");<br /> Enumeration enume = v.elements();<br /> while (enume.hasMoreElements()){<br /> String s = (String) enume.nextElement();<br /> if (s.equals("two"))<br /> v.remove("two");<br /> else{<br /> System.out.println(s);<br /> }<br /> }<br /> System.out.println("What's really there...");<br /> enume = v.elements();<br /> while (enume.hasMoreElements()){<br /> String s = (String) enume.nextElement();<br /> System.out.println(s);<br /> }<br />}
運行代碼看看結果跟你想的一樣嗎?
A:一般不建議在遍曆聚集的時候對聚集進行操作。為什麼結果是這樣呢?看JDK源碼能得到答案。Enumeration沒有實現Fail Fast操作,如果換成ArrayList,上面的代碼可能會出錯。《java與模式》迭代子(iterator)介紹了。