こちらの記事ではJavaにおける「List」の概念と、その基本的な使い方について解説します。
一言で言うと、Listとは、”順序付けられた”、”可変長”のデータの集まりを表現するためのインターフェースです。Listを使用することで、複数のデータを一括で管理することができます。
Listの概念
Javaには、「Collection」インターフェースという、複数の要素の集合という抽象的な概念があります。ListはCollectionの集合体という要素を継承して、順序付けの概念を足したものです。各要素に0,1,2,…のインデックスを割り当てて管理を行います。
また、Listには可変長という特徴もあり、後から要素を足していくことができます。
Listもまだインターフェースという抽象化された概念なので、Listを使う際には、クラスとして実装する必要があります。Listの実装クラスの例には、
- ArrayList
- LinkedList
などが存在します。
Listの実装クラス
Listを実装したクラスにもそれぞれ特徴があり、用途に合わせた選択が必要です。
ArrayList
Listを実装する際によく使われるクラスです。要素が連続して格納されており、インデックスを指定して、i番目の要素を取り出すといった操作が可能です。各要素が連続的に格納されている都合上、インデックスを指定しての要素の取り出しは早いですが、要素の挿入や削除は比較的遅いです。
LinkedList
それぞれの要素が前の要素と次の要素の情報を持っていて、先頭の要素から順番にたどっていくことで、各要素へアクセスします。順番にたどる都合上、要素の取り出しは遅く、要素の挿入や削除は早いです。
以降の例ではArrayListを使用します。
Listの基本的な使い方
初期化
空のリストを作成をする基本構文は以下のようになります。
List<データ型名> オブジェクト名 = new ArrayList<データ型名>();
List、ArrayListはjava.utilパッケージに含まれているので、ここからインポートして使用します。
以降のサンプルでは、以下の記述で空のリストを作成し、処理を記述しています。
import java.util.ArrayList;
import java.util.List;
// ListとArrayListをインポート
public class Main {
public static void main(String[] args) {
List<String> list1 = new ArrayList<String>();
// 空のリスト(list1)を作成
/*
処理記述
*/
}
}
Listで使用できるメソッド
Listでは多くのメソッドを利用することができます。一例を紹介します。
要素の追加
-
add()
要素を追加します。インデックスを指定して、特定の位置に挿入することも可能です。
List<String> list1 = new ArrayList<>();
list1.add("A");
list1.add("B");
list1.add("C");
list1.add(1,"a");// インデックス1の位置に"a"を挿入
list1.add(null); // null値の追加も可能
System.out.println(list1);
/* 出力結果
[A, a, B, C, null]
-
addAll()
1つのリストに別のリストの要素すべてを追加します。(リストの結合)
List<String> list1 = new ArrayList<>();
list1.add("A");
list1.add("B");
list1.add("C");
System.out.println("list1:"+list1);// list1を出力
List<String> list2 = new ArrayList<>();
list2.add("あ");
list2.add("い");
list2.add("う");
System.out.println("list2:"+list2);// list2を出力
list1.addAll(list2);// list1にlist2を結合
System.out.println(list1);// 結合結果を出力
/* 出力結果
list1:[A, B, C]
list2:[あ, い, う]
[A, B, C, あ, い, う]
要素の置き換え
-
set()
インデックスを指定して、指定した要素を別の値に置き換えます。
List<String> list1 = new ArrayList<>();
list1.add("A");
list1.add("B");
list1.add("C");
System.out.println("置換前:"+list1);// 置換前を出力
list1.set(1,"b");// インデックス1の要素"B"を"b"に置換
System.out.println("置換後:"+list1);// 置換後を出力
/*出力結果
置換前:[A, B, C]
置換後:[A, b, C]
要素の取得
-
get()
インデックスを指定して要素を取得します。
-
size()
リストに格納されている要素の個数を取得します。
-
subList()
リストの一部分を取得します。
-
indexOf()
指定した値を持つ要素のインデックスを返します。
List<String> list1 = new ArrayList<>();
list1.add("A");
list1.add("B");
list1.add("C");
String element0 = list1.get(0); // インデックス0の値を取得
Integer listsize = list1.size(); // リストの要素数を取得
List sublist1 = list1.subList(1,3); // インデックス1~2の要素を別のリストとして取得
Integer index1 = list1.indexOf("C"); // 値がCの要素のインデックスを取得
System.out.println("0番目の要素:"+element0);
System.out.println("要素の個数:"+listsize);
System.out.println("サブリスト:"+sublist1);
System.out.println("Cのインデックス:"+index1);
/* 出力結果
0番目の要素:A
要素の個数:3
サブリスト:[B, C]
Cのインデックス:2
要素の削除
-
remove()
指定したインデックス、または値を持つ要素を削除します。同じ値を持つ要素が複数ある場合は、最初の要素のみが削除されます。
-
clear()
リスト内の全要素を削除します。
List<String> list1 = new ArrayList<>();
list1.add("A");
list1.add("B");
list1.add("C");
list1.add("A");
list1.add("B");
list1.add("C");
System.out.println("元のリスト:"+list1);
System.out.println("元の個数:"+list1.size());
list1.remove(0); //インデックス0の要素を削除
System.out.println("remove(0)後のリスト:"+list1);
list1.remove("B"); //最初の"B"を削除
System.out.println("remove(\"B\")後のリスト:"+list1);
list1.clear(); //リストを空にする
System.out.println("clear後のリスト:"+list1);
System.out.println("clear後の個数:"+list1.size());
/*出力結果
元のリスト:[A, B, C, A, B, C]
元の個数:6
remove(0)後のリスト:[B, C, A, B, C]
remove("B")後のリスト:[C, A, B, C]
clear後のリスト:[]
clear後の個数:0
Listの応用操作
要素の整列
Collectionsクラスのsortメソッドを利用して、昇順に並び替えが可能です。sort()の第2引数にCollections.reverseOrder()を指定することで、降順に並び替えることも可能です。
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
// CollectionsとList、ArrayListをインポート
public class Main {
public static void main(String[] args) {
List<String> list1 = new ArrayList<>();//空のリスト作成
list1.add("D");
list1.add("B");
list1.add("A");
list1.add("C");
System.out.println("元のリスト:"+list1);
Collections.sort(list1);// 昇順に並び替え
System.out.println("昇順に並び替え:"+list1);
Collections.sort(list1,Collections.reverseOrder());// 降順に並び替え
System.out.println("降順に並び替え:"+list1);
}
}
/* 出力結果
元のリスト:[D, B, A, C]
昇順に並び替え:[A, B, C, D]
降順に並び替え:[D, C, B, A]
Listの各要素への処理
forEachメソッドを利用することで、一つずつ要素を取り出して、それぞれに処理を行うことができます。
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> list1 = new ArrayList<>();
list1.add("A");
list1.add("B");
list1.add("C");
list1.forEach(item -> System.out.println(item));//要素を一つずつ出力
}
}
/* 出力結果
A
B
C
Listと配列との違い
Javaには、Listに似た概念として、「配列(Array)」というものがあります。配列も、順序付けられた要素の集合という意味ではListと似ていますが、決定的な違いはListが可変長なのに対し配列は固定長という点です。配列では初めにメモリ上の連続した領域を確保するため、最初に要素数を宣言し、要素数は後から変更することは(原則)できません。
配列の構文
配列変数名 = new データ型[要素数]
まとめ
Listは、Javaで複数のデータをまとめて扱う際の基本となる機能です。今後、繰り返し処理を行う際などに、必ず向き合わなければなりません。基本的な使い方を押さえると同時に、似ている概念との特徴や定義の違いを理解し、適切に使い分けができるようになりましょう。
- ListとArrayList、LinkedListの関係性
- Listで使用できるメソッド
- Listと配列の違い
【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。
「フリーランスエンジニア」
近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。
「成功する人とそうでない人の違いは何か?」
私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。
比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。
多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、
エンベーダー編集部
エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。
関連記事
2020.02.25
完全未経験からエンジニアを目指す爆速勉強法
USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
- キャリア・学習法
- エンジニア
2023.07.03
プログラミングスクールで学べることとは? 料金から学習内容の違いまで調査
今回はこれからエンジニアを目指す方向けにプログラミング技術を学べるスクールに関して、料金や学習出来る内容の違いなどの調査を行ないました。
- プログラミング
2023.08.29
WEB開発の基礎 フロントエンドとバックエンドの連携とAPIの役割
この記事ではWeb開発の核心となる「フロントエンドとバックエンドの違い」とその連携でいられる「API」についてご紹介します。
- プログラミング
2022.12.14
CI(Continuous Integration)継続的インテグレーションを導入するメリット
Integrationは統合という意味で、継続的に統合・結合を行うことをCIと呼びます。
- プログラミング