1.盡量用基本類型,原因是null == int的情況,性能問題,比較問題3個問題
Comparator<Integer> order = (i, j) -> (i < j) ? -1 : ((i == j) ? 0 : 1); int compare = order.compare(new Integer(2), new Integer(2) ); System.out.println(compare);
這裏輸出的預期應該是0,但實際是1。分析過程,i < j 這邊就自動拆箱成nt,然後i == j,==這裏是對象引用判斷,所以為假,則得出0了。
改成下面這種就可以了。
Comparator<Integer> order = (i, j) -> { int a = i, b = j; return i < j ? -1 : (i == j ? 0 : 1); };
還有要注意下面這種錯誤的代碼,它會出null指針異常,編譯不過。因爲Integer會功能值有null,所以存在null == int這種情況,所以應該改爲int定義i。
static Integer i; public static void main(String[] args) { if (i == 2) { System.out.println("ok"); } }
那么,什么时候应该使用包装类型呢?它们有几个合法的用途。第一个是作为集合中的元素、键和值。不能将基 本类型放在集合中,因此必须使用包装类型。这是一般情况下的特例。在参数化类型和方法中,必须使 用包装类型作为类型参数,因为 Java 不允许使用基本类型。例如,不能将变量声明为 ThreadLocal<int> 类型, 因此必须使用 ThreadLocal<Integer> 。后,在进行反射方法调用时,必须使用包装类型。
总之,只要有选择,就应该优先使用基本类型,而不是包装类型。基本类型更简单、更快。如果必须使用包装类 型,请小心!自动装箱减少了使用包装类型的冗长,但没有减少危险。 当你的程序使用 == 操作符比较两个包装类 型时,它会执行标识比较,这几乎肯定不是你想要的。当你的程序执行包含包装类型和基本类型的混合类型计算时, 它将进行拆箱,当你的程序执行拆箱时,将抛出 NullPointerException。 后,当你的程序将基本类型装箱时,可能 会导致代价高昂且不必要的对象创建。
2.盡量避免使用字符串,很常規的思路,不做過多闡述
3. 盡量少用反射,反射的確可以可以實現對任何類的訪問,但是比較麻煩,并且不是很安全(編譯不檢查),性能也差些。下面寫一個例子