先是说for比while更安全,因为for是把一推东西都写在括号中的嘛.
而while需要现在外部定义一个对象,
所以,while中可能出现如此代码,
for循环就不可能出现.
然后,就是一个比较有意思的,可能你知道,算俺少见多怪吧...
-------------------
"利用for-each循环不会有性能损失,甚至用于数组也一样。实际上,在某些情况下,比起普通的for循环,它还稍有些性能优势,因为它对数组索引的边界值只计算一次。"
看输出结果,果不其然!for-each是怎么实现的呢?看来肯定不是用普通for循环鸟...
-------------------
在看一个,书中要讲明要用for-each,尽量不要用for的一个例子,for可能会遇到的一个问题,
当然,解决办法简单到只需在第二个for循环前把i.next()赋给一个对象.
但是,<effective java>曰不优雅呀!
okay,于是乎就这样了,
要注意呀,"for-each循环不仅让你遍历集合和数组,还让你遍历任何实现Iterable接口的对象",O耶,以后要玩集合都要实现Iterable鸟...
-------------------
至于最后提单的,"过滤"和"转换"时不要用for-each并非没有瑕疵.如果是个对象的集合的话,用for-each做remove(过滤)和为属性赋值(转换)应该也是木问题的.
当然,如果是简单类型集合的话,"转换"与"过滤"不宜用for-each了.("转换",如果使用=或者new的话,即使是对象集合,也是不行的吧)
而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的话,即使是对象集合,也是不行的吧)