Javaその他

List, Map, Setでの登録順を確認してみた

Javaでは、コレクションフレームワークという複数の要素のデータを扱うための機能があり、List、Set、Mapなどのインタフェースがある。

コレクションフレームワークについては、以下のサイトを参照のこと。
https://ittoybox.com/archives/206

今回は、List、Set、Mapの各インタフェースについて、代表的なクラスのデータの格納順がどうなるか確認してみたので、そのサンプルプログラムを共有する。



前提条件

下記記事のIntelliJ IDEA Community版をダウンロード済であること。

IntelliJ IDEAをインストールしてみた「IntelliJ IDEA(インテリジェイ アイディア)」という、Eclipseと同等の機能をもつJava用統合開発環境を使って、Sp...

また、下記のように、「demoJava」というJavaプロジェクトを作成済であること。
demoJavaプロジェクト

なお、IntelliJ IDEA上でJavaプロジェクトを作成する方法については、IntelliJ IDEA Community版をダウンロードする記事内の、「IntelliJ IDEA上でのJavaプロジェクトの作成・実行」を参照のこと。



フリーランスエンジニアのエージェントは就業中でも無料で登録できるITエンジニアには、フリーランスという働き方がある。 フリーランスとは、会社や団体などに所属せず、仕事に応じて自由に契約する人のこ...

サンプルプログラムの作成

作成したサンプルプログラムの構成は以下の通り。
サンプルプログラムの構成
なお、上記の赤枠は、今回新規で作成したプログラムである。

DemoList.javaの内容は以下の通りで、ArrayList・LinkedListの格納順を調べるようになっている。

package demo.java;

import java.util.ArrayList;
import java.util.LinkedList;

public class DemoList {

    public static void main(String[] args){
        //ArrayListのサンプル
        ArrayList<String> aList = new ArrayList<>();
        aList.add("value1");
        aList.add("value3");
        aList.add("value5");
        aList.add("value4");
        aList.add("value2");
        System.out.println("要素の参照が多いときはArrayListがよい");
        System.out.println("ArrayListの格納順は登録した順番");
        System.out.println("aList" + aList);
        System.out.println();

        //LinkedListのサンプル
        LinkedList<String> lList = new LinkedList<>();
        lList.add("value1");
        lList.add("value3");
        lList.add("value5");
        lList.add("value4");
        lList.add("value2");
        System.out.println("要素の追加や削除が多いときはLinkedListがよい");
        System.out.println("LinkedListの格納順は登録した順番");
        System.out.println("lList" + lList);
        System.out.println();
    }
}



また、DemoSet.javaの内容は以下の通りで、HashSet・TreeSet・LinkedHashSetの格納順を調べるようになっている。

package demo.java;

import java.util.HashSet;
import java.util.TreeSet;
import java.util.LinkedHashSet;

public class DemoSet {

    public static void main(String[] args){
        //HashSetのサンプル
        HashSet<String> hSet = new HashSet<>();
        hSet.add("value1");
        hSet.add("value3");
        hSet.add("value5");
        hSet.add("value4");
        hSet.add("value2");
        System.out.println("HashSetの格納順は不定");
        System.out.println("hSet : " + hSet);
        System.out.println();

        //TreeSetのサンプル
        TreeSet<String> tSet = new TreeSet<>();
        tSet.add("value1");
        tSet.add("value3");
        tSet.add("value5");
        tSet.add("value4");
        tSet.add("value2");
        System.out.println("TreeSetの格納順は値の昇順");
        System.out.println("tSet : " + tSet);
        System.out.println();

        //LinkedHashSetのサンプル
        LinkedHashSet<String> lhSet = new LinkedHashSet<>();
        lhSet.add("value1");
        lhSet.add("value3");
        lhSet.add("value5");
        lhSet.add("value4");
        lhSet.add("value2");
        System.out.println("LinkedHashSetの格納順は登録した順番");
        System.out.println("lhSet : " + lhSet);
        System.out.println();
    }
}



さらに、DemoMap.javaの内容は以下の通りで、HashMap・TreeMap・LinkedHashMapの格納順を調べるようになっている。

package demo.java;

import java.util.HashMap;
import java.util.TreeMap;
import java.util.LinkedHashMap;

public class DemoMap {

    public static void main(String[] args){
        //HashMapのサンプル
        HashMap<String, String> hMap = new HashMap<>();
        hMap.put("key1", "value1");
        hMap.put("key3", "value3");
        hMap.put("key5", "value5");
        hMap.put("key4", "value4");
        hMap.put("key2", "value2");
        System.out.println("HashMapの格納順は不定");
        System.out.println("hMap : " + hMap);
        System.out.println();

        //TreeMapのサンプル
        TreeMap<String, String> tMap = new TreeMap<>();
        tMap.put("key1", "value1");
        tMap.put("key3", "value3");
        tMap.put("key5", "value5");
        tMap.put("key4", "value4");
        tMap.put("key2", "value2");
        System.out.println("TreeMapの格納順はキー項目の昇順");
        System.out.println("tMap : " + tMap);
        System.out.println();

        //LinkedHashMapのサンプル
        LinkedHashMap<String, String> lhMap = new LinkedHashMap<>();
        lhMap.put("key1", "value1");
        lhMap.put("key3", "value3");
        lhMap.put("key5", "value5");
        lhMap.put("key4", "value4");
        lhMap.put("key2", "value2");
        System.out.println("LinkedHashMapの格納順は登録した順番");
        System.out.println("lhMap : " + lhMap);
        System.out.println();
    }
}



サンプルプログラムの実行結果

サンプルプログラムの実行結果は、以下の通り。

1) DemoList.javaの実行結果は以下の通りで、ArrayList・LinkedListとも、登録した順番にデータが格納されることが確認できる。
DemoListの実行結果

2) DemoSet.javaの実行結果は以下の通りで、TreeSetは値の昇順に、LinkedHashSetは登録した順番に、それぞれデータが格納されることが確認できる。
DemoSetの実行結果

3) DemoMap.javaの実行結果は以下の通りで、TreeMapはキー値の昇順に、LinkedHashMapは登録した順番に、それぞれデータが格納されることが確認できる。
DemoMapの実行結果

要点まとめ

  • Javaでは、コレクションフレームワークという複数の要素のデータを扱うための機能があり、List、Set、Mapなどのインタフェースがある。
  • Listは複数の要素の順番を保持するコレクションで、ArrayList・LinkedListとも、登録した順番にデータが格納されるが、要素の追加や削除が多いときはLinkedList、要素の参照が多いときはArrayListが向いている。
  • Setは重複要素を持たない要素の集合で、TreeSetは値の昇順に、LinkedHashSetは登録した順番に、それぞれデータが格納される。
  • Mapはキーと要素とのマッピングを表すデータ構造で、TreeMapはキー値の昇順に、LinkedHashMapは登録した順番に、それぞれデータが格納される。