2016-03-17 41 views
0

/*我有一個員工列表*/Java迭代器如何在內部工作?

List<Employee> empList=new ArrayList<Employee>(); 
empList.add(employee1); 
empList.add(employee2); 
empList.add(employee3); 
empList.add(employee4); 

/*我採取一個迭代器*/

Iterator<Employee> empIterator=empList.iterator(); 

在上面的線,我試圖在列表上獲得一個迭代器。我的疑問是迭代器中會有什麼(將所有列表對象複製到它中,或者列表對象被克隆或......我只是無能爲力)。幫助我理解這一點。 在此先感謝。

+3

只看自己的代碼?它的全部可用 – redFIVE

+3

既沒有複製也沒有克隆。以'ArrayList'爲例,迭代器是它的一個內部類,它可以完全訪問封閉'ArrayList'的元素。 – Berger

+2

迭代器不會複製你的列表。它只是一個順序交付物品的工具。 – khelwood

回答

2

迭代器將具有方法來修改基礎列表,這裏是內部類,當你調用迭代器返回

如果你看一下它的source code你找到

public Iterator<E> iterator() { 
    return new Itr(); 
} 

而類Itr

private class Itr implements Iterator<E> { 
    int cursor;  // index of next element to return 
    int lastRet = -1; // index of last element returned; -1 if no such 
    int expectedModCount = modCount; 

    public boolean hasNext() { 
     return cursor != size; 
    } 

    @SuppressWarnings("unchecked") 
    public E next() { 
     checkForComodification(); 
     int i = cursor; 
     if (i >= size) 
      throw new NoSuchElementException(); 
     Object[] elementData = ArrayList.this.elementData; 
     if (i >= elementData.length) 
      throw new ConcurrentModificationException(); 
     cursor = i + 1; 
     return (E) elementData[lastRet = i]; 
    } 

    public void remove() { 
     if (lastRet < 0) 
      throw new IllegalStateException(); 
     checkForComodification(); 

     try { 
      ArrayList.this.remove(lastRet); 
      cursor = lastRet; 
      lastRet = -1; 
      expectedModCount = modCount; 
     } catch (IndexOutOfBoundsException ex) { 
      throw new ConcurrentModificationException(); 
     } 
    } 

    final void checkForComodification() { 
     if (modCount != expectedModCount) 
      throw new ConcurrentModificationException(); 
     } 
    } 
+4

好吧,這些評論完全脫離軌道。我擦洗了他們。提醒一下:請不要侮辱他人試圖幫助別人。 –

+0

感謝所有的信息人士。 – Venkata

1

對於大多數簡單的Java集合迭代器只是不斷的其中一個指針在收集迭代器當前處於。調用.next()將推進迭代器。它不會複製元素,只返回集合中的下一個元素。由於集合未被克隆或複製,因此對集合進行的任何結構修改(添加或刪除元素)都不會通過迭代器(包括通過其他迭代器)進行,將會破壞迭代器,並嘗試使用它將很可能會引發ConcurrentModificationException。這很簡單,記憶效率高,適用於絕大多數用例。

併發集合的迭代器(在java.util.concurrent中)要複雜得多,並且特定於每個集合的操作方式,以便在集合發生修改時提供結果。

+3

並非所有對集合所做的修改都未通過迭代器導致產生ConcurrentModificationException - 例如,您可以在迭代過程中設置一個元素而沒有問題。 –