未来エンジニア養成所Blog

プログラミングを皆に楽しんでもらうための情報をお届けします。

【Java】コレクション Part2

title

前回に引き続きコレクションの解説です。

前回の記事はこちら phoeducation.work


Setインターフェース

SetインターフェースはCollctionインターフェースを実装したインターフェースで、Setインターフェースを継承したSortedSetインターフェースとそれを実装したTreeSet、Setインターフェースを実装したHashSetやLinkedHashSetがよく使われます。

格納された順番情報を持たず、袋にモノを投げ込んだイメージで、同じオブジェクトが入ると区別ができなくなるので、同じデータの重複は許されていません。

Setインターフェース


【Setインターフェースの主な実装クラス】
Set実装クラス


【Setインターフェースを実装したクラスの主なメソッド】
Set主なメソッド


HashSetは、Setの中で一番基本的な実装クラスです。

順不同でオブジェクトを管理しています。

重複オブジェクトは保持できません。

nullを格納することが可能です。

TreeSetはSortedSetインターフェースを実装したクラスであるため、格納オブジェクトはソート(並べ替え)して管理しています。

ソート方法は自然順序づけ、Compareインターフェースの実装クラスによる順序づけがあります。

順序付けについては後ほど、解説します。重複オブジェクトは保持できません。

LinkedHashSetは、HashSetと同様の機能です。

さらに格納オブジェクトはリンク情報を保持し、順序づけ管理されています。

ただし、リンク情報による管理は挿入順であり、ソートは行われません。

メソッドとしては、データを追加するadd()、データを削除するremove()などがあります。


【HashSetの利用】

import java.util.HashSet;
public class CollectionSample01 {
    public static void main(String[] args){
        HashSet<String> set = new HashSet<String>();
        set.add("田中");
        set.add("佐藤");
        set.add("前田");
        set.add("田中");
        for(String s: set){
            System.out.println(s);
        }
    }
}


実行結果

田中
前田
佐藤


4行目でHashSet型のsetオブジェクトはジェネリックスを使用して、Stringオブジェクトのみが格納できると宣言しています。

5行目~8行目でStringオブジェクトをHashSetのオブジェクトにadd()を使用して、格納しています。


9行目~11行目で、拡張for文を使って、要素数分繰り返し、データを取り出し、値を画面表示しています。

出力結果を見てみると、Stringオブジェクト“田中”が2回追加されていますが、HashSetは重複データを許しませんので、田中の値は1つしか表示されません。

また格納された順番に出力されているわけではなく、順番は保証されていないことがわかります。


Listインターフェース

リストはサイズ変更可能な配列のようなものです。

配列の場合は、入れられるオブジェクトの数は固定ですが、リストはオブジェクトの追加や削除を自由に行うことができます。

配列の添え字のように順序立てて管理されます。

したがって重複が許されます。

オブジェクトを順番で管理し、記憶した順番に、1つ1つのオブジェクトは番号(添字)で管理されています。

ListインターフェースもSetインターフェースと同様に、Collectionインターフェースを実装しています。

これらはインターフェースですので、これらを実装する具象クラスがそれぞれに用意されています。


Listインターフェース


図では、田中が2つ格納されていますが、それぞれ添え字で管理され、インデックス番号0番の田中、インデックス番号3の田中として管理されるため、重複しても問題はありません。


【Listインターフェースを実装したクラス】
List実装クラス


【Listインターフェースを実装したクラスの主なメソッド】
List主なメソッド


ArrayListは、Listの中で一番基本的な実装クラスです。

サイズ変更可能な配列を表すクラスであり、動的にオブジェクトの追加、削除が可能です。添字を用いて、オブジェクトを管理しているので、重複オブジェクトを格納することができます。


LinkedListは、添字でオブジェクトを管理しています。

内部的には前後のオブジェクトへの参照をリンクとして持っており、格納オブジェクトの順序を管理しています。

オブジェクトの追加、削除はリンク先に変更により処理されるため、ArrayListより高速です。


Vectorは、コレクションフレームワークが提供される以前から存在するクラスです。

基本的な特徴はArrayListと同じですが、違いは同期化されており、スレッドセーフなリストです。

同期化については、スレッドの解説を参照してください。 phoeducation.work


メソッドとしては、データを追加するadd()、データを削除するremove()、データを取り出すget()などがあります。


【ArrayListの利用】

import java.util.ArrayList;

public class CollectionSample02{
    public static void main(String[] args){
        Integer i1 = new Integer(100);
        int i2 = 200;
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(i1);
        list.add(i2);
        list.add(i1);
        list.add(i2);
        for(int i = 0; i < list.size(); i++){
            System.out.println(list.get(i));
        }
    }
}


実行結果

100
200
100
200


7行目のArrayList型のlistオブジェクトはジェネリックスを使用し、Integerオブジェクトのみ格納すると宣言しています。

5行目~6行目でIntegerオブジェクトの変数i1とint型の変数i2をlistに格納しようとしています。

6行目のint型の変数i2はauto-boxing機能により、int型からIntegerオブジェクトに変換されてlistオブジェクトに格納されます。

12行目~14行目では、ArrayListからデータを取り出す際に、size()を使用すると、格納された要素の数を取得することができるので、for文を使用して、要素の数だけfor文を繰り返して、get()で値を取り出し、画面に表示しています。

実行結果を見ると、追加した順番に出力され、データの重複も許されていることがわかります。


Mapインターフェース

Mapインターフェースは、キーと値をペアで管理します。

キーは自動的に並べ替えらます。値の重複は許されますが、キーの重複は許されません。

またMapインターフェースはCollectionインターフェースを実装していませんので、注意しましょう。

下図では、1というキーの重複はできませんが、田中という値の重複は可能であることを示しています。


Mapインターフェース


【Mapインターフェースを実装したクラス】
Map実装クラス


【Mapインターフェースを実装したクラスの主なメソッド】
Map主なメソッド


HashMapは、Mapの中で一番基本的な実装クラスです。

キーと値(オブジェクト)のペアを順不同で管理します。

オブジェクトに対する操作は、キーを用いて行います。nullを保持することも可能です。

TreeMapはSortedMapインターフェースを実装したクラスであるため、格納オブジェクトはキーをソート(並べ替え)して管理します。

ソート方法は自然順序づけ、Compareインターフェースの実装クラスによる順序づけがあります。

重複オブジェクトは保持できません。


メソッドは、引数でキーを指定して値を取り出すget()や、引数で指定されたキーと値をペアでマップに格納するput()やmapからキーと値を削除するremove(),コレクションが格納しているオブジェクトの数を返すsize()などがあります。


【HashMapの利用】

import java.util.HashMap;
public class CollectionSample03{
    public static void main(String[] args){
        HashMap<Integer,String> map = new HashMap<Integer,String>();
        map.put(0,"田中");
        map.put(1,"佐藤");
        map.put(2,"田中");
        for(int i = 0; i < map.size(); i++){
            System.out.println(map.get(i));
        }
    }
}


実行結果

田中
佐藤
田中


4行目では、HashMap型のmapオブジェクトはジェネリックスを使用して、キーとしてInteger型、値としてStringオブジェクトのみが格納できると宣言しています。

5行目~7行目では、キーは0,1,2と重複していないので、値が重複していてもエラーにはならず、格納された3つの値が画面表示されています。


「コレクション Part3」へ続きます。 phoeducation.work


参考図書



独学で挫折しそうになったら、オンラインプログラミングスクール
未来エンジニア養成所Logo



あわせて学習したい

phoeducation.work phoeducation.work