45条:将局部变量的作用域最小化
1:局部变量的作用域从它被声明的点开始,一直到外围块(block)结束。如果变量在被使用块之前被声明,当程序退出该块时,该变量仍然可见。
如果变量在它的目标使用区域之前或者之后被意外的使用 后果可能是灾难性的。
2:每个局部变量被声明时都应被初始化,如果你还没有足够的信息来对一个变量进行有意义的初始化,那就应该推迟这个声明,知道可以初始化为止。
try-catch语句可以例外。
3:将一个局部变量的作用域最小化的方法是使方法小而集中。
如果两个操作合并到一个方法中,与其中一个方法相关的局部变量可能会被另一个方法引用,为了防止这种情况发生,只要将这个方法分成两个,每个
方法各执行一个操作。
46条:while for for-each对比
while与for相比优先使用for循环
1:for的循环变量作用域在循环结束后也结束,while的循环变量在循环结束后 仍然存在。
2:for循环更简短易读
for与for-each相比优先使用foreach
1: for(int i=0;i<n;i++)
for(Iterator i=c.iterator;i.hasNext();)
以上两个都比while好 但是也不完美 无论是索引方式还是迭代器方式都会造成一些混乱,而且迭代器和索引出现的次数多也代表错误的可能性高
为了降低错误的可能性使用foreach
2: 在某些情况下 foreach性能更好 因为对于数组的索引边界它只计算一次
不适用情况:
1:要在遍历时改变数组
2:同时并行的遍历两个集合 这需要自己控制索引,因此不适用使用
49条:基本类型优于装箱基本类型
基本类型与装箱基本类型的区别:
1:基本类型只有值,而装箱基本类型不仅有值还有同一性。两个装箱基本类型值可能相同但统一性可能不一样。
2:基本类型只有功能值 装箱基本类型不仅有功能值还有非功能值null
3:基本类型更省空间效率高
例子1:
comparator<Integer> naturalOrder = new Comparator<Integer>(){
public int compare(Integer first,Integer second){
return first<second?-1:(first==second?0:1);}
}
first = new Integer(23);
second = new Integer(23);
结果返回1
因为在first<second时自动拆箱 相等
在进行first==second时虽然上一步拆箱了 但仍然是两个引用在比较 同一性不相等 因此返回1;
解决办法 增加基本类型的局部变量
int f = first;
int s = second;
return f<s?-1(f==s?0:1);
当程序用==操作符比较两个装箱的类型时 比较的事唯一性
当一个基本类型与装箱基本类型运算时 会自动拆箱
例子2:
public class Unbelievable{
static Integer i;
public static void main(String args[]){
if(i==42){
system.out.print("unbelieve");}
}}
结果 异常 因为i=null
例子3:
public static void main(String args[]){
Long sum = 0L;
for(int i=0;i<Integer.MaxValue;i++){
sum+=i;
}
}
结果 没有错误 但是性能低 因为在不断的装箱拆箱
使用装箱的情况:
1:类集中 2:反射中