AbstractCollection源代码的一个小问题

wengzuliang 2005-10-13 08:21:53
我在看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();

}
...全文
141 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
OO00 2005-10-13
  • 打赏
  • 举报
回复
还是时常晕倒。。。

学习
zouzhejun 2005-10-13
  • 打赏
  • 举报
回复
up
shine333 2005-10-13
  • 打赏
  • 举报
回复
楼主能这样,正是善哉善哉!
shine333 2005-10-13
  • 打赏
  • 举报
回复
不一样啊

while (i.hasNext()) { //每次都运行,与上一循环无关

}

while (hasNext) { //保留了下面这行代码,也就是上一次循环中的运行结果
...
hasNext = i.hasNext();
}
treeroot 2005-10-13
  • 打赏
  • 举报
回复
我更倾向于认为是个人习惯问题
onray 2005-10-13
  • 打赏
  • 举报
回复
个人感觉也是效率问题
treeroot 2005-10-13
  • 打赏
  • 举报
回复
这个是1.5的版本吧
应该没有本质的区别
整个过程只使用了一个局部变量hasNext,否则,每次调用的时候都要有一个临时变量(我们应该感觉不到).
可能会有那么一点点优化吧,这个就不用钻牛角尖了。
lyj830223 2005-10-13
  • 打赏
  • 举报
回复
是不是如果在while ( i.hasNext())和 if (i.hasNext())用i.hasNext()的话,需要调用两次i.hasNext()方法,而用原码所写的每次循环只调用一次,效率能好一些吧
shine333 2005-10-13
  • 打赏
  • 举报
回复
如果你觉得迷惑的是为何以这种方式来拼“,” 那只能说个人编程习惯问题,而且这样比每次判断是否是最后一个(判断N次)好很多

for (int i = 0; i < size(); i++) {
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);
}
shine333 2005-10-13
  • 打赏
  • 举报
回复
如果你希望是这样的话

while (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, ]"
wengzuliang 2005-10-13
  • 打赏
  • 举报
回复
to shine333(enihs):
能够解释详细一点?

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧