はじめに
Java学習中にでてきたコレクションについてまとめました
コレクションAPI
オブジェクトの集合を管理、操作するJava標準のAPI
オブジェクトの集合 → コレクション
コレクションの集合 → 要素
よく使うAPI(予め要素の追加・削除などのメソッドが用意されている)
- List
- Map
- Set
List
配列同様インデックス番号順序に要素を管理するコレクション、要素の重複ok
List自体はインターフェースなのでListを実装しているArrayList
やLinkedList
などを使用(import)する必要がある
(import java.util.ArrayList;
)
配列との違い
配列:要素数の指定が必要
List:要素数の指定が必要なく要素の追加・削除するたびにサイズが増減
基本形
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
// ArrayListを生成
List<String> list1 = new ArrayList<String>();
// LinkedList
List<Integer> list2 = new LinkedList<Integer>();
操作
/*-- 要素の追加 --*/
list1.add("クッキー");
list1.add("ケーキ");
// 位置の指定追加も可能 クッキー、プリン、ケーキの順になる
list1.add(1, "プリン");
// 位置指定を要素数より多くすると実行時エラー
list1.add(15, "ホットケーキ");
/*-- 要素の取得 --*/
list1.get(0); //=> 「クッキー」が出力
/*-- 要素の存在チェック --*/
list1.contains("プリン") //=> true
/*-- 要素数の取得 --*/
list1.size(); //=> 3を返す
/*-- 要素の削除 --*/
list1.remove("クッキー"); // 文字列として同じなら削除される
list1.remove(0); //=> プリンが削除
// 要素数よりも大きいと実行時エラー
list1.remove(5);
ArrayListとLinkedListの違い
どちらもimportすればListが使えるようになるが細かい違いがあるらしい
状況に応じ使い分ける必要がある
- インデックス指定で要素を取り出すのはArrayListの方が速い
- 先頭から順に処理をするのはArrayListの方が速い
- 要素の挿入はLinkedListの方が速い
- 要素の削除はLinkedListの方が速い
Map
「キー」と「値」の組み合わせで要素を管理するコレクション
「キー」:重複はしない、「値」:重複ok
追加した要素の順番は保証されない
HashMap
やTreeMap
をimportする
基本形
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
// HashMapを生成する場合
Map<Integer, String> map1 = new HashMap<Integer, String>();
// TreeMapを生成する場合
Map<String, String> map2 = new TreeMap<String, String>();
操作
/*-- 要素の追加 --*/
map1.put(0, "クッキー");
map1.put(3, "ケーキ");
// 登録済みのキーで追加すると上書きされる、クッキーが消える
map1..put(0, "プリン");
/*-- 要素の取得 --*/
// 存在しないキーを指定するとnullが返る
map1.get(5); //=> null
/*-- 要素の存在チェック --*/
map1.containsKey(0); //=> true
map1.containsValue("登録してない要素"); //=> false
/*-- 要素の取得はListと同じ --*/
map1.contains("プリン") //=> true
/*-- 要素の削除 --*/
map1.remove(1); //=> 該当がなければ何も起こらない
map1.remove(3, "登録していない要素") //=> 値が該当しないので何も起こらない
Set
位置(インデックス)やキーなどの要素を特定する概念がない、ただの集合
要素を取り出したい時は繰り返し処理をする(拡張for文やラムダ式)
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
// HashSetを生成する場合
Set<String> set1 = new HashSet<String>();
// LinkedHashSetを生成する場合
Set<Integer> set2 = new LinkedHashSet<Integer>();
操作
/*-- 要素の追加 --*/
set1.add("クッキー");
set1.add("ケーキ");
// 位置の指定はできない
/*-- 特定の要素の取得はできない --*/
/*-- 要素の存在チェック、Listと同じ --*/
set1.contains("クッキー") //=> true
/*-- 要素数の取得、同じ --*/
set1.size(); //=> 3を返す
/*-- 要素の削除、インデックス指定はできない --*/
set1.remove("クッキー"); // 文字列として同じなら削除される
list1.remove("登録してない要素"); //=> 何も起こらない
最後に
Railsでは何も考えずに使ってた配列が、Javaでは配列・コレクションで違いがあるという認識をしました
使いながらもっと理解していこうと思います
閲覧頂きありがとうございました!