【Java】Progateで取り上げられていないJavaの基本まとめ~その2・List編~


リスト

Progateでは配列については取り上げられているが、リストについては触れられていない。
配列とリストは似ているが何が違うのか?

配列

int result[] = new int[5];

result[0] = 85;
result[1] = 78;
result[2] = 92;
result[3] = 62;
result[4] = 69;

入れ物に例えるなら、配列result[]は先に入れ物の大きさを決めなければならず、
さらに一度その大きさを決めるとそれ以降は変更できないという特性をもつ。

リスト

List<String> list = new ArrayList<String>();

これに対しリストの大きさは可変であり、要素の追加・削除が可能。

インターフェイス

javaではリストを扱うためのインターフェイス(仕様書のようなもの)が定義されている。
このListインターフェイスはCollection(コレクション)をルーツとしたインターフェースである。

packageのimportが必要

Listを使用するためにはjava.util.Listimrportする必要がある。

import java.util.List;

また、Listはインターフェイス(仕様書)なのでそれ自体は実装を持たないため、
別途Listインターフェイスを実装したclassimportする必要がある

ArrayListとLinkedList

Listインターフェイスを実装したclassに、ArrayListLinkedListがある。

ArrayListクラスのインスタンスを作成してみる

import java.util.list;
import java.util.ArrayList;

public class Main {
  public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    System.out.println(list);
  }
}


/// 実行結果
/// >[]

List<String> list = new ArrayList<>();
変数がList型であること、このListが扱うデータがString型であることを宣言している。

LinkedListクラスのインスタンス作成

import java.util.list;
import java.util.LinkedList;

public class Main {
  public static void main(String[] args) {
    List<String> list = new LinkedList<>();
    System.out.println(list);
  }
}


/// 実行結果
/// >[]

LinkedListにはListにない固有メソッドがいくつか定義されているがここでは省略。
(ArrayListにはほとんどない)

プリミティブ型を扱うリストの場合

Listはint, longなどのプリミティブ型を直接扱うことができない。
Stringは参照型。
プリミティブ型と参照型について詳しくは以前の記事の表を参考までに。
https://qiita.com/hiroshimahiroshi/items/01de02cfe1caacd07540#3-%E5%9F%BA%E6%9C%AC%E3%83%87%E3%83%BC%E3%82%BF%E5%9E%8B%E3%81%A8%E5%8F%82%E7%85%A7%E5%9E%8B

ということでintlongなどのプリミティブ型を扱う場合にはintのラッパークラスInteger
longのラッパークラスLongを使用する。

    List<Integer> list = new LinkedList<>();

プリミティブ型?ラッパークラス?がよくわからないけどとりあえずリストだけ先にわかりたい!
という場合は、とりあえずList<型>の型が小文字で始まっていたら何か変だと思っておいて、
プリミティブ型と参照型、ラッパークラスについては別途学びましょう。

終わりに

記事を大幅に編集しました。
Progateを終えてJavaを何でもわかった気になってしまった自分みたいな人の為の記事ですので、
さわりしか触れていませんが重要基礎知識だと思いますので、この先はCODEPREPで理解を深めましょう。