LoginSignup
17
14

More than 5 years have passed since last update.

もっとSetを使おう【Collections Framework】

Last updated at Posted at 2017-03-12

Javaでは配列ではなくArrayListってのを使うんだ。へー
くらいの知識の人向け

重複なしに値を持ちたい
List<String> list = new ArrayList<String>();

様々な処理

String itemNo = get〇〇

if(list.contains(itemNo)){//値を重複させない
  list.add(itemNo);
}

重複削除ロジックを書くのではなく、コレクションのSetを使うべき

Setというのは重複要素の無いコレクションのこと
equalsを使って同値のインスタンスを2つ以上含まないようになっている。

ちなみに名前のSetは集合論の「集合」の英語版(多分)。
集合は重複要素を認めないため(自然数の集合等)

重複なしに値を持ちたい
Set<String> set = new HashSet<String>();

様々な処理

String itemNo = get〇〇

//↓重複排除はequals()をつかってsetが行ってくれるので記述不要
//if(list.contains(itemNo)){//値を重複させない
set.add(itemNo);
//}

記述が少なくて書きやすい & 読みやすい & 理解しやすい
そもそもSetを使うことで重複を持たないことが明示できる。

遅くならないの?

実際に計測

計測
        List<Integer> list = new ArrayList<>();
        Long start = System.nanoTime();
        for(int i=0;i<100;i++){
            for(int j=0;j<100;j++){

                Integer num= i+j;

                if(!list.contains(num)){
                  list.add(num);
                }   

            }

        }
        Long end = System.nanoTime();

        System.out.println("list time:"+ String.valueOf(end - start));
        System.out.println(list);

        Set<Integer> set = new HashSet<>();
        Long start2 = System.nanoTime();
        for(int i=0;i<100;i++){
            for(int j=0;j<100;j++){
                Integer num= i+j;
                set.add(num);
            }

        }
        Long end2 = System.nanoTime();

        System.out.println("set time :"+String.valueOf(end2 - start2));
        System.out.println(set);

list time:10748381
[0, 1, 2, 3, 4, 5 ~略~
set time :5471075
[0, 1, 2, 3, 4, 5 ~略~ //※たまたま降順になっているが、順番は保証されない。

2倍近い差が出た。
何度か検証したが、概ね1.2~3倍の差が出てSetの方が速い。
ただしここで言いたいことは高速化のために使いましょうじゃなくて、
パフォーマンス低下は心配して、Setを使わないという配慮は不要。

17
14
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
14