第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>