"ここにいるよ。"

「こんにちは、エリー!」

「今日は興味深いトピックについて話します。ArrayListクラスについて話します。」

「新しいクラス? すごい! 何ができるの?」

「裏話から始めましょう。プログラマーが配列に関して嫌う唯一のことは、配列のサイズを変更できないことです。空きスロットが 1 つしかない配列にさらに 3 つの要素を追加する必要がある場合はどうしますか?

「この問題に対する唯一の解決策は、すべての要素に十分なスペースを確保するために、非常に大きな配列を作成することです。しかし、これは多くの場合、メモリの無駄を意味します。配列には通常 3 つの要素が含まれていますが、その可能性がわずかでもある場合、 100 個の要素を収容する必要がある場合は、100 要素の配列を作成する必要があります。」

「それで、プログラマーは何を思いついたのでしょうか?」

「彼らはArrayListクラスを作成しました。これは Array と同じことを行いますが、サイズを変更できます。」

「興味深い動きですね。どうやってそんなことをしたのですか?」

「すべてのArrayListオブジェクトには、要素の通常の配列が格納されます。 ArrayListから要素を読み取るときは、要素をその内部配列から読み取ります。要素をArrayListに書き込むときは、要素を内部配列に書き込みます。ここで、次の列を比較します。」

配列 配列リスト
要素のコンテナを作成する
String[] list = new String[10];
ArrayList<String> list = new ArrayList<String>();
要素数を取得する
int n = list.length;
int n = list.size();
配列/コレクションから要素を取得する
String s = list[3];
String s = list.get(3);
要素を配列に書き込む
list[3] = s;
list.set(3, s);

「それでは、なぜ ArrayList の方が優れているのでしょうか? 私の知る限り、コードが長くなったからです。」

「まず、ArrayList は、プログラマーが常に実行する必要がある追加の操作をいくつかサポートしています。通常の配列は、これらの操作をサポートしていません。たとえば、穴を残さずに配列の中央に要素を挿入または削除するなどです。

「2 番目に、配列のサイズを変更する機能です。要素をもう 1 つ追加する必要があるが、内部配列に空きスロットがない場合、 ArrayList 内では次のようになります

a)現在の内部配列より 50% 大きい別の配列と 1 つの要素が作成されます。

b)古い配列のすべての要素が新しい配列にコピーされます。

c)新しい配列が ArrayList オブジェクトの内部配列として保存されます。古い配列はガベージと宣言されます(単に参照の保存を停止するだけです)。」

配列 配列リスト
配列の最後に要素を追加します
このアクションはサポートされていません
list.add(s);
配列の途中に要素を追加します
このアクションはサポートされていません
list.add(15, s);
配列の先頭に要素を追加します
このアクションはサポートされていません
list.add(0, s);
配列から要素を削除する
を使用して要素を削除できますlist[3] = null。しかし、これでは配列に「穴」が残ります。
list.remove(3);

「この ArrayList をどのように操作すればよいでしょうか?」

「実際には、通常の配列の場合と同じです。見てください。ArrayList の操作と配列の操作を比較してみましょう。「10 個の文字列を読み取り、それらを逆の順序で画面に表示する」必要があるとします

「これを見てください:

配列あり
public static void main(String[] args)
{
Reader r = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(r);

// Read strings from the keyboard
String[] list = new String[10];
for (int i = 0; i < list.length; i++)
{
  String s = reader.readLine();
  list[i] = s;
}

// Display the contents of the array
for (int i = 0; i < list.length; i++)
{
  int j = list.length - i - 1;
  System.out.println( list[j] );
}
}
ArrayList を使用する場合
public static void main(String[] args)
{
Reader r = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(r);

// Read strings from the keyboard
ArrayList&ltString> list = new ArrayList&ltString>();
for (int i = 0; i < 10; i++)
{
  String s = reader.readLine();
  list.add(s);
}

// Display the contents of the collection
for (int i = 0; i < list.size(); i++)
{
  int j = list.size() - i - 1;
  System.out.println( list.get(j) );
}
}

各列で同様のアクションを強調表示するために同じ色を使用しました。」

「一方では、すべてが変わっていますが、他方では、それは依然として同じです。」

「そうです。ただし、 ArrayList を操作するときに角括弧は使用しません。代わりに、 getset 、およびaddメソッドを使用します。」

「はい、これだけ集めました。それでも、見た目はほとんど同じです。」