JavaのStringクイズ
Java String Quizへようこそ。StringはJavaで最も重要なクラスの一つです。もしJavaでプログラミングを何かしら行ったことがあれば、必ず使用したことがあるでしょう。
Javaの面接やクイズの問題として、文字列は非常に人気があります。ですので、私はいくつかの素晴らしい、そしてトリッキーなJava文字列クイズの問題を集めました。試してみるべきです。
JavaのStringクイズ
このクイズには21の質問があります。もし15個以上正しく答えることができたら、あなたは文字列の概念にとても優れていると考えてください。各質問の後に「回答を表示する」ボタンをクリックすることで答えと詳しい説明を確認できます。
「ストリングクイズを始めましょう。幸運をお祈りします。」
以下のステートメントの出力は何になりますか?
String s = "Java String Quiz";
System.out.println(s.charAt(s.toUpperCase().length()));
A. 「Z」を90の整数に変換し、「90」と表示します。
B. 実行時例外
C. 「z」と表示します。
D. 「Z」と表示します。
ランタイム例外が発生します。スレッド「main」の中で例外が発生しました。java.lang.StringIndexOutOfBoundsException:文字列インデックスが範囲外です:16これは、インデックスの値が0から始まるためです。
2. 以下の文の出力は何になりますか?
String s = "Java String Quiz";
System.out.println(s.substring(5,3));
A. “Str” のプリント
B. ランタイムエラー
C. インデックスが範囲外です ランタイムエラー
D. 文字列のインデックスが範囲外です コンパイル時エラー
正解:B
エラーメッセージとしてException in thread “main” java.lang.StringIndexOutOfBoundsException: begin 5, end 3, length 16とともにランタイム例外がスローされます。これは、終了インデックスが開始インデックスよりも小さいためです。
3. Stringクラスの有効なメソッドをすべて選択してください。
A. trim() – トリミングする
B. intern() – 文字列をインターンにする
C. toLower() – 小文字に変換する
D. split() – 分割する
4. 下記の文の出力は何になりますか?
String s1 = "Cat";
String s2 = "Cat";
String s3 = new String("Cat");
System.out.print(s1 == s2);
System.out.print(s1 == s3);
A. 真偽 (しんぎ)
B. 真真 (しんしん)
C. 偽偽 (ぎぎ)
D. 偽真 (ぎしん)
一方、new演算子を使用することで、Stringクラスに強制的にヒープ領域に新しいStringオブジェクトを作成させます。そのため、s1とs2はプール内の同じStringへの参照を持ちますが、s3はプール外の別のオブジェクトになるため、出力が異なるです。
5. スイッチケースにおいて、以下の文はどれが真ですか?
A. Java 1.5以降のバージョンでは、switch case内で文字列を使用することが許可されています。
B. Java 1.7以降のバージョンでは、switch case内で文字列を使用することが許可されています。
C. switch-caseの実装ではequals()メソッドが使用されるため、NullPointerExceptionを避けるためにnullチェックを追加してください。
正解:B、C
java switch case stringで詳細を読む
6. StringBufferとStringBuilderについて、以下の文のうち真実であるものはどれですか?
A. StringBuilderはスレッドセーフではありません。
B. StringBufferは、メソッドが同期されているため、スレッドセーフです。
C. StringBuilderはJava 1.4で導入されました。
D. StringBufferとStringBuilderは不変です。
StringBufferオブジェクトは、メソッドが同期されているためスレッドセーフです。しかし、ほとんどの場合においてはオーバーヘッドとなるため、Java 1.5でStringBuilderが導入されました。StringBuilderはスレッドセーフではありません。StringBufferとStringBuilderは変更可能なクラスです。String vs. StringBuffer vs. StringBuilderで詳細を読んでください。
7. 以下のデザインパターンの中で、文字列の実装はどれに従いますか?
A. フライウェイトデザインパターン
B. ファクトリーパターン
C. シングルトンパターン
D. 上記のどれでもない
文字列プールの実装はフライウェイトデザインパターンに従います。
8. 以下のステートメントの出力は何になりますか?
String s1 = "abc";
String s2 = "def";
System.out.println(s1.compareTo(s2));
A. 〇 (maru)
B. 真 (makoto)
C. -3 (ma-i no san)
D. 偽 (uso)
compareToメソッドは、2つの文字列を辞書順に比較します。比較は、文字列内の各文字のUnicode値に基づいて行われます。このStringオブジェクトによって表される文字列のシーケンスは、引数の文字列によって表される文字列のシーケンスと辞書順に比較されます。結果は、このStringオブジェクトが引数の文字列よりも辞書順で先行する場合には負の整数、辞書順で後続する場合には正の整数、文字列が等しい場合にはゼロです。compareToは、文字列が等しい場合には正確にequals(Object)メソッドがtrueを返す場合に0を返します。
これが辞書順の定義です。2つの文字列が異なる場合、それぞれの文字列の有効なインデックスで異なる文字が存在するか、文字列の長さが異なるか、または両方が該当します。1つ以上のインデックス位置で異なる文字が存在する場合、最小のインデックスをkとすると、位置kの文字の値が小さい方の文字列が、<演算子を使用して辞書順で先行します。この場合、compareToは、2つの文字列の位置kでの文字値の差、つまり以下の値を返します:
this.charAt(k)-anotherString.charAt(k)
例では、”abc”は”def”よりも先行するため、負の整数が返されます。次に、異なる文字が存在する最も小さいインデックスである0と、aからdまでが-3と等しいです。
以下のプログラムの出力は何になりますか?
public class Test {
public static void main(String[] args) {
String x = "abc";
String y = "abc";
x.concat(y);
System.out.print(x);
}
}
A. あるいは、A. アルファベット
B. あるいは、A. アルファベットアルファベット
C. あるいは、C. ヌル
10. 以下のプログラムの出力は何になりますか?
public class Test {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "abc";
System.out.println("s1 == s2 is:" + s1 == s2);
}
}
A. 偽 (ぎ)
B. s1とs2が等しい:true (s1とs2がひとしいと:true)
C. s1とs2が等しい:false (s1とs2がひとしいと:false)
D. 真 (しん)
正しい回答:A
Javaでは、+演算子の優先度が==演算子よりも高いため、与えられた文の出力は「false」になります。したがって、与えられた式は「s1 == s2 は:abc」==「abc」と評価され、つまりfalseとなります。
11. 以下のステートメントの出力は何になりますか?
String s = "Java"+1+2+"Quiz"+""+(3+4);
System.out.println(s);
A. ジャバ3クイズ7
B. ジャバ12クイズ7
C. ジャバ12クイズ34
D. ジャバ3クイズ34
各結合ごとに文字列が得られるため、下記のように出力が生成されます。
“Java”+1+2+“Quiz”+“”+(3+4)
= “Java”+1+2+“Quiz”+“”+7
= “Java1”+2+“Quiz”+“”+7
= “Java12”+“Quiz”+“”+7
= “Java12Quiz”+“”+7
= “Java12Quiz”+7
= “Java12Quiz7”
12. 以下の文で作成されるStringオブジェクトはいくつありますか?
String s = "abc"; // statement 1
String s1 = new String("abcd"); // statement 2
A. 1 – いち
B. 2 – に
C. 3 – さん
D. 4 – よん
正しい答え:C
1番目の文では、文字列プールで「abc」が作成されます。
2番目の文では、まず文字列プールで「abcd」が作成されます。それがString new演算子の引数として渡され、別の文字列がヒープメモリに作成されます。
したがって、合計3つの文字列オブジェクトが作成されます。
13. 以下のステートメントの出力は何になりますか?
String s1 = "abc";
String s2 = new String("abc");
System.out.print(s1==s2);
System.out.println(s1==s2.intern());
A. 偽り真 (いつわりまこと)
B. 偽り偽 (いつわりいつわり)
C. 真真 (まことまこと)
D. 真偽 (まこといつわり)
したがって、s1==s2はfalseを返します。
s2.intern()メソッドが呼び出されると、プール内に値が「abc」の文字列があるかどうかを確認します。したがって、s1の参照を返します。したがって、今度はs1とs2の両方が同じ文字列インスタンスを指しています。
したがって、s1==s2.intern()はtrueを返します。
14. Stringクラスに実装されているすべてのインターフェースを選択してください。
A. シリアライズ可能 (shiriarizu kanō)
B. 比較可能 (hikaku kanō)
C. 結界守 (kekkaishu)
D. クローン可能 (kurōn kanō)
答えを表示するには、クリックします。
正解:A、B、C
Stringは直列化および比較可能です。ConstableはJava 12のリリースで新しいインタフェースです。
15. StringをMapのキーにするのに理由となるものをすべて選択してください。
A. 文字列は変更不可能です。
B. 文字列は最終的です。
C. 文字列はhashCode()とequals()メソッドを正しく実装しています。
D. 文字列のハッシュコードはキャッシュされています。
16. 以下のコードスニペットの出力は何になりますか?
String s1 = new String("java");
String s2 = new String("JAVA");
System.out.println(s1 = s2);
A. JAVA
B. java
C. true
D. false
A. ジャバ
B. ジャヴァ
C. 真
D. 偽
17. 以下の文の出力は何になりますか?
String s1 = "abc";
StringBuffer s2 = new StringBuffer(s1);
System.out.println(s1.equals(s2));
A. 嘘です。(Uso desu.)
B. 真実です。(Shinjitsu desu.)
C. 実行時のClassCastExceptionです。(Jikkouji no ClassCastException desu.)
D. コンパイル時エラーです。(Konpaairu-ji error desu.)
正しい答え:A
s2がString型ではないため、falseが表示されます。Stringのequals()メソッドの実装を見ると、渡されたオブジェクトの型がStringであるかどうかを確認するために、instanceof演算子を使用してチェックが行われます。そうでない場合は、falseを返します。
18. 以下のコードスニペットの出力は何になりますか?
String s1 = "abc";
String s2 = new String("abc");
s2.intern();
System.out.println(s1 == s2);
A. 嘘(うそ)
B. 真実(しんじつ)
C. ヌル
正しい答え:A
これは難しい問題であり、出力はfalseになります。intern()メソッドは文字列プールからStringオブジェクトの参照を返すことがわかっていますが、s2に再代入しなかったため、s2には変化がありません。したがって、s1とs2は異なる参照を持っています。
行3のコードをs2 = s2.intern();に変更すると、出力はtrueになります。
19. Stringクラスを拡張している全てのクラスを選択してください。
A. 文字列バッファ
B. 文字列ビルダー
C. 文字列ライター
D. 存在しない
回答:D
それは厄介な質問です。Stringは最終クラスなので、それを拡張することはできません。
20.次の文のうち、JavaのStringに関する真実はどれですか?
A. StringBufferと同様に、Stringクラスを拡張することができます。
B. java.utilパッケージにはStringクラスが定義されています。
C. JavaではStringは変更不可です。
D. JavaではStringはスレッドセーフです。
E. JavaではStringは大文字と小文字を区別します。
正しい答え:C、D、E
Stringクラスはfinalなので拡張できません。StringBufferはそれを拡張していません。Stringクラスはjava.langパッケージに定義されています。文字列は不変であり、したがってJavaではスレッドセーフです。Stringは大文字と小文字を区別するため、「abc」と「ABC」は等しくありません。
21. 下記の文の出力は何になりますか?(Kōkio no bun no shutsuryoku wa nan ni narimasu ka?)
String s1 = null;
System.out.print(s1); // line 2
System.out.print(s1.toString()); // line 3
以下の文を日本語で自然に言い換えます。1つのオプションのみ提供します:
A. nullnull
B. nullの後にNullPointerException
C. NullPointerException
A. ヌルヌル
B. ヌルの後にヌルポインタ例外
C. ヌルポインタ例外
正解:B
2行目は、次のようにnullの確認が行われるため、nullが表示されます。
if (s == null) { s = “null”;}
3行目は、null上でtoString()関数を呼び出そうとしているため、NullPointerExceptionがスローされます。
結論
このクイズでは、Stringに関する重要なポイントをほぼ網羅しようとしました。もし興味深い概念が見落とされていると思われる場合は、コメントを通じてお知らせください。もしクイズが気に入った場合は、他の人とも共有してください。