我在看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();    }

解决方案 »

  1.   

    是不是如果在while ( i.hasNext())和 if (i.hasNext())用i.hasNext()的话,需要调用两次i.hasNext()方法,而用原码所写的每次循环只调用一次,效率能好一些吧
      

  2.   

    这个是1.5的版本吧
    应该没有本质的区别
    整个过程只使用了一个局部变量hasNext,否则,每次调用的时候都要有一个临时变量(我们应该感觉不到).
     可能会有那么一点点优化吧,这个就不用钻牛角尖了。
      

  3.   

    不一样啊while (i.hasNext()) { //每次都运行,与上一循环无关}while (hasNext) { //保留了下面这行代码,也就是上一次循环中的运行结果
      ...
      hasNext = i.hasNext(); 
    }
      

  4.   

    to shine333(enihs):
    能够解释详细一点?
      

  5.   

    如果你希望是这样的话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, ]"
      

  6.   

    如果你觉得迷惑的是为何以这种方式来拼“,” 那只能说个人编程习惯问题,而且这样比每次判断是否是最后一个(判断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);
    }