我在看AbstractCollection的源代码时,看到这么一个方法: public String toString() { StringBuffer buf = new StringBuffer(); buf.append("[");
Iterator<E> i = iterator();
boolean hasNext = i.hasNext(); //为什么不直接用i.hasNext? 这样做有什么好处么?还是有其他原因?
while (hasNext) {
E o = i.next();
buf.append(o == this ? "(this Collection)" : String.valueOf(o));
hasNext = i.hasNext();
if (hasNext) //这边也是
buf.append(", ");
}
buf.append("]");
return buf.toString(); }
Iterator<E> i = iterator();
boolean hasNext = i.hasNext(); //为什么不直接用i.hasNext? 这样做有什么好处么?还是有其他原因?
while (hasNext) {
E o = i.next();
buf.append(o == this ? "(this Collection)" : String.valueOf(o));
hasNext = i.hasNext();
if (hasNext) //这边也是
buf.append(", ");
}
buf.append("]");
return buf.toString(); }
应该没有本质的区别
整个过程只使用了一个局部变量hasNext,否则,每次调用的时候都要有一个临时变量(我们应该感觉不到).
可能会有那么一点点优化吧,这个就不用钻牛角尖了。
...
hasNext = i.hasNext();
}
能够解释详细一点?
buf.append(i.next());
if (i.hasNext()) {
buf.append(", ");
}
}那么,你就大错特错了。假设当前Collection{1,2,3,4,5,6}原先的代码打印"[1, 2, 3, 4, 5, 6]"
而你期望的代码打印"[1, 3, 5, ]"
buf.append(get(i));
if (i != size() - 1) { // if * size()
buf.append(", ");
}
}当然你也可以这样int length = buf.length();
for (Iterator i = iterator(); i.hasNext(); ) {
buf.append(i.next()).append(", ");
}
int newLength = buf.length();
if (newLength != length) {
buf.delete(newLength - 2, newLength);
}