1. はじめに
多くのアプリで、連絡先、設定、検索結果などのデータがリストとして表示されているのを目にしたことがあるかと思います。

しかし、これまでに記述したコードでは、主に 1 つの値(例: 画面に表示されている数字やテキスト)のみで構成されるデータを扱っています。任意の量のデータを使用するアプリをビルドするには、コレクションの使用方法を確認する必要があります。
コレクション型(データ構造)を使用すると、複数の値(通常は同じデータ型)を整理して保存できます。コレクションには、順序付きリスト、一意の値のグループ化、あるデータ型の値から別のデータ型の値へのマッピングなどがあります。コレクションを効果的に使用すると、スクロール リストなど、Android アプリの一般的な機能を実装できるほか、任意の量のデータが関連する現実のさまざまなプログラミングに関する問題を解決できます。
この Codelab では、コード内の複数の値を扱う方法について説明し、配列、リスト、セット、マップなど、さまざまなデータ構造を紹介します。
前提条件
- クラス、インターフェース、ジェネリックなど、Kotlin でのオブジェクト指向プログラミングに精通していること。
学習内容
- 配列を作成および変更する方法。
ListとMutableListの使用方法。SetとMutableSetの使用方法。MapとMutableMapの使用方法。
必要なもの
- Kotlin プレイグラウンドにアクセスできるウェブブラウザ。
2. Kotlin の配列
配列とは
配列は、プログラム内の任意の数の値をグループ化する最も簡単な方法です。
「ソーラーパネルをグループ化したソーラーアレイ(solar array)」、「プログラミング分野のキャリアの幅広い可能性(an array of possibilities)を切り開く Kotlin の学習」というように、Array は複数の値を表します。具体的には、配列はすべて同じデータ型を持つ一連の値です。

- 配列には要素またはアイテムと呼ばれる複数の値が含まれています。
- 配列内の要素は順序付けられ、インデックスでアクセスされます。
インデックスとは何でしょうか。インデックスは配列内の要素に対応する整数で、配列内の開始要素から各要素までの距離を示します。これを「ゼロ インデックス登録」と呼びます。配列の最初の要素はインデックス 0 に存在し、2 番目の要素は最初の要素から 1 つ目の場所にあることからインデックス 1 に存在します。以降の要素も同様に扱われます。

デバイスのメモリには、配列内の要素が隣接して保存されます。基礎となる詳細はこの Codelab の対象外ですが、配列には 2 つの重要な点があります。
- インデックスによる配列要素へのアクセスは高速です。配列の任意のランダム要素にはインデックスでアクセスできます。また、その際に要する時間は、他のランダム要素へのアクセスに要する時間とほぼ同じであると想定できます。これが、配列にランダム アクセスできるとされる理由です。
- 配列のサイズは固定されています。つまり、このサイズを超えて配列に要素を追加することはできません。100 個の要素が存在する配列では、最大インデックスが 99 であるため、インデックス 100 の要素にアクセスしようとすると例外がスローされます(前述のとおり、最初のインデックスは 1 ではなく 0 です)。ただし、配列のそれぞれのインデックスにある値は変更できます。
コード内で配列を宣言するには、arrayOf() 関数を使用します。

arrayOf() 関数は配列要素をパラメータとして受け取り、渡されたパラメータに一致する型の配列を返します。arrayOf() はパラメータの数が異なるため、他の関数とは若干異なる場合があります。2 つの引数を arrayOf() に渡すと、結果として得られる配列には、0 と 1 のインデックスが付加された 2 つの要素が含まれます。3 つの引数を渡すと、結果として得られる配列には、0 から 2 までのインデックスが付加された 3 つの要素が含まれます。
太陽系のほんの一部を探索して、実際の配列を確認しましょう。
- Kotlin のプレイグラウンドに移動します。
main()でrockPlanets変数を作成します。arrayOf()を呼び出して、String型と 4 つの文字列(太陽系の 4 つの岩石惑星)を渡します。
val rockPlanets = arrayOf<String>("Mercury", "Venus", "Earth", "Mars")
- Kotlin は型推論を使用するため、
arrayOf()を呼び出すときに型名を省略できます。rockPlanets変数の下に、別の変数gasPlanetsを追加します。このとき、山かっこで囲んだ型を渡す必要はありません。
val gasPlanets = arrayOf("Jupiter", "Saturn", "Uranus", "Neptune")
- 配列を使用すると、いくつかのスマートな処理を実施できます。たとえば、数値型
IntやDoubleと同様に、2 つの配列を加算できます。プラス(+)演算子を使用して、solarSystemという新しい変数を作成し、rockPlanetsとgasPlanetsを結合した結果と等しくなるように設定します。結果として、rockPlanets配列の要素とgasPlanets配列の要素をすべて含む新しい配列が生成されます。
val solarSystem = rockPlanets + gasPlanets
- プログラムを実行して動作することを確認します。まだ出力は表示されません。
配列内の要素にアクセスする
配列の要素にはインデックスでアクセスできます。

これはサブスクリプト構文と呼ばれます。これは次の 3 つの部分で構成されます。
- 配列の名前。
- 左角かっこ(
[)と右角かっこ(])。 - 角かっこ内の配列要素のインデックス。
solarSystem 配列の要素に、インデックスでアクセスしましょう。
main()で、solarSystem配列の各要素にアクセスして出力します。最初のインデックスは0、最後のインデックスは7です。
println(solarSystem[0])
println(solarSystem[1])
println(solarSystem[2])
println(solarSystem[3])
println(solarSystem[4])
println(solarSystem[5])
println(solarSystem[6])
println(solarSystem[7])
- プログラムを実行します。これらの要素は、
arrayOf()の呼び出し時に指定した順序と同じです。
Mercury Venus Earth Mars Jupiter Saturn Uranus Neptune
インデックスで配列要素の値を設定することもできます。

インデックスへのアクセスは前述の場合と同じ、配列の名前の後にインデックスを含む角かっこを付加します。その後に割り当て演算子(=)と新しい値を続けます。
solarSystem 配列の値を変更してみましょう。
- 将来移住する人達のために、火星に新しい名前を付けてみましょう。インデックス
3で要素にアクセスし、"Little Earth"に設定します。
solarSystem[3] = "Little Earth"
- インデックス
3で要素を出力します。
println(solarSystem[3])
- プログラムを実行します。配列の 4 番目の要素(インデックス
3)が更新されます。
... Little Earth
- 海王星よりも遠くに冥王星という 9 番目の惑星が存在することを天文学者が発見したとします。前述のとおり、配列のサイズを変更することはできません。サイズの変更を試みるとどうなるでしょうか。この惑星を
solarSystem配列に追加してみましょう。配列の 9 番目の要素であることから、惑星をインデックス8に追加します。
solarSystem[8] = "Pluto"
- コードを実行します。
ArrayIndexOutOfBounds例外がスローされます。想定どおり、配列にすでに 8 個の要素があるため、単純に 9 番目の要素を追加することはできません。
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 8 out of bounds for length 8
- 配列への惑星の追加を削除します。
削除するコード
solarSystem[8] = "Pluto"
- 配列をさらに大きくする場合は、新しい配列を作成する必要があります。次に示すように、
newSolarSystemという新しい変数を定義します。この配列では、要素を 8 個ではなく 9 個保存できます。
val newSolarSystem = arrayOf("Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune", "Pluto")
- インデックス
8の要素を出力してみましょう。
println(newSolarSystem[8])
- コードを実行し、例外が発生せずに動作することを確認します。
... Pluto
これで、配列の知識を活用して、コレクションに対してほぼあらゆる作業を行えるようになったのでしょうか。
いいえ、まだ他に確認すべきことがあります。配列はプログラミングの基本的な側面の一つですが、要素の追加や削除が必要なタスクに配列を使用すると、コレクションの一意性の確認や、他のオブジェクトに対するオブジェクトのマッピングが従来ほど単純ではなくなり、アプリのコードが早期の段階で煩雑化します。
そのため、Kotlin を含むほとんどのプログラミング言語では、特殊なコレクション型を実装することで、実際のアプリでよく遭遇する状況に対処できます。以降のセクションでは、List、Set、Map という 3 つの一般的なコレクションについて説明します。また、一般的なプロパティとメソッド、およびこれらのコレクション型を使用する状況についても説明します。
3. リスト
リストは、順序付けされたサイズ変更可能なコレクションであり、通常はサイズ変更可能な配列として実装されます。配列に空き容量がなくなり、新しい要素を挿入しようとすると、配列はより大きな新しい配列にコピーされます。

リストを使用すると、特定のインデックスで他の要素の間に新しい要素を挿入することもできます。

このような方法で、リストは要素を追加、削除できます。多くの場合、リスト内に存在する要素の数を問わず、要素をリストに追加するのに要する時間は同じです。まれに、新しい要素を追加することで配列が定義されたサイズを超えてしまう場合に、配列要素を移動して新しい要素用のスペースを確保する必要が生じることがあります。これはリストによってすべて自動的に処理されますが、背後では、この配列が必要に応じて新しい配列にスワップアウトされます。
List と MutableList
Kotlin で目にするコレクション型は、1 つ以上のインターフェースを実装します。このユニットの前の部分のジェネリック、オブジェクト、拡張機能の Codelab で説明したとおり、インターフェースは実装対象のクラスの標準的なプロパティとメソッドのセットを指定します。List インターフェースを実装するクラスは、List インターフェースのすべてのプロパティとメソッドの実装を行います。MutableList の場合も同様です。
List と MutableList の役割は何でしょうか。
Listは、アイテムの読み取り専用の順序付けされたコレクションに関連するプロパティとメソッドを定義するインターフェースです。MutableListは、要素の追加や削除など、リストを変更するメソッドを定義して、Listインターフェースを拡張します。
これらのインターフェースでは、List または MutableList(あるいはそれらの両方)のプロパティとメソッドのみを指定します。その拡張を行うクラスによって、プロパティとメソッドの実装方法がそれぞれ決定されます。上記の配列ベースの実装は、すべてではないにしても最も頻繁に使用するものですが、Kotlin では他のクラスが List と MutableList を拡張できます。
listOf() 関数
arrayOf() と同様に、listOf() 関数はアイテムをパラメータとして受け取りますが、配列ではなく List を返します。
main()から既存のコードを削除します。main()で、listOf()を呼び出してsolarSystemという惑星のListを作成します。
fun main() {
val solarSystem = listOf("Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune")
}
Listには、リスト内の要素の数を取得するsizeプロパティが存在します。solarSystemリストのsizeを出力します。
println(solarSystem.size)
- コードを実行します。リストのサイズは 8 であることが必要です。
8
リストから要素にアクセスする
配列と同様に、サブスクリプト構文を使用して List から特定のインデックスの要素にアクセスできます。get() メソッドを使用しても同じことができます。サブスクリプト構文と get() メソッドは、パラメータとして Int を受け取り、該当するインデックスの要素を返します。Array と同様に、ArrayList にはゼロのインデックスが付加されるため、たとえば、4 つ目の要素はインデックス 3 に存在します。
- サブスクリプト構文を使用してインデックス
2の惑星を出力します。
println(solarSystem[2])
solarSystemリストでget()を呼び出して、インデックス3の要素を出力します。
println(solarSystem.get(3))
- コードを実行します。インデックス
2の要素は"Earth"、インデックス3の要素は"Mars"です。
... Earth Mars
インデックスで要素を取得するだけでなく、indexOf() メソッドを使用して特定の要素のインデックスを検索することもできます。indexOf() メソッドは、指定された要素(引数として渡されます)のリストを検索し、その要素が最初に出現した位置のインデックスを返します。この要素がリストにない場合は、-1 を返します。
solarSystemリストのindexOf()を呼び出した結果を出力し、"Earth"を渡します。
println(solarSystem.indexOf("Earth"))
indexOf()を呼び出して"Pluto"を渡し、結果を出力します。
println(solarSystem.indexOf("Pluto"))
- コードを実行します。要素が
"Earth"と一致するため、インデックス2が出力されます。"Pluto"に一致する要素がないため、-1が出力されます。
... 2 -1
for ループを使用してリスト要素を反復処理する
関数型とラムダ式について説明した際に、repeat() 関数を使用してコードを複数回実行する方法を確認しました。
プログラミングでの一般的なタスクは、リスト内の要素ごとにタスクを 1 回実行することです。Kotlin には、簡潔で判読が容易な構文でこれを実現する for ループと呼ばれる機能があります。多くの場合に、これはリストのループまたはリストの反復処理と呼ばれます。

リストをループするには、for キーワードに続けて、開きかっこと閉じかっこの組み合わせを使用します。かっこ内に、変数名、in キーワード、コレクション名をこの順序で挿入します。閉じかっこの後には、開き中かっこと閉じ中かっこのペアがあります。このペアには、コレクション内の各要素に対して実行するコードを指定します。これをループの本文と呼びます。このコードのそれぞれの実行は、反復と呼ばれます。
in キーワードの前の変数が val または var で宣言されていません。これは読み取り専用であるとみなされます。任意の名前を付けることができます。リストに planets のような複数形の名前が指定されている場合、変数には単数形の名前(planet など)を付けるのが一般的です。変数に item や element という名前を付けることも一般的です。
これは、コレクション内の現在の要素(最初の反復処理の場合はインデックス 0 の要素、2 回目の反復処理の場合はインデックス 1 の要素、以降同様)に対応する一時変数として使用され、中かっこ内でアクセス可能です。
実際の動作を確認するため、for ループを使用して、各惑星名を別々の行に出力します。
main()の、println()への直近の呼び出しの下に、forループを追加します。かっこ内で、変数planetに名前を付け、solarSystemリストをループします。
for (planet in solarSystem) {
}
- 中かっこ内で、
println()を使用してplanetの値を出力します。
for (planet in solarSystem) {
println(planet)
}
- コードを実行します。ループ本文内のコードは、コレクション内の各アイテムに対して実行されます。
... Mercury Venus Earth Mars Jupiter Saturn Uranus Neptune
リストに要素を追加する
コレクションの要素を追加、削除、更新する機能は、MutableList インターフェースを実装するクラス専用です。新たに見つかった惑星を追跡している場合は、要素を高頻度でリストに追加できる機能が必要でしょう。具体的には、要素の追加と削除を行うリストを作成するときに、listOf() ではなく mutableListOf() 関数を呼び出す必要があります。
add() 関数には次の 2 つのバージョンがあります。
- 最初の
add()関数には、リスト内の要素の型のパラメータが 1 つ存在し、リストの最後に追加されます。 add()のもう一方のバージョンには 2 つのパラメータが存在します。最初のパラメータは、新しい要素が挿入されるインデックスに対応しています。2 つ目のパラメータはリストに追加される要素です。
実際に見てみましょう。
solarSystemの初期化を変更して、listOf()ではなくmutableListOf()を呼び出すようにします。MutableListで定義されたメソッドを呼び出すことができるようになりました。
val solarSystem = mutableListOf("Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune")
- ここでも、冥王星を惑星として分類する必要があります。
solarSystemに対してadd()メソッドを呼び出し、"Pluto"を単一の引数として渡します。
solarSystem.add("Pluto")
- 一部の天文学者は、テイアと呼ばれる惑星がかつて存在し、地球と衝突した結果、月が形成されたとする理論を主張しています。インデックス
3("Earth"~"Mars")に"Theia"を挿入します。
solarSystem.add(3, "Theia")
特定のインデックスの要素を更新する
既存の要素はサブスクリプト構文で更新できます。
- インデックス
3の値を"Future Moon"に更新します。
solarSystem[3] = "Future Moon"
- サブスクリプト構文を使用して、インデックス
3と9にある値を出力します。
println(solarSystem[3])
println(solarSystem[9])
- コードを実行して出力を確認します。
Future Moon Pluto
リストから要素を削除する
要素を削除するには、remove() メソッドまたは removeAt() メソッドを使用します。要素を remove() メソッドに渡すか、removeAt() を使用してインデックスで指定して削除できます。
要素を削除する両方の方法を実際に見てみましょう。
solarSystemに対してremoveAt()を呼び出し、インデックスに9を渡します。この操作を行うと、"Pluto"がリストから削除されます。
solarSystem.removeAt(9)
solarSystemに対してremove()を呼び出し、削除する要素として"Future Moon"を渡します。リストが検索され、一致する要素が見つかった場合は、削除されます。
solarSystem.remove("Future Moon")
Listは、要素がリスト内に存在する場合にBooleanを返すcontains()メソッドを指定します。"Pluto"に対してcontains()を呼び出した結果を出力します。
println(solarSystem.contains("Pluto"))
- より簡潔な構文として、
in演算子を使用する方法があります。要素がリストに含まれているかどうかを確認するには、要素、in演算子、コレクションを使用します。in演算子を使用して、solarSystemに"Future Moon"が含まれているかどうかを確認します。
println("Future Moon" in solarSystem)
- コードを実行します。どちらのステートメントでも、
falseが出力されます。
... false false
4. セット
セットは特定の順序を持たないコレクションであり、重複値を許可しません。

このようなコレクションはどのような仕組みでしょうか。シークレットはハッシュコードです。ハッシュコードは、Kotlin クラスの hashCode() メソッドで生成される Int です。これは、Kotlin オブジェクトの準一意識別子と考えることができます。String に 1 文字を追加するなど、オブジェクトを若干変更するだけでも、ハッシュ値が大きく変化します。2 つのオブジェクトが同じハッシュコードを持つことは可能です(ハッシュの競合と呼ばれます)が、hashCode() 関数では一定の一意性が保証されます。ほとんどの場合、2 つの異なる値はそれぞれに一意のハッシュコードを持ちます。

セットには次の 2 つの重要なプロパティがあります。
- リストに比べて、セット内の特定の要素をすばやく検索できます(特に大規模なコレクションの場合)。
ListのindexOf()では、一致が見つかるまで各要素を先頭からチェックする必要がありますが、チェックに要する時間は平均すると、要素が(最初の要素であるか、数十万番目の要素であるかを問わず)セットに存在するかどうかのチェックに要する時間と変わりません。 - セットでは、同じデータ量のリストよりも多くのメモリを使用する傾向があります。これは、たいていの場合、セット内のデータよりも多くの配列インデックスを必要とするためです。
セットのメリットは一意性を確保できることです。新たに発見された惑星を追跡するプログラムを作成する場合は、このセットを使用することで、すでに発見されている惑星であるかどうかを簡単に確認できます。大量のデータが存在する場合、たいていは、要素がリストに存在するかどうかのチェック(すべての要素の反復処理を必要とします)よりも適した処理方法です。
List や MutableList と同様に、Set と MutableSet があります。MutableSet は Set を実装するため、MutableSet を実装するクラスは両方を実装する必要があります。

Kotlin で MutableSet を使用する
この例では、要素を追加または削除する方法を示すために MutableSet を使用します。
main()から既存のコードを削除します。mutableSetOf()を使用してsolarSystemという惑星のSetを作成します。これはMutableSetを返します。デフォルトの実装はLinkedHashSet()です。
val solarSystem = mutableSetOf("Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune")
sizeプロパティを使用してセットのサイズを出力します。
println(solarSystem.size)
MutableListと同様に、MutableSetにはadd()メソッドがあります。add()メソッドを使用して、solarSystemセットに"Pluto"を追加します。追加する要素に対して 1 つのパラメータのみを受け取ります。セット内の要素は必ずしも順序を持たないため、インデックスはありません。
solarSystem.add("Pluto")
- 要素を追加した後、セットの
sizeを出力します。
println(solarSystem.size)
contains()関数は単一のパラメータを受け取り、指定された要素がセットに含まれているかどうかを確認します。含まれている場合は true を返します。それ以外の場合は false を返します。contains()を呼び出して、"Pluto"がsolarSystemに含まれているかどうかを確認します。
println(solarSystem.contains("Pluto"))
- コードを実行します。サイズが拡大し、
contains()がtrueを返すようになりました。
8 9 true
- 前述のとおり、セットに重複する内容を含めることはできません。
"Pluto"をもう一度追加してみてください。
solarSystem.add("Pluto")
- セットのサイズを再度出力します。
println(solarSystem.size)
- コードをもう一度実行します。
"Pluto"はすでにセットに含まれているため、追加されません。今回はサイズは拡大されません。
... 9
remove() 関数は単一のパラメータを受け取り、指定された要素をセットから削除します。
remove()関数を使用して"Pluto"を削除します。
solarSystem.remove("Pluto")
- コレクションのサイズを出力し、
contains()を再度呼び出して、"Pluto"がまだセットにあるかどうかを確認します。
println(solarSystem.size)
println(solarSystem.contains("Pluto"))
- コードを実行します。
"Pluto"はセットに含まれなくなり、サイズは 8 になりました。
... 8 false
5. コレクションをマッピングする
Map は、キーと値で構成されるコレクションです。一意のキーは他の値にマッピングされるため、「マップ」と呼ばれます。キーとその付随する値は多くの場合、key-value pair と呼ばれます。

マップのキーは一意です。ただし、マップの値は一意ではありません。2 つの異なるキーが同じ値にマッピングされている可能性があります。たとえば、"Mercury" には 0 個の衛星が存在し、"Venus" には 0 個の衛星が存在します。
キーを使用してマップから値にアクセスする場合は、通常、大規模なリスト(indexOf() など)で検索するよりも高速です。
マップは、mapOf() 関数または mutableMapOf() 関数を使用して宣言できます。マップには、カンマで区切られた 2 つの汎用型が必要です。1 つはキー用、もう 1 つは値用です。

初期値がある場合は、マップでも型推論を使用できます。マップに初期値を設定するには、各 Key-Value ペアの構成要素としてキー、to 演算子、値をこの順序で設定します。各ペアをカンマで区切ります。

マップの使用方法、いくつかの有用なプロパティとメソッドについて詳しく見てみましょう。
main()から既存のコードを削除します。- 次に示すように、初期値に
mutableMapOf()を使用してsolarSystemというマップを作成します。
val solarSystem = mutableMapOf(
"Mercury" to 0,
"Venus" to 0,
"Earth" to 1,
"Mars" to 2,
"Jupiter" to 79,
"Saturn" to 82,
"Uranus" to 27,
"Neptune" to 14
)
- リストやセットと同様に、
Mapには Key-Value ペアの数を含むsizeプロパティがあります。solarSystemマップのサイズを出力します。
println(solarSystem.size)
- サブスクリプト構文を使用して、追加の Key-Value ペアを設定できます。キー
"Pluto"の値を5に設定します。
solarSystem["Pluto"] = 5
- 要素を挿入した後に、サイズを再度出力します。
println(solarSystem.size)
- 値を取得するには、サブスクリプト構文を使用します。キー
"Pluto"の衛星の数を出力します。
println(solarSystem["Pluto"])
get()メソッドを使用して値にアクセスすることもできます。サブスクリプト構文を使用する場合でも、get()を呼び出す場合でも、渡したキーがマップに存在しない可能性があります。Key-Value ペアが存在しない場合は null が返されます。"Theia"の衛星の数を出力します。
println(solarSystem.get("Theia"))
- コードを実行します。冥王星の衛星の数が出力されます。ただし、テイアはマップに存在しないため、
get()を呼び出すと null が返されます。
8 9 5 null
remove() メソッドは、指定されたキーを持つ Key-Value ペアを削除します。指定されたキーがマップに存在しない場合は、削除された値(null)を返します。
remove()を呼び出して"Pluto"を渡した結果を出力します。
solarSystem.remove("Pluto")
- アイテムが削除されたことを確認するため、サイズを再度出力します。
println(solarSystem.size)
- コードを実行します。エントリを削除した後のマップのサイズは 8 です。
... 8
- サブスクリプト構文(
put()メソッド)でも、既存のキーの値を変更できます。サブスクリプト構文を使用して木星の衛星を 78 個に更新し、新しい値を出力します。
solarSystem["Jupiter"] = 78
println(solarSystem["Jupiter"])
- コードを実行します。既存のキー
"Jupiter"の値が更新されます。
... 78
6. まとめ
お疲れさまでした。プログラミングにおける最も基本的なデータ型である配列と、List、Set、Map などの配列から構築されたいくつかの有用なコレクション型について学ぶことができました。これらのコレクション型を使用すると、コード内の値をグループ化して整理できます。配列やリストを使用すると、インデックスで要素にすばやくアクセスできます。一方で、セットとマップはハッシュコードを使用してコレクション内の要素の検出を容易にします。こうしたコレクション型は今後のアプリで頻繁に使用されるため、その使用方法を理解しておくことは将来のプログラミング分野のキャリアに対して有効です。
概要
- 配列は同じ型の順序付きデータを格納し、サイズは固定されています。
- 配列は、他の多くのコレクション型を実装するために使用されます。
- リストはサイズ変更可能な順序付きコレクションです。
- セットは順序付けられていないコレクションであり、重複した内容を含めることはできません。
- マップの動作はセットと類似しており、指定された型のキーと値のペアを保存します。