ここでは、当社の新人研修受講者に向けて、基本情報のJavaの過去問を掲載しています。

想定しているのは、NetBeansなどのIDEにコピー・ペーストしたうえで、自分の正しいと思う答えを埋めて動作を確認するという使い方です。


次の Java プログラムの説明及びプログラムを読んで,設問1,2に答えよ。

〔プログラムの説明〕

 クラス ArrayAppendableCharSequence 及び ListAppendableCharSequence は , 追加可能な 0 個以上の文字からなる文字列(文字の並び)を表現するインタフェース AppendableCharSequence を異なるデータ構造で実装したプログラムである。

 インタフェース AppendableCharSequence は,パッケージ java.lang のインタフェース CharSequence 及び Appendable で定義されている次のメソッドからなる。

(1) メソッド charAt は,引数 index で指定された位置の文字を返す。文字の位置はインデックス値 で表され,文字列の長さが1以上のとき,最初の文字の位置は0,最後の文字の位置は文字列の 長さ-1で表される。引数で指定されたインデックス値が負又は文字列の長さ以上の場合は, IndexOutOfBoundsException を投げる。

(2) メソッド length は,文字列の長さを返す。

(3) メソッド append は,引数で指定された文字を文字列の末尾に追加する。戻り値として,この AppendableCharSequence のインスタンス自身を返す。

(4) メソッド toString は,このインスタンスの文字列を String オブジェクトで返す。

 クラス ArrayAppendableCharSequence は,char 型の配列を用いてインタフェース AppendableCharSequence を実装したものである。メソッド append は,配列の空いている 最初の要素に文字を格納する。配列に空き要素がないときは,要素の個数が現在の配列よりも EXT_SIZE の値だけ大きな配列を生成し,既存の文字データを移し,空いている最初の要素に 文字を格納する。

 クラス ListAppendableCharSequence は,連結リスト構造を用いてインタフェース AppendableCharSequence を実装したものである。入れ子クラス ListAppendableCharSequence.Bucket(以下,Bucket という)は ,連絡リストの 要素である。Bucket のインスタンス1個につき,要素の個数が EXL_SIZE である char 型の 配列を用意し,そこに文字データを保持する。Bucket の配列に空き要素がなくなり,次の文字を 追加できないときは,新規に Bucket のインスタンスを生成し,連絡リストに追加する。

 クラス Test は,上記二つのクラスそれぞれの実装が異なるメソッド append の実行時間を測定する プログラムである。メソッド measureTime は,引数 n で指定された回数だけ,引数 a で指定された インスタンスのメソッド append を呼び出し,実行時間をミリ秒単位で測定する。

[プログラム1]

[プログラム2

[プログラム3

[プログラム4

設問1 プログラム中の /*    */に入れる正しい答えを, 解答群の中から選べ。

a に関する解答群

ア data.length + length      イ data.length + temp.length

ウ length                          エ length + EXT_SIZE

オ temp.length

b に関する解答群

ア index                             イ index % EXT_SIZE

ウ index / EXT_SIZE            エ length

オ length % EXT_SIZE         カ length / EXT_SIZE

c に関する解答群

ア length     イ length + 1     ウ length – 1

エ offset      オ offset + 1      カ offset – 1

d に関する解答群

ア len          イ len % EXT_SIZE         ウ len – length

エ length     オ length % EXT_SIZE     カ length – len

e に関する解答群

ア AppendableCharSequence

イ ArrayAppendableCharSequence

ウ ListAppendableCharSequence

エ ListAppendableCharSequence.Bucket

オ Object

カ String

設問2 クラス Test を用いて各クラスのメソッド append の実行時間(ミリ秒)を 測定したところ,表1の結果になった。

append

 文字の追加回数が多くなるにつれて ListAppendableCharSequence の方が遅くなるのは, 連絡リストをたどる回数が増えるためであると推測される。そこで, ListAppendableCharSequence.append の性能を改善するために,次の修正を行った。/*  */ に入れる正しい答えを,解答群の中から選べ。
 なお,ほかの変更はないものとする。

(1) 連絡リストの最後の要素を常に参照するためのフィールド last を追加する。

(2) コンストラクタでフィールド last を初期化する。

(3) メソッド append でフィールド last を利用する。

解答群

ア bucketList     イ bucketList.next     ウ last
エ last.next       オ new Bucket()        カ null