質問: Java Silver arrayListの利点問題の矛盾について 現在2冊の問題集で1Z0-808の試験対策を行っております。 1徹底攻略 SE7 1Z0-803(黒本) 初版 2014/06/21 2スピードマスター問題集 SE8 1Z0-808(白本) 初版 2016/03/01 SE7対策を行っておりましたがSE8を受験するのでこの構成となりました。 疑問点は問題の回答が双方で異なることです。下記に問題と回答を記述します。 19-17 ■問題 ソフトウェア開発において配列ではなく、ArrayListを使用するとどのようなメリットがあるか ■選択肢 A.コレクションAPIが実装される B.マルチスレッドセーフになる C.メモリ使用量が少なくなる D.リストの要素数に応じて動的にサイズが変化する ■回答 A. ○ (APIを理解していれば他の便利なクラスライブリを扱える) B. × (マルチスレッドセーフにならない) C. × (要素があらかじめ決まっている配列に比べて余分にメモリを必要とする) D. ○ (設問の通り) 29-11 ■問題 ArrayListを使用する利点はどれか ■選択肢 A.メモリ消費を節約できる B.コレクションAPIを実装している C.スレッドセーフである D.リストの要素数に応じて動的にサイズを変更できる ■回答 A. ○ (配列に比べて動的にサイズを変更できる為メモリ消費を節約できる) B. × (ArrayListの利点と言うわけではない) C. × (スレッドセーフとは限らない) D. ○ (設問の通り) 疑問点は回答Aの方です。 黒本と白本で回答が違うのでよく分からなくなってきました。 受けるのは1Z0-808ですし、本の発行から数年経っているので 後者で覚えようと思うのですがいかかがでしょうか。
回答: ArrayList メモリ消費量について ==================== (これと同じような問題がそのまま設問として実際の試験で出題されるんですかね。。文脈がごそっとない悪問ような気がしますが。。) * 配列の方がメモリを多く使うケース: あらかじめ理論的な最大有効要素数だけ配列を用意しなければならず、実際にそこまで利用されなかった場合に無駄である。前提として「メモリ領域として何かしらのデータを蓄えておいて、そのうちで有効な要素の総数が増減する」ケースで、「同じインスタンスを使い回す」ケース場合について述べています。 * ArrayList の方がメモリを多く使うケース: 利用する要素数が固定の場合に、配列と ArrayList を比べた場合には、動的なサイズ変更を可能にするためのメタ情報的なオーバーヘッドが生じているので、配列に比べてメモリを多く使用する。 実際には、固定要素数を扱う場合でも、配列とArrayList の間で生じるメモリ消費量の差より、もっと先にチューニングするべき場所が(本当に)いくらでもあると思うので、 ArrayList を常に使っておけばいいとは思いますが。。