質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

9110閲覧

ArrayListを使用する利点について

k499778

総合スコア599

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

1グッド

0クリップ

投稿2015/10/01 05:43

編集2015/10/01 05:47

現在Java Silverの勉強をしています。
白本と黒本を使っており、両者で同じ問題にもかかわらず、答えが違う問題がありました。

出版社の正誤表にもその点が記載されておらず、また解説を見てもどちらも全うなことを言っているので
みなさんに伺いたいと思い投稿しました。
**どちらが正解でしょうか?**あるいは
問題が良くなく、解釈によってはどちらとも正解ととれる問題なのでしょうか?

本題ですが、
その問題とは以下です。

<白本 問題>
ArrayListを使用する利点は以下のどれですか。2つ選択してください。

A. メモリ消費を節約できる。
B. コレクションAPIを実装している
C. スレッドセーフである
D. リストの要素数に応じて動的にサイズを変更できる

<黒本 問題>
ソフトウェア開発において配列ではなくArrayListを使用すると、どのようなメリットがあるか。2つ選択してください。

A. メモリ使用量が少なくなる。
B. コレクションAPIが実装される
C. マルチスレッドセーフになる
D. リストの要素数に応じて動的にサイズが変化する

<白本 答え>
A D

<黒本 答え>
B D

<白本 解説>
Aの理由:配列では、宣言時にあらかじめ要素数を決めておく必要があり、場合によってはメモリ領域を無駄に確保する可能性があります。したがって正解です。

Bでない理由:ArrayListはコレクションAPIですが、ArrayListの利点というわけではありません。したがって不正解です。

<黒本 解説>
Aでない理由:ArrayListは、要素のあるなしにかかわらず、バッファ(空き)を持っています。要素を次々と追加していって空きが少なくなると、自動的にバッファを作ります。そのため、要素数をあらかじめ決まっている配列に比べれば、余分にメモリを使ってしまうことになります。したがって不正解です。

Bの理由:Javaの標準クラスライブラリには、ArrayListのほかにも配列の代わりにたくさんのインスタンスを管理するための便利なクラスがいくつも用意されています。これらのクラスの利用法を定めたインタフェースも用意されており、インタフェースに定められたAPIを理解していれば、共通した方法でこれらのクラスを扱えるようにもなっています。このようなインタフェース群をひとまとめにして「コレクションAPI」と呼びます。ArrayListは、java.util.ListインタフェースというコレクションAPIを実装したクラスです。したがって正解です。

問題のニュアンスが微妙にちがう可能性もあるので両者の問題を載せました。
私はほぼ同内容だと思っています。

両者とも間違ったことは言っていないので私には判断しかねます。
わかる方がいらっしゃいましたらご意見をいただきたいと思います。
もしくは悪問で解釈のしようによると、どちらも正解といえるといったオチでしょうか。
もしわかるかたがいらっしゃればお願いします。

本の内容を載せることは気が引けますが、私以外の同内容で悩んでいる人の助けになったり、
この問題の改善にも繋がったりすると思い、このような形で投稿させて頂きました。

shou_hitotose👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

ArrayListは確かに要素の有無に関わらず、事前に領域を確保します。
その確保した領域を超えるとまた要素数を一定量増やします。
なので、昔コーディング規約見た事がありますが、初期要素数が予め分かっている場合は、

Java

1new ArrayList<String>(100);

のように要素数を指定して確保するのが良いそうです。
こういった動きをするので「メモリ消費を節約出来る」とは言い切れないと思います。

投稿2015/10/01 06:03

rice

総合スコア70

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

一般論で言うと、どちらの選択肢Aも、言っていることがあいまいなので、どちらも必ずしも正しくないと思います。

どのような場合に「メモリー使用量が少ない」「メモリー消費を節約できる」なのかを定義していないので、定義によっては正しいといえたり言えなかったりします。

ほとんど解説のところと言っていることは同じですが、このようにも説明できます。

  • 1バイトの無駄も避けたいなら配列を使いたいけれど、最初に要素数が決まってなければ配列の要素数を多めにとるか、サイズが足りなくなったときに新しい配列を作るので結局無駄が発生する
  • ArrayListは、バッファーは1バイトずつ拡張するのは無駄がある(配列を新しく作ってコピーする必要がありこれを1バイトずつするのは効率が悪い)ので、要素数に余裕を持たせるようにしており、その点ではメモリーの無駄遣いとも言える

直接は関係ありませんが、どちらかを選ぶ理由としてはほかにも観点があって、ジェネリクスでは配列を使った場合に問題があり、コレクションを使うことが推奨されていたりします。

結局のところ、資格試験の出題者の考えに依存する話であり、どちらが正解というのは難しそうですね。
私には試験のことは知識も経験も無いので、傾向などを推測することもかないませんが。

投稿2015/10/01 06:15

argius

総合スコア9390

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

通常、ArrayListを使う場合には、(ArrayListにしかない機能を使う状況でなければ)以下のように宣言します。

java

1List<String> list = new ArrayList<String>();

このようにしておけば、もし何かで中身の実装をArrayListから入れ替える必要が出たとしても、この宣言さえ入れ替えてしまえば、高速な実装・省メモリな実装など、どんなListでも使うことができます。これが配列にない大きなメリットです。

省メモリかどうかは、状況依存なので一概には言えません。

投稿2015/10/01 05:52

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問