Collection/Set/Map/List ....
JavaにはCollectionと呼ばれる概念に基づいて、複数の要素を持てる仕組みが実装されている。
多くのCollectionはjava.util.*
をimport
することで利用可能。
大きく分かれて3種類ある。
- List ... ある順序の配列。ただし今までに述べた
[]
の型の配列とは異なり可変長(配列の長さが固定されない) - Set ... ユニークな値を保持する。すなわち、値の重複はない。
- Map ...
key
とvalue
で対となる。
Javaには様々なListやSetなどが用意されている。
機能的にはほぼ同じでも、どのようにそれらを保持しているかを後々知っていかないといけないので、併せて下記リンクのCollectionを参照することをお勧めする。
List - 単純な配列
ArrayList
配列を扱います。オブジェクトとしてそれぞれが格納されるため、データ型や長さに依存しません。
ArrayList lang = new ArrayList();
//上記だと、型が決まっていないので、注意文が出ます。
//しっかりと型付けしたい場合は、
/*
ArrayList<String> lang = new ArrayList<>();
*/
//のように<>の中にデータ型・クラス名を入れます。これはString型に限らずどんな型でもいけます。
//例えば、Random型を入れて、ran.add(new Random());みたいにすることもできます。
/////////////////////////
// 値の追加
//////////////
lang.add("Java");
lang.add("C++");
lang.add("Python");
lang.add("Rust");
lang.add("Kotlin");
////////////////////////
// 表示
///////////
for(int i=0; i<lang.size();i++) System.out.println(i+" -> "+lang.get(i));
// 拡張For
for(String s : lang) System.out.println(s);
// forEach
lang.forEach(s -> System.out.println(s));
lang.forEach(System.out::println);
上記では、add()
やsize()
、get()
を使っています。他にもあります。
メソッド | 説明 |
---|---|
add(OBJECT) | 末尾にOBJECTを追加する |
add(NUM,OBJECT) | NUM番目にOBJECTを挿入する |
set(NUM,OBJECT) | NUM番目の要素をOBJECTに置換する |
get(NUM) | NUM番目の要素を取得する |
remove(NUM) | NUM番目の要素を削除する |
size() | 要素の個数を取得 |
isEmpty() | Listが空かを返す(True/False) |
indexOf(OBJECT) | OBJECTと等しいものを探して添え字(NUM)を返す。 |
contains(OBJECT) | OBJECTと等しい要素があるか?(True/False) |
addAll(ArrayList) | List末尾にに別のListを連結する |
これらを一度使って、挙動を確認してみましょう。
そのほかにも多くの型があります。値を弄るメソッドは殆ど同じです。
LinkedList
ArrayListと使用用途はほぼ同様です。内部構造が異なり、要素同士がリンクしているため、パフォーマンスに差があります。
一般的には下記のようにいわれていますが、プログラムの書き方次第で逆になる場合もあります。気になる場合は冒頭リンクを参照してください。
- 挿入操作: LinkedListのほうが早い。(リンクを変えるためだけなので)
- 削除操作: LinkedListのほうが早い。(リンクを変えるためだけなので)
- 取得操作: ArrayListのほうが早い。(リストの先頭や末尾の場合を除く)
使い方は、ArrayListと差異ありません。
Vector
こちらもArrayListと差異はありません。ただし、パフォーマンスが悪いため(処理が遅いため)現在ではあまり推奨されていません。
しかしながら、講義資料にVectorが明記されていることがあり、講義課題で登場することもあります。
Set - ユニークな値を保持する配列
HashSet
ArrayListと異なる点として以下が挙げられます。
- 要素の重複が許されない(ユニークな配列)
- 順序の保障が無い
- 要素に添え字(配列の番号)ではなく、
Iterator
(イテレータ)と呼ばれるものをポインター( 指し示すもの)とする。
HashSet<String> hset = new HashSet<>();
hset.add("HTTP");
hset.add("FTP");
hset.add("NNTP");
hset.add("NTP");
// Iteratorを作成
Iterator it = hset.iterator();
// 次の値がある場合、True
while(it.hasNext()){
// 次の値を参照
System.out.println(it.next());
}
//拡張ForやforEachもいけます。
Setは添え字がないので、remove("HTTP")
のように値を直接指定して削除したりします。
TreeSet
HashSetと異なる点として以下が挙げられます。
- 要素が自動的にソートされる。
Map - key
とvalue
を組み合わせる
HashMap
key
の順序は決まっていません。key
よりvalue
を取得します。key
は一意(ユニーク)です
////////////////////////
// HashMap
HashMap<String,String> hmap = new HashMap<>();
////////////////
//add相当,put
//[instance].put(key,value);
hmap.put("ID","2557832");
hmap.put("First Name","Kichi");
hmap.put("Last Name","Gotou");
hmap.put("TEL","03-xxxx-yy");
hmap.put("Mail","k.goto@toku2.keishicho.jp");
hmap.put("Address","9-2-1 Jounanjima Ota-wards Tokyo Japan");
// forEachで表示
hmap.forEach((key,val) -> System.out.println(key+"->"+val));
TreeMap
key
は、自然順序(ABC/123/あいう順)に並び変えられます。
LinkedHashMap
key
は登録した順に整列されます。
最終更新日: 2021年4月30日