私はJavaを理解しようとしています。
ArrayList
サイズが50で、いくつかの名前が事前に入力されていると仮定します。
配列リストから3番目と4番目の要素を削除するとします。配列リストはどうなりますか?再配置されますか?削除された3番目と4番目の要素にアクセスしようとすると、nullが返されますか?
私はJavaを理解しようとしています。
ArrayList
サイズが50で、いくつかの名前が事前に入力されていると仮定します。
配列リストから3番目と4番目の要素を削除するとします。配列リストはどうなりますか?再配置されますか?削除された3番目と4番目の要素にアクセスしようとすると、nullが返されますか?
いいえ、削除しようとしている要素の後の要素は左にシフトされるため(高価な操作)、穴はありません。
補足として、3番目の要素を削除すると、5番目の要素が左にシフトされるため、後で4番目の要素を削除すると、代わりに開始コレクションの5番目の要素が削除されます。2つの連続する要素を削除するには、同じインデックスを2回指定する必要があります。
それらは再配置され、シフトされます。
代わりにそれらを返すようにしたい場合はnull
、削除する要素を削除するのではなく、削除する要素を明示的にnullに設定するだけです。
なぜ自分で試してみなかったのですか?
List<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
list.add("F");
list.add("G");
for(int i = 0; i < list.size(); i++) System.out.println("index " + i + ": " + list.get(i));
System.out.println();
list.remove(0); // remove "A"
for(int i = 0; i < list.size(); i++) System.out.println("index " + i + ": " + list.get(i));
出力:
index 0: A
index 1: B
index 2: C
index 3: D
index 4: E
index 5: F
index 6: G
index 0: B
index 1: C
index 2: D
index 3: E
index 4: F
index 5: G
実際には、両方のオプションを利用できます。
final List<Character> x = new ArrayList<Character>(asList('a', 'b', 'c', 'd'));
x.set(1, null); // removes an element without shifting
x.remove(0); // removes an element with shifting
System.out.println(x);
プリント
[null, c, d]
配列リスト要素が再配置されます
ArrayListは、インデックスで参照できるアイテムの連続リストです。したがって、アイテムを削除すると、後続のすべてのアイテムがシフトされます。
要素がシフトされます。
ArrayListの削除についてはjavadocを参照してください。
java.util.ArrayList
public E remove(int index)
Removes the element at the specified position in this list. Shifts any subsequent elements to the left (subtracts one from their indices).
Specified by:
remove in interface List
Overrides:
remove in class AbstractList
Parameters:
index - the index of the element to be removed
Returns:
the element that was removed from the list
Throws:
IndexOutOfBoundsException -
removeメソッドのjavadocによると、残りのエントリはシフトバックされるため、ギャップはありません。
通常、サイズを定義せずに、Javaコレクションを動的ストレージとして使用します。
List<String> list = new ArrayList<String>(); //dynamic
静的な事前定義されたコレクションの場合、Java配列を使用します。
String[] array = new String[50]; //static