Malinkang's blog

人生最可悲的事情,莫过于胸怀大志,却又虚度光阴。

你好,我是马林康,一名Android开发者。


《Effective Java》读书笔记 第8章 通用程序设计

第45条:将局部变量的作用域最小化

要使局部变量的作用域最小化,最有力的方法就是在第一次使用它的地方声明。

循环中提供了特殊的机会来将变量的作用域最小化。for循环,都允许声明循环变量(loop variable),它们的作用域被限定在正好需要的范围之内。因此,如果在循环终止之后不再需要循环变量的内容,for循环就优于while循环。

Iterator<Element> i = c.iterator();
while(i.hasNext()){
    doSomething(i.next());
}
Iterator<Element> i2 = c2.iterator();
//本来要初始化一个新的循环变量i2,却使用了旧的循环变量i,i仍然在使用范围之内,代码可以通过编译
//如果在for循环中,代码就根本不能通过编译。
while(i.hasNext()){ 
    doSomething(i2.next());
}

第46条:for-each循环优于传统的for循环

在Java1.5发行版本之前,对集合进行遍历的首选做法如下:

for (Iterator i = c.iterator();i.hasNext()) {
    doSomething((Element)i.next());
}

遍历数组的首选做法如下:

for (int i = 0; i < a.length; i++){
    doSomething(a[i]);
}

这些做法都比while循环更好,但是它们也并不完美,迭代器和索引变量都会造成一些混乱。

Java 1.5发行版本中引入的for-each循环,通过完全隐藏迭代器或者索引变量,避免了混乱和出错的可能。

for (Element e:elements){
    doSomething(e);
}

在对多个集合进行嵌套式迭代时,for-each循环相对于传统for循环的这种优势还会更加明显。

总之,for-each循环在简洁性和预防Bug方面有着传统的for循环无法比拟的优势,并且没有性能损失,应该尽可能地使用for-each循环。遗憾的是,有三种常见的情况无法使用for-each循环:

  1. 过滤:如果需要遍历集合,并删除选定的元素,就需要使用显式的迭代器,以便可以调用它的remove方法。
  2. 转换:如果需要遍历列表或者数组,并取代它部分或者全部的元素值,就需要列表迭代器或者数组索引,以便设定元素的值。
  3. 平行迭代:如果需要并行地遍历多个集合,就需要显式地控制迭代器或者索引变量,以便所有迭代器或者索引变量都可以得到同步前移。

第47条:了解和使用类库

第48条:如果需要精确的答案,请避免使用float和double

第49条:基本类型优先于装箱基本类型

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

第51条:当心字符串连接的性能

第52条:通过接口引用对象

第53条:接口优先于反射机制

第54条:谨慎地使用本地方法

第55条:谨慎地进行优化

第56条:遵守普遍接受的命名管理

最近的文章

Handler的使用和原理分析

目录 使用Handler每个应用程序都有自己的特殊线程来运行UI对象,例如View对象;这个线程称为UI线程。在Android中,不允许非UI线程访问和修改UI对象。但是在实际的开发中,很多地方要在非UI线程中修改UI对象。比如下载网络图片并将图片设置给ImageView。 Handler允许您发 …

于  , 继续阅读
更早的文章

《Effective Java》读书笔记 第7章 方法

第38条:检查参数的有效性对于公有的方法,要用Javadoc的@throws标签在文档中说明违反参数值会抛出的异常。一旦在文档中记录了对于方法参数的限制,并且记录了一旦违反这些限制将要抛出的异常,强加这些限制就是非常简单的事情了。 /** * Returns a {@code BigIn …

于  , 继续阅读
comments powered by Disqus