effective java:通用程序设计

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:反射中





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值