Javaプログラマであるかを見分ける10の質問 をやってみる。とりあえずカンペなしで。あぁ怖い。
1. ==演算子とequalsメソッドの違いは何か?
A. オブジェクトの場合、 ==
はインスタンスが同じことを意味する。 equals
は等価であることを示し、何をもって等価とするかはオブジェクトの実装による。プリミティブ型の場合は ==
は値が同じであることを意味する。
2. 文字列の+演算子による連結とStringBuilderを使った連結の違いを説明せよ。文字列の連結は原則として+演算子を使ってはならない理由を説明せよ。
A. 文字列は不変なので、 + 演算子で連結する場合は無駄に新しい String
のインスタンスが作成されてしまうことがあるため + 演算子を使うのはパフォーマンス上問題になることがある。それに対し StringBuilder は文字をバッファして最後に String
のインスタンスを作る。ただしコンパイラーが内部的に StringBuilder を使った実装に置き換えてくれる場合もあるので、ループ内でゴリゴリ + 連結するようなのでなければ今はさほど問題にならない・・と思う。
3. List
のようにジェネリクス型を使う主たる目的は何か?
A. コレクションから要素を参照する際にキャストが不要になり、型安全になるから。
4. オブジェクトがガベージコレクション(GC)される主たる条件は何か?
A. オブジェクトがどこからも参照されなくなったとき?特定のクラスの場合に、参照がそいつひとつだけの場合ってのもあったかな。もしくはメモリが足りなくなったときとか?
5. チェック例外と非チェック例外の違いを型と例外処理の観点で説明せよ。
A. チェック例外は呼び出し元で catch
が強制されるため、エラー処理を確実に行うことができる。ただし API の設計がまずかったり*1、呼び出し元の実装者がアレだと throws Exception
で上に丸投げしたり例外を握りつぶしたりすることがあるので、そういう場合ただコードの見通しが悪くなったりバグの発見を遅らせたりするだけになるので害悪になることがある。非チェック例外は呼び出し元でのハンドリングが強制されないので API の見通しが良くなるが、ほっとくと落ちる。 web アプリケーションなんかではフレームワークでハンドリングすればいいので非チェック例外が向いているように思う。 web では例外キャッチしても上に投げ直す以外にやりようがなかったりするので。型の観点ってのはよくわかんね。
6. フィールドのアクセス修飾子をprivateにしgetter/setterメソッドを提供する事でフィールドを参照する設計方針を取る主な理由を説明せよ
A. フィールドアクセスの前後に処理を挟む余地を与えるため。
7. NullPointerExceptionが発生するのは主にどういう状況か?
A. Null のオブジェクトに対してメソッド呼び出しやフィールド参照を行なおうとした場合?ってこと?もしくは入力チェックがザルとか javadoc がいい加減とか?
8. オーバーロードとオーバーライドの違いは何か?
A. オーバーライド親クラスの処理を上書きするもの。オーバーロードは自身のメソッドの同名で引数違いのものを指す。ってこと?
9. コンストラクタとは何か?
A. オブジェクトのインスタンスを作成する処理?
10. インターフェイスを利用する目的を1つ説明せよ
A. モックを用いた単体テストを容易にするため。
合ってんのかな・・。
とりあえず 「C#できます」と言い放ったあいつがJavaプログラマであることを見分ける10の質問 - 猫とC#について書くmatarilloの日記 はさっぱりわからなかったorz
*1:例外種類大杉とか