2017-01-23 88 views
-2

我有兩個來自java.util包的集合。最初幾個元素添加到它,然後刪除元素。我試圖理解這裏的兩件事。List和Set接口如何在Java中添加和刪除對象?

問題1:從集合中刪除元素是基於索引還是基於元素?下面的代碼是在eclipse中編譯和運行的。

List<Integer> list = new ArrayList<Integer>(); 
    Set<Integer> set = new HashSet<Integer>(); 
     for (int i = -3; i < 3; i++) { 
       list.add(i); 
       set.add(i); 
      } 
//List = [-3, -2, -1, 0, 1, 2] Set =[-1, 0, -2, 1, -3, 2] 

現在試圖從兩個集合中刪除元素:

for (int i = 0; i <= 2; i++) { 
    list.remove(i); 
    set.remove(i); 
    } 
// Result is List = [-2, 0, 2] Set = [-1, -2, -3] 

問題2:看看Java源的實現代碼移除元素。我如何理解下面的源代碼?

protected transient int modCount = 0; 
private int size; 
transient Object[] elementData; 

private void fastRemove(int index) { 
    modCount++; 
    int numMoved = size - index - 1; 
    if (numMoved > 0) 
     System.arraycopy(elementData, index+1, elementData, index,numMoved);  
     elementData[--size] = null; 
    } 
+0

什麼是不清楚的代碼?你有沒有在調試器中完成它?你有什麼不明白? –

+0

是的,我檢查調試器。當在列表中添加一個元素時,它會被追加,並且在刪除它時從最後一個元素中移除,這意味着它正在調整數組列表的大小。我試圖理解爲什麼它返回-2,0,2。我瞭解Set的情況,因爲它刪除了對象而不是索引元素。 –

+0

另外,我的問題給那些標記爲負面的人。我問錯誤的問題,人們是否認爲它是負面的? –

回答

0

響應於第一個問題,set.remove(i)調用Set#remove(Object),其通過刪除值的元素。 List也有一個remove(Object)方法(繼承自Collection),但由於iint,list.remove(i)解析爲更具體的List#remove(int),它通過索引刪除元素。

至於你的第二個問題,代碼是刪除給定索引處的元素,方法是將所有項左移左邊,然後遞減大小。有關詳細信息,請參閱javadoc至System#arraycopy()

+0

與@shmosel討論之後。一旦元素從列表中刪除,它**再次重新索引**列表,然後刪除基於索引的元素。因此將此標記爲答案。 –