Java編程常見"坑"匯總(上)
每天在寫Java程式,其實裡面有一些細節大家可能沒怎麼注意,這不,有人總結了一個我們編程中常見的問題。雖然一般沒有什麼大問題,但是最好別這樣做。另外這裡提到的很多問題其實可以通過Findbugs( http://findbugs.sourceforge.net/ )來幫我們進行檢查出來。
注意:Java編程常見坑匯總將分為上下兩期來給大家推送。。。 1.字串串連誤用
錯誤的寫法:
String s = "";
for (Person p : persons) {
s += ", " + p.getName();
}
s = s.substring(2); //remove first comma
正確的寫法:
StringBuilder sb = new StringBuilder(persons.size() * 16); // well estimated buffer
for (Person p : persons) {
if (sb.length() > 0) sb.append(", ");
sb.append(p.getName);
}
2.錯誤的使用StringBuffer
錯誤的寫法:
StringBuffer sb = new StringBuffer();
sb.append("Name: ");
sb.append(name + '\n');
sb.append("!");
...
String s = sb.toString();
問題在第三行,append char比String效能要好,另外就是初始化StringBuffer沒有指定size,導致中間append時可能重新調整內部數組大小。如果是JDK1.5最好用StringBuilder取代StringBuffer,除非有安全執行緒的要求。還有一種方式就是可以直接連接字串。缺點就是無法初始化時指定長度。
正確的寫法:
StringBuilder sb = new StringBuilder(100);
sb.append("Name: ");
sb.append(name);
sb.append("\n!");
String s = sb.toString();
或者這樣寫:
String s = "Name: " + name + "\n!";
3.測試字串相等性
錯誤的寫法:
if (name.compareTo("John") == 0) ...
if (name == "John") ...
if (name.equals("John")) ...
if ("".equals(name)) ...
上面的代碼沒有錯,但是不夠好。compareTo不夠簡潔,==原義是比較兩個對象是否一樣。另外比較字元是否為空白,最好判斷它的長度。
正確的寫法:
if ("John".equals(name)) ...
if (name.length() == 0) ...
if (name.isEmpty()) ...
4.數字轉換成字串
錯誤的寫法:
"" + set.size()
new Integer(set.size()).toString()
正確的寫法:
String.valueOf(set.size())
5.利用不可變對象(Immutable)
錯誤的寫法:
zero = new Integer(0);
return Boolean.valueOf("true");
正確的寫法:
zero = Integer.valueOf(0);
return Boolean.TRUE;