2019年12月27日金曜日

徹底攻略 Java SE 8 Silver 問題集

徹底攻略 Java SE 8 Silver 問題集 通称 黒本です。
プログラミング未経験でいきなりこれをやると解説読んでも「いや、知りたいのそこじゃない」というのが多いので私なりの解説を書いていこうと思います。他のJavaの本や検索をいくらしても知りたいことが見つかりません。随時追記します。
解説は解説でその項目について解説してるのでいいのですが、それ以前の問題というのが多いと思います。
著作権があるので問題文やソースコードを全て書けませんが仕方ありません。
そして私はまだ受かってません。Blonzeからやったほうがいいかもしれません。
間違っていたら指摘してください。




p51 1章-11の解説内

【設問コード6~7行目のイメージ】という図でaとbの参照が外れています。であるならガーベッジコレクションなのはaとbで解答はCになるのではないでしょうか?


p272 9章-2
問題のプログラムを実行したら結果はどうなるかというものです。

コンパイルエラーにはなりません。

4行目の hello(str); は実行後の結果を取得していないので意味がありません。
例えば str = hello(str); のようにしないと意味がありません。

7行目からのhelloメソッド内で4行目と同じようにreplaceAllしても結果を取得していないので意味がありません。さらにreturn文で結果を返す必要があります。

上記のことを反映すると例えば下記のようになります。
これで「hello,world.」と表示されます。

public class Main{
   public static void main(String[] args){
         String str = "hoge, world.";
         str = hello(str);
         System.out.println(str);
      }
      private static void hello(String msg){
         String str = msg.replaceAll("hoge", "hello");
         return str;
      }
}

しかし、p478 11章-51はreturn文なしで値が返ってるような気がするのですが。

p290 9章-31
ArrayListの説明について正しいものを選ぶというものです。

「動的」とは要素数を変更できるというこのようです。ただの配列はできません。

しかし、これ一般的に言われていることなのではないでしょうか?Oracleがこのように定義しているというのを見つけられません。だとしたら問題として不適切なのでは。


p294,295 9章-36,37
問題のプログラムを実行したら結果はどうなるかというものです。

この2つの問題はAllayListで拡張forにより要素を取り出すというものです。問36は実行できるのに問37は実行時に例外がスローされます。両問題はほぼ同じ内容なのに結果が違うので混乱しました。ネットで検索すると同じようなことが書いてあるのが複数見られます。

問37の解説では拡張forで要素を取り出してる間にremoveメソッドを実行し要素を削除するから例外がスローされるということが書いてあります。

問36は要素数が3で”A”,”B”,”C”を入れています。そして、"B"をremoveします。1番目にあった"B"が削除され2番目の"C"が1番目に繰り上がります。すると、その次は要素がないので拡張forは終了します。ちなみに"A"が0番目です。

問37は要素数が5で"A","B","C","D","E"を入れています。そして、"C"をremoveします。次に”D”と”E”が繰り上がります。しかし、その次は要素”E”があるので拡張forは終了しません。したがって「拡張forで要素を取り出してる間にremoveメソッドを実行」したとして例外がスローされるようです。

しかし、これ解説を何回読んでも問36も「拡張forで要素を取り出してる間にremoveメソッドを実行」している気がします。もし、分かる方がいたら教えて下さい。

それと、問題とは関係ないですが要素が何万も何億もあった場合繰り上げたり繰り下げたりということをやってられないと思います。メモリ上の限界があったりそんなに要素があるならデータベース使えという話になってくるとは思いますが。内部処理としてはどのようになってるのでしょうか?分かる方がいたら教えて下さい。

p354 10章-13
2次元配列に"a","b","c","d"が順番に入っています。ここで選択肢Bは"C"だけが表示されるがそれは何故なのかというものです。

まず外側のfor文でi = 0 が設定されます。次に内側のfor文でj = 0が設定され j < i が判定されます。これは0 < 0 となりfalseです。

次に ++j され j = 1となり j < i が判定されます。これは 1< 0 となりfalseです。

次に外側のforに戻り i++ され i = 1 となります。内側のfor文に進みj = 0 で j < i が判定されます。0 < 1 で trueです。 i = 1,j = 0 なので array[1][0] となり "C"が出力されます。

次に ++j され j = 1となり j < i が判定されます。1 < 1 となりfalseです。

p376 10章-44
抽象クラスの定義についてです。

抽象クラスや具象クラスがなんなのか、どうやって使うのか未だによく分かりません。

抽象クラスとは解説に
・abstractで修飾すること
・実装を持つことはできない(中かっこは書けずセミコロンで終わること)
と書いてあります。中かっこは{}、セミコロンは;です。

正解はAです。

Bは両メソッド共abstractがありません。このとき中かっこ{}が必要です。又は両方にabstractを書かなければなりません。

CはcalcPriceメソッドにabstractがないので中かっこ{}が必要です。又はabstractを書かなければなりません。

Dはabstractが書かれているので中かっこ{}は書けません。又はabstractを削除する必要があります。

要するにabstractがあれば中かっこ{}は不要。abstractがなければ中かっこ{}が必要ということのようです。
abstract→○、中かっこ{}→☓
abstract→☓、中かっこ{}→○

しかし、Itemメソッド(クラス)はabstract→○、中かっこ{}→○となっています。これはクラスだからということでいいのでしょうか?

p384 10章-55
ラムダ式についてです。

ラムダ式全然分かりません。

選択肢Aは
test(list, () -> s.getNum() > 20);を
test(list, (s) -> s.getNum() > 20);
にすると "A" が表示されるようになりました。

正解はCなのですがCは
test(list, s -> s.getNum() > 20);
です。これは"A"を表示します。

比較すると下記のようになりますが。sの()があるかないかです。省略できるということなんですかね。
選択肢Aの改善版 test(list, (s) -> s.getNum() > 20);
選択肢C               test(list,  s  -> s.getNum() > 20);


p386 10章-59
例外についてです。

設問のコードの5行目と11行目にあるMyExceptionはRuntimeExceptionのサブクラスだそうです。これは設問のコードの18行目にMyException extends RuntimeExceptionで判断するようです。

11行目のMyExceptionをnewしたときにRuntimeExceptionをextends(継承)されてMyExceptionがthrowされるとRuntimeExceptionでcatchできるようになるそう。

MyExceptionではcatchできないのですかね?

0 件のコメント:

コメントを投稿