Javaの基礎から、コレクション、例外処理、新しいバージョンで追加された機能まで、幅広く出題する10問のクイズを用意しました。普段何気なく書いているコードも、あらためて問われると意外と迷うものです。初心者の方は知識の整理に、経験者の方は理解度のチェックにお使いください。全問解き終えたあとは、解説を読んで曖昧だった部分を確認してみましょう。まずは気軽に挑戦してみてください。
Q1 : 次のコードを実行したとき、標準出力に表示される内容はどれですか? char c = 'A'; c++; System.out.println(c); 66 A B コンパイルエラー
char型は内部的には16ビットの符号なし整数(Unicodeのコードポイント)として扱われるため、++演算子で値を1増やせます。インクリメント演算子は複合代入と同様に暗黙の型変換を伴い、結果も型charのままです。'A'の次は'B'なので、printlnにchar型が渡されて文字として出力され、Bと表示されます。66という数値にはなりません。
Q2 : 次のコードの実行結果として正しいものはどれですか? Integer a = 128; Integer b = 128; System.out.println(a == b); true false コンパイルエラー 実行時に例外が発生する
IntegerオブジェクトへのオートボクシングはInteger.valueOfを使い、-128から127の範囲はキャッシュされた同一オブジェクトが返されます。128はこの範囲外のため、a と b は別々のオブジェクトになり、参照を比較する==ではfalseとなります。ラッパークラスの値を比較するときは、equalsメソッドを使うのが安全です。
Q3 : インターフェースにdefaultメソッド(実装を持つメソッド)が導入されたJavaのバージョンはどれですか? Java 5 Java 8 Java 11 Java 17
defaultメソッドはJava 8で導入されました。既存のインターフェースに新しいメソッドを追加しても、それを実装している既存クラスを壊さないようにする目的があります。Java 8ではラムダ式やStream APIも追加されており、コレクションのforEachなどがdefaultメソッドとして提供されています。またstaticメソッドもインターフェースに書けるようになりました。
Q4 : 抽象クラス(abstractクラス)について正しい記述はどれですか? newで直接インスタンス化できる abstractメソッドを持つことはできない コンストラクタを持つことができる finalと同時に指定できる
抽象クラスは直接インスタンス化できませんが、コンストラクタを持つことができます。サブクラスのコンストラクタからsuper()で呼び出され、共通の初期化処理に利用されます。抽象クラスはabstractメソッドを持てますし、通常のメソッドやフィールドも持てます。また、継承されることが前提のため、継承を禁止するfinalとは同時に指定できません。
Q5 : インデックスを指定した要素取得get(int index)が、要素数に関係なく一定時間(O(1))で行えるのはどれですか? LinkedList TreeSet PriorityQueue ArrayList
ArrayListは内部で配列を使っているため、インデックスを指定した要素取得が要素数に関係なく一定時間(O(1))で行えます。一方LinkedListは先頭または末尾から順にたどる必要があり、get(index)はO(n)になります。TreeSetやPriorityQueueにはインデックスで要素を取得するget(int)メソッドがありません。用途に応じてコレクションを選ぶことが大切です。
Q6 : Java 16で正式な機能として導入されたものはどれですか? record(レコードクラス) var(ローカル変数型推論) ラムダ式 Stream API
record(レコードクラス)はJava 14で最初にプレビューとして登場し、Java 16で正式機能になりました。データを保持するだけの不変クラスを簡潔に定義でき、コンストラクタやgetter相当のアクセサ、equals、hashCode、toStringが自動生成されます。varはJava 10、ラムダ式とStream APIはJava 8で導入されています。
Q7 : HashMapについて正しい記述はどれですか? キーにnullを使うことはできない 要素の格納順序が常に保証される 複数スレッドから安全に使えるスレッドセーフなクラスである キーとしてnullを1つだけ格納できる
HashMapはnullキーを1つだけ許容し、nullの値も複数格納できます。要素の順序は保証されず、順序を保つ必要があればLinkedHashMapやTreeMapを使います。またHashMap自体はスレッドセーフではなく、並行処理ではConcurrentHashMapなどを使用します。なおHashtableとConcurrentHashMapはnullキーを許可しません。
Q8 : 次のコードを実行したとき、標準出力に表示される値はどれですか? System.out.println(7 / 2); 3 3.5 4 3.0
Javaでは、int同士の除算は整数除算となり、小数点以下は切り捨てられます。そのため7 / 2の結果は3.5ではなく3になります。もし3.5を得たい場合は、7 / 2.0のようにどちらかをdoubleにするか、(double) 7 / 2のようにキャストして、浮動小数点数の演算にする必要があります。四捨五入ではなく切り捨てである点にも注意が必要です。
Q9 : 次の例外クラスのうち、コンパイル時に捕捉または宣言が強制される検査例外(checked exception)はどれですか? NullPointerException IllegalArgumentException IOException ArithmeticException
IOExceptionはExceptionを継承し、RuntimeExceptionを継承しないため検査例外です。メソッド内で発生しうる場合は、try-catchで捕捉するかthrows宣言で呼び出し元へ伝える必要があります。一方、NullPointerException、IllegalArgumentException、ArithmeticExceptionはRuntimeExceptionのサブクラスで非検査例外のため、捕捉や宣言は強制されません。
Q10 : Javaで文字列を表すStringは、基本データ型ではないものを選ぶ問題です。次のうち基本データ型(プリミティブ型)でないものはどれですか? boolean String char long
Javaの基本データ型はbyte、short、int、long、float、double、char、booleanの8種類です。Stringはjava.langパッケージのクラスであり参照型に分類されます。そのため文字列リテラルでもメソッド(length()やsubstring()など)を呼び出せます。boolean、char、longはいずれも基本データ型で、メソッドは持たず値そのものを直接保持します。
まとめ
いかがでしたか? 今回はJavaクイズをお送りしました。
皆さんは何問正解できましたか?
今回はJavaクイズを出題しました。
ぜひ、ほかのクイズにも挑戦してみてください!
次回のクイズもお楽しみに。