ようこそ、Java String Quizへ。StringはJavaで最も重要なクラスの一つです。もしJavaでプログラミングを行ったことがあれば、Stringを使用したことがあるでしょう。
Stringは、Javaの面接の質問やクイズに関する非常に人気のあるトピックです。そこで、いくつかの素晴らしいかつトリッキーなJava String Quizの質問を集めてみました。
Java String Quiz
このクイズには21の質問があります。もし15以上の正しい回答ができるなら、自分自身を本当にStringの概念において優れたものと考えてもいいでしょう。各質問の後には、「答えを表示」ボタンをクリックして、答えと詳細な説明を確認できます。
さて、String Quizを始めましょう。幸運を祈ります。
1. 以下の文の出力は何でしょうか?
String s = "Java String Quiz";
System.out.println(s.charAt(s.toUpperCase().length()));
A. Convert “Z” to int 90 and prints “90”
B. Runtime Exception
C. Prints “z”
D. Prints “Z”
Click to Reveal Answer
**正解: B
**
これは実行時例外をスローします。Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 16
。これはインデックスの値が0から始まるためです。
2. 以下の文の出力は何でしょうか?
String s = "Java String Quiz";
System.out.println(s.substring(5,3));
A. Prints “Str”
B. Runtime Exception
C. IndexOutOfBoundsException Runtime Exception
D. StringIndexOutOfBoundsException Compile-time error
Click to Reveal Answer
**正解: B
**
これは実行時例外をスローし、エラーメッセージはException in thread "main" java.lang.StringIndexOutOfBoundsException: begin 5, end 3, length 16
です。これは終了インデックスが開始インデックスよりも小さいためです。
3. Stringクラスのすべての有効なメソッドを選択してください。
A. trim()
B. intern()
C. toLower()
D. split()
Click to Reveal Answer
正解: A、B
Stringクラスの有効なメソッドは、trim()、intern()、toLowerCase()、split(String regex)です。
4. 以下の文の出力は何になりますか?
String s1 = "Cat";
String s2 = "Cat";
String s3 = new String("Cat");
System.out.print(s1 == s2);
System.out.print(s1 == s3);
A. truefalse
B. truetrue
C. falsefalse
D. falsetrue
Click to Reveal Answer
**正解:A
**
Stringを作成するためにダブルクォートを使用すると、まずStringプール内で同じ値のStringを検索します。見つかった場合は参照を返し、そうでない場合は新しいStringをプール内に作成してから参照を返します。
ただし、new演算子を使用すると、Stringクラスに新しいStringオブジェクトをヒープ領域に作成するように強制します。したがって、s1とs2はプール内の同じStringを参照し、s3はプール外の異なるオブジェクトを参照します。
5. switch文のstringについて、以下の文はどれが正しいですか?
A. String is allowed in switch case for Java 1.5 or higher versions.
B. String is allowed in switch case for Java 1.7 or higher versions.
C. The equals() method is used by switch-case implementation, so add null check to avoid NullPointerException.
6. StringBufferとStringBuilderについて、以下の文はどれが正しいですか?
A. StringBuilder is not thread-safe.
B. StringBuffer is thread safe because its methods are synchronized.
C. StringBuilder was introduced in Java 1.4
D. StringBuffer and StringBuilder are immutable.
Click to Reveal Answer
正解:A、B
StringBufferオブジェクトはスレッドセーフです。そのため、メソッドは同期されます。ただし、これはほとんどの場合でオーバーヘッドになるため、Java 1.5でStringBuilderが導入されました。StringBuilderはスレッドセーフではありません。StringBufferとStringBuilderは可変のクラスです。String vs StringBuffer vs StringBuilderを参照してください。
7. Stringの実装は以下のデザインパターンに従っていますか?
A. Flyweight Design Pattern
B. Factory Pattern
C. Singleton Pattern
D. None of the above
Click to Reveal Answer
正解:A
文字列プールの実装は、フライウェイトデザインパターンに従います。
8. 以下の文の出力は何ですか?
String s1 = "abc";
String s2 = "def";
System.out.println(s1.compareTo(s2));
A. 0
B. true
C. -3
D. false
Click to Reveal Answer
**正解:C
**
String compareTo()メソッドのドキュメントから:
compareToメソッドは、2つの文字列を辞書順に比較します。比較は、文字列内の各文字のUnicode値に基づいて行われます。このStringオブジェクトによって表される文字シーケンスは、引数の文字シーケンスと辞書順で比較されます。このStringオブジェクトが引数の文字列よりも辞書順で先行する場合、結果は負の整数です。このStringオブジェクトが引数の文字列よりも辞書順で後に続く場合、結果は正の整数です。文字列が等しい場合、結果はゼロです。compareToは、equals(Object)メソッドがtrueを返す場合に正確に0を返します。
これが辞書順の定義です。2つの文字列が異なる場合、それらはいずれかの文字列の両方にとって有効なインデックスで異なる文字を持っているか、長さが異なるか、またはその両方です。1つ以上のインデックス位置で異なる文字を持っている場合、kを最小のそのようなインデックスとします。この場合、位置kの文字が、<演算子を使用して辞書順に小さい値を持つ文字列が、他の文字列よりも先に来ます。この場合、compareToは、2つの文字列の位置kの2つの文字の値の差を返します。つまり、値は次のとおりです:
this.charAt(k)-anotherString.charAt(k)
例では、”abc”は”def”よりも前にあるため、負の整数が返されます。その後、異なる文字を持つ最も小さいインデックスは0であり、a-dは-3に等しい。
9. 以下のプログラムの出力は何になりますか?
public class Test {
public static void main(String[] args) {
String x = "abc";
String y = "abc";
x.concat(y);
System.out.print(x);
}
}
A. abc
B. abcabc
C. null
Click to Reveal Answer
正しい答え:A
x.concat(y)
は新しい文字列を作成しますが、xには割り当てられていないため、xの値は変更されません。
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. false
B. s1 == s2 is:true
C. s1 == s2 is:false
D. true
Click to Reveal Answer
正しい答え:A
与えられた文の出力は「false」になります。なぜなら、Javaでは+演算子の優先順位が==演算子よりも高いからです。したがって、与えられた式は「s1 == s2 is:abc」と「abc」を評価した結果、falseになります。
11. 以下の文の出力は何になりますか?
String s = "Java"+1+2+"Quiz"+""+(3+4);
System.out.println(s);
A. Java3Quiz7
B. Java12Quiz7
C. Java12Quiz34
D. Java3Quiz34
Click to Reveal Answer
正しい答え:B
まず、括弧内の式が実行されます。その後、すべての+演算子が実行されるため、左から右に実行されます。
各結合で文字列が生成されるため、以下のように出力が生成されます。
“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
Click to Reveal Answer
正しい答え: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. falsetrue
B. falsefalse
C. truetrue
D. truefalse
Click to Reveal Answer
正解:A
s1は文字列プールにあり、s2はヒープメモリに作成されます。
したがって、s1 == s2はfalseを返します。
s2.intern()
メソッドが呼び出されると、プール内に値が “abc” の文字列があるかどうかをチェックします。そのため、s1の参照を返します。したがって、s1とs2は同じ文字列インスタンスを指しています。
したがって、s1 == s2.intern()はtrueを返します。
14. Stringクラスに実装されているすべてのインターフェースを選択してください。
A. Serializable
B. Comparable
C. Constable
D. Cloneable
Click to Reveal Answer
正解:A、B、C
Stringはシリアライズ可能であり、比較可能です。ConstableはJava 12のリリースからの新しいインターフェースです。
15. MapのキーとしてStringを適切な候補とする理由をすべて選択してください。
A. String is immutable
B. String is final
C. String properly implements hashCode() and equals() method
C. String hashcode is cached
Click to Reveal Answer
**正解:A、B、C
**
正しいhashCode()およびequals()メソッドの実装は、Mapのキーには必須です。文字列はfinalで不変であるため、キーデータが破損する可能性はありません。
16. 以下のコードスニペットの出力は何ですか?
String s1 = new String("java");
String s2 = new String("JAVA");
System.out.println(s1 = s2);
A. JAVA
B.java
C. true
D. false
Click to Reveal Answer
**正解:A
**
「JAVA」と出力されます。println()メソッド内の引数は代入です。そのため、System.out.println("JAVA")
として扱われます。
17. 以下のステートメントの出力は何ですか?
String s1 = "abc";
StringBuffer s2 = new StringBuffer(s1);
System.out.println(s1.equals(s2));
A. false
B. true
C. ClassCastException at runtime
D. Compile-time error
Click to Reveal Answer
正しい答え: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. false
B. true
C. null
Click to Reveal Answer
正しい答え:A
これはトリッキーな質問で、出力はfalseになります。intern()メソッドは文字列プールからStringオブジェクト参照を返しますが、s2に戻り値を割り当てていないため、s2に変更はありません。したがって、s1とs2は異なる参照を持っています。
行3のコードをs2 = s2.intern();
に変更すると、出力はtrueになります。
19. Stringクラスを拡張しているすべてのクラスを選択してください。
A. StringBuffer
B. StringBuilder
C. StringWriter
D. None
Click to Reveal Answer
**正しい答え:D
**
これはトリッキーな質問です。Stringはfinalクラスなので、拡張することはできません。
20. JavaでStringに関する次の文はどれが正しいですか?
A. We can extend String class like StringBuffer does it.
B. String class is defined in java.util package.
C. String is immutable in Java.
D. String is thread-safe in Java.
E. String is case sensitive in Java.
Click to Reveal Answer
正しい答え:C、D、E
Stringクラスはfinalなので、拡張できません。StringBufferはそれを拡張しません。Stringクラスはjava.lang
パッケージで定義されています。文字列は不変であり、したがってJavaではスレッドセーフです。文字列は大文字と小文字を区別するため、「abc」と「ABC」は等しくありません。
21. 以下の文の出力は何になりますか?
String s1 = null;
System.out.print(s1); // line 2
System.out.print(s1.toString()); // line 3
A. nullnull
B. null followed by NullPointerException
C. NullPointerException
Click to Reveal Answer
正しい答え:B
行2はnull
を出力します。なぜなら、print
メソッドには次のようなnullチェックがあるからです:
if (s == null) { s = "null";}
3行目は、null上でtoString()関数を呼び出そうとしているため、NullPointerExceptionがスローされます。
結論
I have tried to cover most of the important points about String in this Quiz. If you think some interesting concept has been missed, please let me know through comments. If you liked the Quiz, share it with others too.
Source:
https://www.digitalocean.com/community/tutorials/java-string-quiz