Kotlinの Array(配列) は、同じ型のデータを一定数まとめて管理するための基本的なデータ構造です。
Javaと互換性を持ちながら、Kotlinの型システムと標準ライブラリの拡張関数によって柔軟に扱うことができます。
この記事では、KotlinのArrayについて以下のポイントを詳しく解説します。
KotlinのArrayとは
KotlinのArrayとは、同じ型またはそのサブタイプの値を固定数格納するデータ構造です。
特徴は次の通りです。
- 要素数(サイズ)は作成時に決まり、変更できない
- 各要素はインデックスでアクセスする
- 要素の値は変更可能
- Kotlinでは
Array<T>というジェネリッククラスとして定義されている
例
val fruits = arrayOf("Apple", "Banana", "Orange")
配列の内部構造は次のようになります。
Index Value
0 Apple
1 Banana
2 Orange
インデックスは 0から始まる ことに注意してください。
Arrayの基本的な作り方
Kotlinでは配列を作成する方法が複数あります。
arrayOf()
もっとも基本的な方法です。
val numbers = arrayOf(1, 2, 3, 4, 5)
型は自動推論されます。
Array<Int>
文字列の場合
val names = arrayOf("Tanaka", "Sato", "Suzuki")
型を明示して作成
val numbers: Array<Int> = arrayOf(1, 2, 3)
型を明示するとコードの可読性が上がる場合があります。
空の配列を作成
val empty = emptyArray<String>()
型を指定して空配列を作ることができます。
nullを許容する配列
val array = arrayOfNulls<String>(3)
結果
[null, null, null]
要素の取得と変更
配列の要素には インデックス を使ってアクセスします。
要素の取得
val fruits = arrayOf("Apple", "Banana", "Orange")
println(fruits[0])
出力
Apple
要素の変更
配列はサイズは固定ですが、要素の値は変更できます。
fruits[1] = "Grape"
結果
[Apple, Grape, Orange]
get / set
次の書き方は内部的に同じ意味になります。
fruits.get(0)
fruits.set(1, "Grape")
Arrayのループ処理
配列はループと組み合わせて使われることが多いです。
for文
for (fruit in fruits) {
println(fruit)
}
インデックスを使う
for (i in fruits.indices) {
println(fruits[i])
}
indices は配列のインデックス範囲を表します。
withIndex()
for ((index, value) in fruits.withIndex()) {
println("$index : $value")
}
出力
0 : Apple
1 : Banana
2 : Orange
Arrayの初期化方法
Kotlinではラムダ式を使った配列生成が可能です。
構文
Array(size) { index -> 初期値 }
例
val numbers = Array(5) { i -> i * 2 }
結果
[0, 2, 4, 6, 8]
計算結果を使って配列を初期化できるのが特徴です。
プリミティブ配列
Kotlinには2種類の配列があります。
オブジェクト配列
Array<Int>
Array<String>
これはオブジェクト型の配列です。
プリミティブ配列
数値型には専用配列があります。
| 型 | 配列 |
|---|---|
| Int | IntArray |
| Double | DoubleArray |
| Float | FloatArray |
| Long | LongArray |
| Boolean | BooleanArray |
| Char | CharArray |
例
val numbers = intArrayOf(1, 2, 3, 4)
型
IntArray
なぜプリミティブ配列があるのか
JVMでは
Array<Int>
を使うと、値は ボクシング(Integerオブジェクト化) されます。
そのため
- メモリ消費が増える
- 処理速度が低下する可能性がある
この問題を避けるために
IntArray
のようなプリミティブ配列が用意されています。
Arrayの便利な関数
Arrayは多くの標準関数を利用できます。
size
println(fruits.size)
first / last
fruits.first()
fruits.last()
contains
fruits.contains("Apple")
joinToString
println(fruits.joinToString())
結果
Apple, Banana, Orange
sort
numbers.sort()
map
val numbers = arrayOf(1, 2, 3)
val doubled = numbers.map { it * 2 }
結果
[2, 4, 6]
ただし重要なポイントがあります。
map() の戻り値は Arrayではなく List です。
つまり型は次になります。
List<Int>
ArrayとListの違い
Kotlinでは配列よりもコレクションAPI(Listなど)がよく使われます。
しかしArrayとListは役割が異なります。
| 特徴 | Array | List |
|---|---|---|
| サイズ | 固定 | 読み取り専用 |
| 要素変更 | 可能 | 不可 |
| 追加削除 | 不可 | 不可 |
可変リストは MutableList です。
val list = mutableListOf(1,2,3)
list.add(4)
まとめると
| 型 | 特徴 |
|---|---|
| Array | 固定サイズ |
| List | 読み取り専用 |
| MutableList | 要素追加・削除可能 |
実務でのArrayの使い分け
Kotlinでは日常的なデータ操作では
List / MutableList
がよく使われます。
一方、Arrayは次の場面で重要です。
Javaとの相互運用
JavaのAPIでは配列が多く使われます。
固定サイズデータ
例
- RGB値
- 行列
- センサー値
高速処理
数値計算では
IntArray
DoubleArray
などのプリミティブ配列が有利です。
まとめ
KotlinのArrayのポイントを整理すると次の通りです。
Array<T>は固定サイズの配列クラスarrayOf()で配列を作成できるArray(size) {}で初期化可能- 要素の変更は可能だがサイズ変更は不可
- 数値型には
IntArrayなどのプリミティブ配列がある map()などの変換操作は Listを返す場合が多い- Kotlinでは一般的なデータ処理には
List/MutableListがよく使われる
以上、KotlinのArrayについてでした。
最後までお読みいただき、ありがとうございました。










