天天看點

Effective Java(46~50)

第46條 for-each循環優先于傳統的for循環

無法使用for-each循環的情況:

1.過濾,需要周遊集合并删除標明的元素,需要顯式的疊代器,以便調用它的remove方法

2.轉換,需要周遊清單或者數組,并取代它部分或者全部元素值,需要清單疊代器或者數組索引,以便設定元素的值

3.平行疊代,并行地周遊多個集合,需要顯式地控制疊代器或者索引變量,以便所有疊代器和索引變量都可以得到同步前移

第47條 了解和使用類庫

第48條 如果需要精确的答案,請避免使用float和double

float和double類型主要是為了科學計算與工程計算而設計的,它們并沒有提供完全精确的結果,是以不應該被用于需要精确結果的場合。在商業計算中要用BigDecimal。

總結:對于需要精确答案的計算,不能使用float或者double,BigDecimal允許完全控制舍入,如果業務要求涉及多種舍入方式,使用BigDecimal很友善,如果性能很關鍵,涉及的數值不大,就可以使用int或者long,如果數值範圍沒有超過9位十進制數字,可以使用int,如果不超過18位數字,使用long,如果數值可能超過18位,就必須用BigDecimal。

public class Test {
    public static void main(String[] args) {
        double a = 1.29;
        double b = 0.43;
        System.out.println(a - b);

        BigDecimal c = BigDecimal.valueOf(1.29);
        BigDecimal d = BigDecimal.valueOf(0.43);
        System.out.println(c.subtract(d));
    }
}
           
Effective Java(46~50)

第49條 基本類型優先于裝箱基本類型

基本類型和裝箱基本類型之間的三個主要差別:

1.基本類型隻有值,而裝箱基本類型具有與它們的值不同的同一性(兩個裝箱基本類型可以具有相同的值和不同的同一性)

2.基本類型隻有功能完備的值,而每個裝箱基本類型除了它對應的基本類型的所有功能值之外,還有個非功能值:null

3.基本類型通常比裝箱基本類型更節省空間和時間。

适合使用裝箱基本類型的地方:

1.作為集合中的元素,鍵和值。

2.在參數化類型中,必須使用裝箱基本類型作為類型參數。

3.在進行反射方法調用時,必須使用裝箱基本類型。

資料綁定的基本資料類型和包裝類型的差別是 

基本資料類型是必須要傳值的,不傳值的話會報錯,而且傳值的話也必須是對應的基本資料類型,否則的話會報類型錯誤,而包裝類型可以傳空值,也可以用requestParam來限制傳值是否可以為空,是以一般對于可能會傳空值的屬性一般會用包裝類型。

public class Test {
    public static void main(String[] args) {
        User user = new User();
        user.setName("Sam");
        user.setAge(15);//Integer預設值為null
        System.out.println(user);

        User user1 = new User();
        user1.setName("Tom");
        user1.setScore(75);//int類型預設值為0
        System.out.println(user1);
        
        User user2 = new User();
        user2.setName("David");
        user2.setAge(null);//int類型值不能為null
        user2.setScore(null);//Integer類型值可以為null
    }
}

class User{
    private String name;
    private int age;
    private Integer score;

    public String getName() { return name; }

    public void setName(String name) { this.name = name; }

    public int getAge() { return age; }

    public void setAge(int age) { this.age = age; }

    public Integer getScore() { return score; }

    public void setScore(Integer score) { this.score = score; }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", score=" + score +
                '}';
    }
}
           
Effective Java(46~50)

第50條 如果其他類型更合适,則盡量避免使用字元串

字元串不适合代替其他值類型。

字元串不适合代替枚舉類型。

字元串不适合代替聚集類型。

String compundKey = className + "#" + i.next();//最好編寫一個類來描述這個資料集
           

字元串不适合代替能力表

String不能代替<T>

繼續閱讀