はじめに
こんにちは!@kanato4です!!
普段はJavaを扱う仕事をしているわけですが、Javaのコードで目にすることが多い「Set/List/Map」を今回の記事で簡単にまとめていきたいと思います。
というのも、自分自身がSet/List/Mapの違いについて明確に回答できないこと、上司から「この辺は最低でも知っとけ」と言われたこともあり、「まぁ知らんとあかんよなぁ」と感じたからです。
今後、Javaを使う機会もより多くなってくると思うので、その時のためにしっかり予備知識を入れていかないとね!という気持ちのアウトプットです。
List/Set/Mapとは
List/Set/Mapは配列のように複数のデータを一つのオブジェクトとして操作することができます。
もちろん、データを取り出したり、追加・削除といったことも可能であり、その辺も配列と似ているところです。
ただ、配列の場合は最初に要素の数を宣言しないといけないです。
//配列の場合は要素数を指定する必要あり
String hoge[] = new String[5];
その点、List/Set/Mapは要素数を指定する必要はありません。サイズに関しては動的に変更可能なわけです。
それぞれの特徴
また、List/Set/Mapには次のような特徴があります。
名称 | 特徴 | Collectionインターフェース |
---|---|---|
List | 順序がある。重複した要素を含むことができる. | 継承している |
Set | 順序はない。重複した要素も含むことができない。 | 継承している |
Map | 「キーと値のペア」の集合。重複OK。 | - |
イメージとしては、List
はきちんと順番に要素を並べているので重複しても要素の位置で判別できるから重複OK、Set
は無造作に要素を詰め込むので重複するとどれがどれだか分からなくなるから重複NGといった感じでしょうか。
2020/12/10 追記
上記について、@swordoneさんよりご指摘をいただきました。
根本的な違いとして、Listはその名の通り「リスト」で、要素を「並べる」役割。Setは「集合」を表し、「その要素が集合に含まれるか否かを判定する」役割があります。
存在の有無を判定するために、同一の要素は2つ以上不要なので、Setは重複しないよう設計しています。
Map
は配列ならばインデックス(0とか1とか。要素の順番。)で呼び出すところを、インデックスに名前(キー)をつけて、そのキーで呼び出せるようにできるものです。これも重複OK。キーも基本的に何でもOKです。pandaでもgorillaでも大丈夫!
Collectionはスーパーインターフェイスと呼ばれるもので、ListとSetはこのインターフェースを継承しています。Mapに関しては継承されていないです。Collectionインターフェースを継承することで、様々なメソッドを活用することができるようになります。詳しくは下記のURLにサマリーが載っています。
Collection(Java Platform SE 7)
上記の表のようにList/SetとMapとの間には微妙に違いがあります。例えば、要素の追加をする場合、List/Setではaddメソッドを使用しますが、Mapではputメソッドを使用するといったことが挙げられます。この辺の差異については、きちんと把握をする必要がありそうですね。
おわりに
ざっくりとではありますが、それぞれの違いについて理解できたように感じます。List/Set/Mapのどれを使うのが適切かは場面ごとに違ってくると思うので、使う際はしっかり考えていかないといけないですね。開発を通して身につけていきたいところです。