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));
    }
}

第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 +
                '}';
    }
}

第50条 如果其他类型更合适,则尽量避免使用字符串

字符串不适合代替其他值类型。

字符串不适合代替枚举类型。

字符串不适合代替聚集类型。

String compundKey = className + "#" + i.next();//最好编写一个类来描述这个数据集

字符串不适合代替能力表

String不能代替<T>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值