<effective java>讲for的笔记

本文探讨了for循环与foreach循环的安全性与效率问题,并通过代码示例展示了foreach循环的性能优势,同时指出了foreach循环在特定场景下的局限性。
先是说for比while更安全,因为for是把一推东西都写在括号中的嘛.
而while需要现在外部定义一个对象,
所以,while中可能出现如此代码,

Iterator<Element> i = c.iterator();
while(i.hasNext()){
doSomething(i.next());
}
//...
Iterator<Element> i2 = c2.iterator();
while(i.hasNext()){//这里有bug
doSomething(i2.next());
}

for循环就不可能出现.
然后,就是一个比较有意思的,可能你知道,算俺少见多怪吧...

for (int i = 0, j = 1, k = 2;;) {
//我认为可以定义很多变量也很有意思...
}

-------------------
"利用for-each循环不会有性能损失,甚至用于数组也一样。实际上,在某些情况下,比起普通的for循环,它还稍有些性能优势,因为它对数组索引的边界值只计算一次。"

public static void main(String[] args) {
int[] iArr = new int[10000000];
long forBegin = System.currentTimeMillis();
for (int i = 0; i < iArr.length; i++) {
test(iArr[i]);
}
long forEnd = System.currentTimeMillis();
for (int i : iArr) {
test(i);
}
long foreach = System.currentTimeMillis();
System.out.println("for:" + (forEnd - forBegin) + " foreach:" + (foreach - forEnd));
//输出结果,for:31 foreach:16
}
public static void test(int i) {
}

看输出结果,果不其然!for-each是怎么实现的呢?看来肯定不是用普通for循环鸟...
-------------------
在看一个,书中要讲明要用for-each,尽量不要用for的一个例子,for可能会遇到的一个问题,

public static void main(String[] args) {
List<Suit> suits = Arrays.asList(Suit.values());
List<Rank> ranks = Arrays.asList(Rank.values());
List<Card> deck = new ArrayList<Card>();
for (Iterator<Suit> i = suits.iterator(); i.hasNext();) {
for (Iterator<Rank> j = ranks.iterator(); j.hasNext();) {
deck.add(new Card(i.next(), j.next()));
//问题就在于这里的i.next(),多次的j循环,i也是不断next()的呀...
}
}
}
enum Suit {
CLUB, DIAMOND, HEART, SPADE
}
enum Rank {
ACE, // [eis] 幺点
DEUCE, // [dju:s] 两点
THREE, FOUR, FIVE, SIX, SEVEN, NINE, TEN, JACK, QUEEN, KING
}

当然,解决办法简单到只需在第二个for循环前把i.next()赋给一个对象.
但是,<effective java>曰不优雅呀!
okay,于是乎就这样了,

for (Suit suit : Suits)
for (Rank rank : ranks)
deck.add(new Card(suit,rank));

要注意呀,"for-each循环不仅让你遍历集合和数组,还让你遍历任何实现Iterable接口的对象",O耶,以后要玩集合都要实现Iterable鸟...
-------------------
至于最后提单的,"过滤"和"转换"时不要用for-each并非没有瑕疵.如果是个对象的集合的话,用for-each做remove(过滤)和为属性赋值(转换)应该也是木问题的.
当然,如果是简单类型集合的话,"转换"与"过滤"不宜用for-each了.("转换",如果使用=或者new的话,即使是对象集合,也是不行的吧)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值