ArrayListオブジェクトから、subListメソッドを使って、Listオブジェクトを引き出すと、パフォーマンス的にはどうなるのかと一寸疑問だったので、Eclipseを使って中身を読んでいました。
広告
SubListメソッドはどうなっているか
まず、SubListメソッドについてです。
具体的な仕組みとしては、指定されたインデクスの範囲がArrayListに保存されているデータの範囲と合致するかチェックした後、SubListというオブジェクトをnewして返すようになっていました。
じゃあこのSubListとはなにかというと、クラス内に宣言されたクラス、つまり内部クラス(インナークラス)です。
要するに、ArrayListクラスの中にsubListメソッドでreturn値として返すためのSubListという名の内部クラスが定義されている、というわけです。
ランダムアクセスインタフェースを実装し、AbstructListクラスをextendしているので、これはListインタフェースで定義されたsubListで返すべきオブジェクト(リスト)の条件に当てはまるというわけです。
ArrayList内の内部クラスを返すことで、うまいこと親クラスであるArrayListのオブジェクトから要素を引っ張ってこれるようにアレンジされている印象でした。
パフォーマンスへの影響
さてでは肝心のパフォーマンスは、と思いまして、何度か(少数のリストでですが)実験を行ってみましたが、どうにもそこまで差がつきませんでした。
まあそれもそのはず、上に書いた内部クラスからArrayListのインスタンスを取得し、そのメソッドを利用することで、ArrayList的にうまく処理を行えるようにしているみたいです。
ですので、ArrayListからsubListを行っても、そこまでパフォーマンスを気にせずに色々できるらしい、というのが私の出した結論です。
こういうことを踏まえると、可変長配列として扱うのに便利ですね、ArrayList…。配列で部分配列切り出して操作するよりも、内部クラスでsubListを返したほうがもしかするとメモリの節約になるかもですし。
その他コメントなど
もしかしてこれはJavaプログラマさん方にはあたりまえなのかしら、と思いつつ、防備録がてら書きました。