こんにちは!フリーランスのオータケです。
配列やListを扱っていて配列とListの違いがイマイチわからないといったことはありませんか?
さらにArrayListを使っていて途中から配列に変換したいと思ったことはありませんか?
この記事では、
・配列とListの違い
という基本的な内容から
・配列からList(Listから配列)へ変換する方法
など具体的な内容についても解説していきます。
今回は配列からListへ変換する方法やListから配列へ変換する方法について、使い方をわかりやすく解説します!
なお、Javaの記事については、こちらにまとめています。
配列とListの違い
配列の構造の違い
Javaでは配列という仕組みが存在しています。
この配列は初期化した時点で配列の大きさ(要素数)を決める必要があります。
そしてこの配列は大きさを決めたら変更することができません。
そのため後から大きさを変更したいとなった場合には更に大きいサイズの配列を用意してそちらに移し替えてあげる必要があります。
対してListはプログラマがある程度、任意のタイミングでサイズを変更することができます。
また配列内のデータを操作する際にはArraysのメソッドを使う必要がありますが、Listの場合は標準で便利なメソッドが実装されています。
ですので、Listは配列と比べるととても扱いやすい仕組みになっています。
Javaを扱う上でListは覚えなければならない要素と言えます!
宣言(定義)の違い
配列とListでは宣言方法に違いがあります。
たとえば、int型の配列を宣言するには下記のように書きます。
int[] ary; int ary[];
ではListの場合を見てみましょう。
Listのなかでも、配列に最も扱い方が近いArrayListについてみてみましょう。
ArrayList<Integer> list;
書き方が全く違いますね。
Listの場合はArrayListというクラスを使うためArrayListと書かなければなりません。
そしてそのArrayListの横についている<>でどんなデータを扱うかの型を指定しています。
またListの場合はこの型を指定する際にプリミティブ型(基本型)は利用できない仕組みになっています。
プリミティブ型とはintやfloat、charといったJavaに備わっている基本の型です。
ではどうすればいいのかというと、
・int型の場合はInteger
・float型の場合はFloat
といった形で代替可能なクラスが用意されているためそれを利用することになります。
代替可能なクラスのことをラッパークラスといいます。
Listには他にも、LinkedListという種類のものやHashMapといった種類の物があります。
それぞれを使う際には
LinkedList<Integer> list;
や
HashMap<String, Integer> map;
といった書き方をします。
LinkedListやHashMapについては配列とは違う使い方をするためここでは解説しませんが興味があったら是非調べてみて下さい。
ArrayListで二次元配列を宣言する方法
二次元配列を宣言しようとした場合次のような書き方になると思います。
int[][] ary;
または
int ary[][];
しかし、これがArrayListの場合はどうなるのでしょうか?
ArrayList<ArrayList<Integer>> list;
ちょっと複雑ですね。
書き方としてはArrayList(一次元配列)の中にArrayList(一次元配列)が入っていて二次元配列を実現しているという仕組みになります。
配列からList(Listから配列)へ変換する
配列からListへ
配列からListへ変換するには、asListメソッドを使います。
asListメソッドの引数に変換したい配列を渡すことで変換した結果を戻り値として返します。
サンプルコードで確認しましょう。
import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { Integer[] hoge = {0, 1, 2, 3, 4}; //Listに変換する場合 List<Integer> foo = Arrays.asList(hoge); String str = ""; for(int i = 0; i < foo.size(); i++) { str += foo.get(i) + ", "; } System.out.println(str); //ArrayListに変換する場合 ArrayList<Integer> bar = new ArrayList<Integer>(Arrays.asList(hoge)); str = ""; for(int i = 0; i < bar.size(); i++) { str += bar.get(i) + ", "; } System.out.println(str); } }
実行結果:
0, 1, 2, 3, 4, 0, 1, 2, 3, 4,
このサンプルコードでは、配列をListとArrayListに変換しています。
Listに変換する場合は注意が必要です。
Listに変換する際にIntegerクラスの配列となっていますがint型の配列の場合はエラーが出て実行することが出来ません。
「宣言(定義)の違い」でも書きましたがArrayListはプリミティブ型を扱うことができないと書きました。
そのためasListメソッドについてもプリミティブ型が使えずIntegerのようなラッパークラスを使う必要があります。
さらにもう一点注意すべきこととして、このasListを使って生成されたListはサイズの変更ができないという変わったListを返してきます。
変換後のListのサイズは指定した配列の要素数で固定されます。
これに対して、ArrayListで変換する場合はasListで変換した配列を元に新しくArrayListを生成しているためサイズの変更が可能となっています。
Listから配列へ
では次にListから配列への変換方法を見てみましょう。
ListのtoArrayメソッドを使うことでListから配列へ変換することが可能です。
サンプルコードで確認しましょう。
import java.util.ArrayList; public class Main { public static void main(String[] args) { ArrayList<Integer> foo = new ArrayList<Integer>(); foo.add(1); foo.add(2); foo.add(3); int size = foo.size(); Integer[] bar = foo.toArray(new Integer[size]); String str = ""; for(int i = 0; i < size; i++) { str += bar[i] + ", "; } System.out.println(str); } }
実行結果:
1, 2, 3,
このサンプルコードのnew Integer[10]のように記述して配列へ変換します。
配列を宣言する場合にもnew Integer[10]のように記述しますが、その部分が引数になったと覚えておくとわかりやすいのかもしれません。
配列についてもっと詳しく知りたい!
配列についてもっと知りたい方はこちらもご覧ください!
まとめ
いかがだったでしょうか?
配列は固定長(大きさを変えることができないもの)であり、Listは可変長(大きさの変更が可能)ということを学びました。
さらに配列からListへの変換にはArraysのasListを使うことで変換することが可能です。
逆にListから配列に変換する場合はListのtoArrayメソッドを使うことで変換することができます。
もし配列とListの違いがわからなくなったり、配列⇔Listの変換方法がわからなくなった場合はこの記事を見て思い出して下さい!