ArrayListなににいれる

Java

この記事は最終更新日から1年以上が経過しています。

弊社エンジニア福山さんいわく

あたらしいコードでは

ってやってて自分は

こう教わったんだけどどうなの?という命を受けて調査いたしました。

私もArrayListは作成コストがかかりすぎるため
よりコストのかからないディクショナリを作成せよ、と
教わった記憶があるのですが本当なのか確認してみようと思います。

コーディング的な観点では

ListはインターフェースでありArrayListはその実装です。
なのでArrayListと宣言してしまうとArrayListしかいれられないため
ListにしておけばArrayListでもLinkedListでもVectorでも入れられて
拡張性が高いよっていう主張みたいです。

しかしながらこれは本当でしょうか。
ArrayList(インデックス付き配列)にしたものをLinkedList(インデックス無し配列)などにするでしょうか。
あるいは、具象クラスの代入に対して上位抽象クラスを宣言して拡張性が高い、という主張をするならば

こうなってしまいます。

実装的な観点では

調べたところ昔は

こういうふうにかけたんですが今はジェネリクスになっており型を明示しないと怒られるようです。

注意点としてはintなどのプリミティブ型が入れられないのでラッパー(Integerなど)を使えとのこと。

下記のようにいちまんかいaddする処理をいちまんかい繰り返す時間を計測してみました。

・ArrayList

かかった時間: 7832

・AbstractList

かかった時間: 7849

・List

かかった時間: 7804

・怒られながらも宣言なし

かかった時間: 7937

・AbstractCollection

かかった時間: 7876

いわくどれも8秒弱で速度的には変わらないという結果になりました。

結論:どうでもいい。

補足

その昔(今でも?)C#に於いてArrayListは可変であり、
型はなんでもOKというような配列であり、List(ジェネリッククラス)が
導入されるまではとてもコストがかかる配列でした。
なので私もArrayListよりもListのほうがよりよいものだと
思い込んでいたのですが、Javaに於いてはArrayListでも
型宣言を強制することによってキャストする必要が無いなどの
パフォーマンスチューニングが図られているため
特に気にする必要はないのかなと思いました。

この記事を書いた人

鈴木
鈴木juke / footworker
和服とvapeとСистемаと醗酵とたまごふわふわとカッティングシェイプスとジャージークラブとjuke/fwkに傾倒する人です

Java