EffectiveJava-1

最近在看EffectiveJava,记录一下,分享一下自己的心得。

一、将局部变量的作用于最小化

  1. 在第一次使用的地方进行声明,过早的声明局部变量,会延长局部变量的生命周期,若在代码块外声明变量,当程序结束代码块后,该变量还是存在的,这并不是我们想要的结果(应该代码块结束后变量销毁)
  2. 当具有足够的信息进行初始化时再进行声明(try-catch代码块除外),当变量的值必须在try块的外部用到,它就必须在try块之前被声明。
  3. 若在循环终止之后不再需要循环变量的内容,能使用for循环就使用for循环,尽量不用while循环。for循环结束后,其局部变量全部销毁,while循环结束后,其变量可能还会存在;for循环比while循环更简洁;for循环中出现错误,程序不会通过编译,while循环中出现错误会在运行时报错。

二、for-each循环优于传统的for循环

  1. for-each循环不用关心容器的类型。
  2. for-each循环完全隐藏了迭代器或者索引变量,避免了混乱和出错的可能。
  3. for-each循环不仅能遍历集合和数组,还可以遍历实现Iterable接口的任何对象。
  4. 三种情况下无法使用for-each循环
    1. 解构过滤,遍历集合过程中需要删除指定的元素。
    2. 转换,若需要遍历列表或数组,并取代它的部分或者全部元素值,需要列表迭代器或者数组索引,便于设定元素的值
    3. 平行迭代,如果需要并行地遍历多个集合,就要显式的控制迭代器或者索引变量。

平行迭代的例子:

enum Num{ONE,TWO,THREE,FOUR,FIVE,SIX}
...
Cllection<Num> nums= EnumSet.allOf(Num.class);
for (Iterator<Num> i = nums.iterator();i.hasNext();)
        for(Iterator<Num> j = nums.iterator();j.hasNext();)
                System.out.println(i.next()+" "+j.next());
    

输出结果为:

ONE ONE
TWO TWO
THREE THREE
FOUR FOUR
FIVE FIVE
SIX SIX

此处需要注意:如此循环并不会输出6*6个结果,并且若外层遍历的容器中元素个数少于内层遍历的容器中元素个数,则会抛出NoSuchElementException异常。

参考:《Effective java》P219~P224

posted @ 2019-10-16 22:43  MrZhaoyx  阅读(149)  评论(0编辑  收藏  举报