2017-01-23 18 views
-2

私はjava.utilパッケージから2つのコレクションを持っています。当初は少数の要素しか追加されていませんでしたが、要素を削除しました。ここでは2つのことを理解しようとしています。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] 

はQuestion2:要素を除去するためのJavaソースの実装コードを見てみます。ソースコードの下でどのように理解できますか?値によって要素を除去する、Set#remove(Object)を呼び出しset.remove(i)あなたの最初の質問に応答して

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

Listremove(Object)メソッド(Collectionから継承)を持ちますが、iintなので、list.remove(i)はより具体的にはList#remove(int)になり、インデックスで要素を削除します。

2番目の質問では、コードは、すべてのアイテムを左に移動してサイズを減らすことによって、指定されたインデックスの要素を削除しています。詳細はjavadocのSystem#arraycopy()を参照してください。

+0

@shmoselとの議論の後。要素がリストから削除されると、リストが再び索引付けされ、インデックスベースの要素が削除されます。したがってこれを答えとしてマークします。 –