検索

キーワード


【Java】配列と ArrayListの関係と違いについて解説! 配列同士のの比較方法とは?

  • 公開日:2020-10-09 05:34:28
  • 最終更新日:2021-01-25 17:53:22
【Java】配列と ArrayListの関係と違いについて解説! 配列同士のの比較方法とは?



こんにちは。

駆け出しプログラマーの松倉です!

ここでは、配列と ArrayListの関係と違い、また配列の比較の使い方について紹介・解説します。

配列の基本から学びたい方は関連記事リンク先の記事で学習しましょう。

プログラミング未経験の方、Javaについて勉強している方、これから勉強したいと思っている方の参考になれば幸いです! 

関連記事リンク:【Java】たくさんのデータをまとめよう! 配列の基本と使い方を解説!【Java】配列のコピーの使い方を解説! Shallowコピーと Deepコピーの違いとは?【Java】ArrayList, LinkedList, Vector の違いと代表的な8つのメソッド【Java】intとInteger?何が違う?『ラッパークラス』の疑問を解決!!


Arraysクラス

Arraysクラスは配列を操作するユーティリティクラスです。

Arraysクラスには配列の作成、比較、ソート、検索、ストリーミング、変換など、配列を操作するための様々なメソッドが用意されています。


ここでは Arraysクラスついて以下のことを紹介・解説を行います。

  • 配列と ArrayListの関係・違い
  • 配列のソート(sortメソッド)
  • 比較(Arrays.equals, deepEquals, compare)



配列と ArrayListの関係・違い

配列とは同じ型のデータを複数もつことができるオブジェクトです。

配列は初期化する時点で配列の要素数を決める必要があります

初期化の時点で配列に格納できる要素数が決まるため、初期化後に要素数を変更することはできません。

決められた要素数を超える要素を格納しようとすると、「IndexOutOfBoundsExceptionエラー」が発生します。


ArrayList持つ特長は配列と非常によく似ています。

ArrayListは Listのインタフェースを実装したクラスです。

配列も ArrayListも最初に要素を入れるための入れ物を生成します。

このときにどちらも入れ物の中にどんな型の要素を入れるかを定義しなければなりません。


ArrayListと配列との違いとして ArrayListは初期化の時点で要素数を決める必要が無いため、要素の追加、削除を行う事で要素数を変更できます。

そのため、配列の要素数が決まっていない(変動する)場合には ArrayListが使われます。

また ArrayListは intや booleanなどのプリミティブ型を入れることができません。

プリミティブ型の値を ArrayListの要素に格納したい場合は、プリミティブ型に対応するラッパークラスを指定する必要があります。

プリミティブ型である intをArrayListを宣言する場合、intに対応するラッパークラスの Integerを型に指定することで扱うことができます。


配列と ArrayListを使ったサンプルコードを確認しましょう。

import java.util.ArrayList;

public class Sample1 {
	public static void main(String[] args) {
		System.out.println("---配列---");
		int[] n = { 3, 1, 4 };

		for (int i = 0; i < n.length; i++) {
			System.out.println(n[i]);
		}

		System.out.println("---ArrayList---");
		ArrayList<Integer> array = new ArrayList<Integer>();

		array.add(3);
		array.add(1);
		array.add(4);
		System.out.println(array);
	}
}


実行結果:

---配列---
3
1
4
---ArrayList---
[3, 1, 4]

配列と ArrayListの使い方の違いが確認出来ました。



配列のソート(sortメソッド)

配列や ArrayListを扱っていると要素の数が多くなり、ソートが必要になることがあります。

配列のソートと ArrayListのソートでは方法が異なります。



配列のソート

配列の要素のソートする方法はいくつかありますが、 Arraysクラスでは「sortメソッド」を使うことで簡単にソートを行うことができます

sortメソッドは Arraysクラスのメソッドのため、必ず「java.util.Arrays」をインポートしましょう。


配列の sortメソッド(昇順)の使い方

Arrays.sort(配列);

sortメソッドは元の配列にソート後の配列を上書きします。

そのためソート前の配列を残したい場合は別に配列をコピーをしておく必要があります。


Arraysクラスの sortメソッドは基本的に昇順でソートが行われ、プリミティブ配列を降順に並べ替えるために直接使用することはできません。

そのため配列を降順にソートする場合、sortメソッドの 2つ目の引数に「Collectionsクラス」の「Collections.reverseOrderメソッド」を引数に指定する事で簡単に降順にすることができます。



配列の sortメソッド(降順)の使い方

Arrays.sort(配列, Collections.reverseOrder());

「Collections.reverseOrderメソッド」の戻り値を引数に指定してソートを行う場合は、配列の要素が Stringや Integerのようなラッパークラスである必要があります。

int型などのプリミティブ型を指定するとコンパイルエラーが発生するので注意しましょう。

Collections.reverseOrderメソッドは Collectionsクラスのメソッドのため、必ず「java.util.Collections」をインポートしましょう。

ラッパークラスについてはこちらのサイトをご覧ください。


sortメソッドを使った配列のソートのサンプルコードを確認しましょう。

import java.util.Arrays;
import java.util.Collections;

public class Sample2_1 {
	public static void main(String[] args) {
		Integer[] array = { 29, 13, 19, 17, 11, 23 };
		System.out.println("ソート前");
		System.out.println(Arrays.toString(array));

		System.out.println("\nソート後(昇順)");
		Arrays.sort(array);
		System.out.println(Arrays.toString(array));

		System.out.println("\nソート後(降順)");
		Arrays.sort(array, Collections.reverseOrder());
		System.out.println(Arrays.toString(array));
	}
}


実行結果:

ソート前
[29, 13, 19, 17, 11, 23]

ソート後(昇順)
[11, 13, 17, 19, 23, 29]

ソート後(降順)
[29, 23, 19, 17, 13, 11]

sortメソッドを利用することで、配列のソートが行われたことが確認出来ました。



ArrayListのソート

ArrayListのオブジェクトの要素を昇順でソートするには、「Collectionsクラス」の「sortメソッド」を使用します。

ArrayListは Listのインタフェースを実装したクラスです。

List(リスト)とは、重複した要素を含むことができる順序の付けられたコレクションです。

追加や削除が行われてもデータがきちんと整理されて、順番に並べられるという意味になります。

そのため、ユーザーはインデックスによって要素を挿入したり要素にアクセスしたりする位置を自由に変更することができます。


ArrayListの sortメソッド(昇順)の使い方

Collections.sort(リスト);


降順で並び替えるには sortメソッドの第2引数に Collectionsクラスの reverseOrderメソッドを指定します。

ArrayListの sortメソッド(降順)の使い方

Collections.sort(リスト, Collections.reverseOrder());

Collections.reverseOrderメソッドは Collectionsクラスのメソッドのため、必ず「java.util.Collections」をインポートしましょう。


sortメソッドを使った ArrayListのソートのサンプルコードを確認しましょう。

import java.util.ArrayList;
import java.util.Collections;

public class Sample2_2 {
	public static void main(String[] args) {
		ArrayList<Integer> list = new ArrayList<>();

		list.add(29);
		list.add(13);
		list.add(19);
		list.add(17);
		list.add(11);
		list.add(23);

		System.out.println("ソート前");
		System.out.println(list);

		System.out.println("\nソート後(昇順)");
		Collections.sort(list);
		System.out.println(list);

		System.out.println("\nソート後(降順)");
		Collections.sort(list, Collections.reverseOrder());
		System.out.println(list);
	}
}


実行結果:

ソート前
[29, 13, 19, 17, 11, 23]

ソート後(昇順)
[11, 13, 17, 19, 23, 29]

ソート後(降順)
[29, 23, 19, 17, 13, 11]

sortメソッドを利用することで、 ArrayListのソートが行われたことが確認出来ました。



比較(equalsメソッド, deepEqualsメソッド, compareメソッド)

Arraysクラスには 2つの配列が等しいかどうかを比較するメソッドが用意されています。

Arraysクラスでは「equalsメソッド」、「deepEqualsメソッド」、「compareメソッド」のいずれかを使うことで配列の比較を行うことができます。


equalsメソッド

2つ配列が等しいか比較する場合は「equalsメソッド」を使います。

戻り値は boolean型です。

指定された 2つ配列が互いに同等である場合に trueを返します。

2つの配列が nullの場合にも trueとなります。

サイズと内容が単純な配列の比較にしか使うことができないため、ネストした配列には対応できません。

ネストした配列を比較する場合は、deepEqualsメソッドを使用します。


equalsメソッドの使い方

Arrays.equals(配列1, 配列2);



deepEqualsメソッド

deepEqualsメソッド」はネストした配列または多次元配列の配列の比較に使用します。

戻り値は boolean型です。

指定された 2つ配列が互いに同等である場合に trueを返します。

2つの配列が nullの場合にも trueとなります。


deepEqualsメソッドの使い方

Arrays.deepEquals(配列1, 配列2);



compareメソッド

Java9以降から「compareメソッド」が追加されました。

compareメソッドは順序付けのために 2つの引数を比較します。

最初の引数が 2番目の引数より小さい場合は負の整数「-1」、両方が等しい場合は「0」、最初の引数が 2番目の引数より大きい場合は正の整数「1」を返します。

戻り値の結果により比較した配列が等しいかどうかを判断します。


compareメソッドの使い方

compare(配列1, 配列2);



Arraysクラスの比較メソッドを使い、配列が等しいかの比較を行うサンプルコードを確認しましょう。

import java.util.Arrays;

public class Sample3 {
	public static void main(String[] args) {
		int[] a = { 10, 20, 30 };
		int[] b = { 10, 20, 100 };

		System.out.println("---一次元配列---");
		System.out.println("equals : " + Arrays.equals(a, b));
		System.out.println("compare : " + Arrays.compare(a, b));

		Object[] oa = new Object[] {
				new int[] { 10, 20, 30 },
				new int[] { 10, 20, 30 },
		};
		Object[] ob = new Object[] {
				new int[] { 10, 20, 30 },
				new int[] { 10, 20, 30 },
		};

		System.out.println("---二次元配列---");
		System.out.println("equals : " + Arrays.equals(oa, ob));
		System.out.println("deepequals : " + Arrays.deepEquals(oa, ob));
	}
}


実行結果:

---一次元配列---
equals : false
compare : -1
---二次元配列---
equals : false
deepequals : true

一次元配列である配列 aと配列 bに含まれる要素が異なるため、equalsメソッドでは結果として「false」が返ってきます。

compareメソッドでは配列 aの要素は配列 bの要素よりも値が小さいため、結果として「-1」が返ってきます。

二次元配列である配列 oa、配列 obは配列の要素の値は同じです。

equalsメソッドは二次元配列の比較を行うことができないため「false」が返ってきます。

deepEqualsメソッドでは配列 oa、配列 obの配列の要素は等しいため、結果として「true」が返ってきます。



まとめ

この記事では配列の補足としてArraysクラスの使い方について紹介・解説を行いました。

まだしっかりと配列が覚えられていない方は先に【Java】配列の基本の記事で勉強してからこの記事を理解しましょう。

配列を頻繁に使う場面があったらこの記事で紹介した方法を使うと手助けになると思います。

この記事の内容が必要な時に読み返してみてください。


関連記事リンク:【Java】たくさんのデータをまとめよう! 配列の基本と使い方を解説!【Java】配列のコピーの使い方を解説! Shallowコピーと Deepコピーの違いとは?【Java】ArrayList, LinkedList, Vector の違いと代表的な8つのメソッド【Java】intとInteger?何が違う?『ラッパークラス』の疑問を解決!!

【著者】

松倉祥大

はじめまして。フォワードソフト株式会社の松倉です。
システムエンジニアとして働き始めたのが2020年4月です。経験や知識がない状態で入社した私は、フォワードソフトの教育研修で一からプログラミングの勉強をしました。教育研修を卒業後、Javaのプログラミングについて初学者向けの記事を共同で制作しています。
知識や経験はまだまだですが、これからいろんな職場で様々な経験しながら勉強していきたいと思っています。

よく読まれている記事
【Java】JSPでタグライブラリを使う(JSTL)

【Java】JSPでタグライブラリを使う(JSTL)

こんにちは。エンジニアの新田です!ここでは、システムエンジニアとして働いている私が、システム開発手法や開発言語について紹介していこうと思います。今回は、JSPの標準タグライブラリ「JSTL」について紹介します。Javaについて勉強している方、Webアプリケーションを構築したいと思っている方の参考になれば幸いです!関連記事リンク: 【Java】JSPの基本的な構文/【Java】JSPのアクションタグ

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!そもそもStringとは何?『 String 』... Java言語において文字列のデータ型を指します。基本デ

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!Stringクラスformatメソッドの文字列整形【java.utilパッケージ】Formatterクラスfo

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者にも✅、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!文字列を扱う3つのクラス【java.langパッケージ】java.langパッケージの文字列を扱うクラスにはS

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!プリミティブ型と参照型プログラム開発では型を持った変数を使ってデータのやり取りをしますが、データ型によって仕様