JavaのStringに関する面接の質問と回答
以下、日本語で自然な言い方に言い換えます(一つのオプション):【ご挨拶】
「String」というのは、最も広く使用されているJavaクラスの一つです。この記事では、面接の準備のために、Stringに関する練習問題と回答をいくつか提供します。
JavaのStringクラスの知識をテストするために、JavaのStringクイズも試すことができます。
JavaのStringクラスとは何ですか?Stringはデータ型ですか?
JavaでのStringはクラスであり、java.langパッケージで定義されています。intやlongのようなプリミティブデータ型ではありません。Stringクラスは文字列を表します。ほとんどのJavaアプリケーションでStringが使用されます。StringはJavaでは不変でfinalです。JVMはすべてのStringオブジェクトを格納するために文字列プールを使用します。ダブルクオートを使用してStringオブジェクトをインスタンス化することができ、+演算子をオーバーロードして連結することもできます。
JavaでStringオブジェクトを作成するためのさまざまな方法はありますか?
新しい演算子を使用してStringオブジェクトを作成することもできますし、ダブルクォートを使用してStringオブジェクトを作成することもできます。例えば:
String str = new String("abc");
String str1 = "abc";
Stringクラスには、文字配列、バイト配列、StringBuffer、およびStringBuilderから文字列を取得するためのいくつかのコンストラクタがあります。
ダブルクォーテーションを使用してStringを作成すると、JVMはStringプールを調べて同じ値を持つ他のStringが格納されているかどうか調べます。もしStringが既にプールに格納されている場合、JVMはそのStringオブジェクトへの参照を返します。新しいStringがプールに存在しない場合、JVMは指定された値を持つ新しいStringオブジェクトを作成し、それをstring poolに格納します。new演算子を使用すると、JVMはStringオブジェクトを作成しますが、string poolには格納しません。intern()メソッドを使用してStringオブジェクトをString poolに格納するか、もし既に等しい値を持つStringがプールに存在する場合はその参照を返すことができます。
入力された文字列が回文かどうかをチェックするためのJavaメソッドを書いてください。
文字列が逆になっても同じ値を持つ場合、それは回文です。例えば、abaは回文の文字列です。Stringクラスには文字列を逆にするメソッドは提供されていませんが、StringBufferクラスとStringBuilderクラスには回文であるかどうかを確認するために使用できるreverse()メソッドがあります。例えば:
private static boolean isPalindrome(String str) {
if (str == null)
return false;
StringBuilder strBuilder = new StringBuilder(str);
strBuilder.reverse();
return strBuilder.toString().equals(str);
}
時々、面接官は他のクラスを使用しないで回文をチェックするようにお願いすることがあります。その場合、文字列の両端から文字を比較して回文であるかどうかを確認することができます。例えば:
private static boolean isPalindromeString(String str) {
if (str == null)
return false;
int length = str.length();
System.out.println(length / 2);
for (int i = 0; i < length / 2; i++) {
if (str.charAt(i) != str.charAt(length - i - 1))
return false;
}
return true;
}
指定された文字を文字列オブジェクトから削除するJavaのメソッドを作成してください。
replaceAllメソッドを使用して、文字列のすべての出現箇所を他の文字列で置換することができます。重要な点は、replaceAll()が引数としてStringを受け入れるため、Characterクラスを使用して文字列を作成し、それを空の文字列で置き換えることができるということです。
private static String removeChar(String str, char c) {
if (str == null)
return null;
return str.replaceAll(Character.toString(c), "");
}
Javaで文字列を大文字または小文字にする方法は何ですか?
StringクラスのtoUpperCaseメソッドとtoLowerCaseメソッドを使用すると、文字列オブジェクトをすべて大文字または小文字にすることができます。これらのメソッドには、Locale引数を受け入れ、指定された地域の規則を使用して文字列を大文字または小文字に変換するバリアントがあります。
「StringのsubSequenceメソッドとは何ですか?」
Java 1.4でCharSequenceインターフェースが導入され、Stringクラスはこのインターフェースを実装しているため、StringクラスにはsubSequenceメソッドがあります。内部的には、subSequenceメソッドはStringのsubstringメソッドを呼び出します。
Javaプログラムで2つの文字列を比較する方法は何ですか? (Java puroguramu de futatsu no mojiretsu wo hikaku suru houhou wa nan desu ka?)
JavaのStringは、2つのバリアントのcompareTo()メソッドを持つComparableインターフェースを実装しています。compareTo(String anotherString)メソッドは、Stringオブジェクトを引数で渡された文字列と辞書順で比較します。Stringオブジェクトが引数よりも前にある場合、負の整数を返し、Stringオブジェクトが引数よりも後にある場合、正の整数を返します。両方のStringオブジェクトの値が同じ場合は、ゼロを返します。この場合、equals(String str)メソッドもtrueを返します。compareToIgnoreCase(String str)メソッドは、最初のメソッドと似ていますが、大文字と小文字を区別しません。大文字小文字を無視した比較には、CASE_INSENSITIVE_ORDERを使用したComparatorを利用します。値がゼロの場合、equalsIgnoreCase(String str)もtrueを返します。
JavaでStringを文字配列に変換する方法は何ですか?
Stringオブジェクトは文字のシーケンスですので、1つの文字に変換することはできません。指定されたインデックスの文字を取得するために、charAtメソッドを使用するか、toCharArray()メソッドを使用して文字列を文字配列に変換することができます。文字列を文字配列に変換する方法について詳しく学んでください。
Javaで文字列をバイト配列に変換する方法はどうですか?
Stringオブジェクトをバイト配列に変換するには、getBytes()メソッドを使用できます。また、バイト配列をStringオブジェクトに変換するには、コンストラクタnew String(byte[] arr)を使用できます。文字列をバイト配列に変換する方法についてもっと学びましょう。
Javaでswitch case文でStringを使用することはできますか?
Java 7では、switch caseが文字列に対応し、それ以前のバージョンではサポートされていません。文字列の条件フローを実装する場合は、Java 7以降のバージョンではif-else文、またはswitch caseを使用することができます。Javaのswitch case文についてもっと学びましょう。
文字列のすべての順列を出力するためのJavaプログラムを作成します。
文字列のすべての順列を見つけるには、再帰を使用する必要があります。例えば、 AAB の順列は AAB、ABA、BAA です。また、重複する値がないようにするには、Set を使用する必要があります。文字列のすべての順列を見つける方法について詳しく学びましょう。
与えられた文字列における最長の回文を見つけるためのJava関数を作成してください。
文字列には回文の部分文字列が含まれることがあります。文字列内で最長の回文部分文字列を見つける方法についてもっと詳しく学びましょう。
JavaにおけるString、StringBuffer、およびStringBuilderの違いは何ですか?
Javaにおいて、Stringオブジェクトは不変でfinalですので、Stringオブジェクトをいじる度に新しいStringオブジェクトが作成されます。Stringの操作はリソースを消費するため、JavaにはStringを操作するための2つのユーティリティクラス、StringBufferとStringBuilderが提供されています。
StringBufferとStringBuilderは可変クラスです。StringBufferの操作はスレッドセーフで同期されていますが、StringBuilderの操作はスレッドセーフではありません。マルチスレッド環境ではStringBufferを使用し、シングルスレッド環境ではStringBuilderを使用するべきです。StringBuilderは同期のオーバーヘッドがないため、パフォーマンスがStringBufferよりも速いです。
String、StringBuffer、およびStringBuilderの違いと、StringBufferとStringBuilderのベンチマーキングについて、詳しく調べてみましょう。
なぜJavaではStringは不変なのですか?
Javaにおいて、Stringは不変(immutable)であるため、いくつかの利点があります。
- String pool is possible because String is immutable in Java.
- It increases security because any hacker can’t change its value and it’s used for storing sensitive information such as a database username or password.
- Since String is immutable, it’s safe to use in multi-threading and you don’t need any synchronization.
- Strings are used in Java class loaders and immutability provides assurance that the correct class is getting loaded by the ClassLoader class.
JavaにおけるStringのイミュータブル性についてさらに詳しく学びましょう。
Javaで文字列を分割するには、どのようにすればいいですか?
提供された正規表現に基づいて、split(String regex)を使用してStringをString配列に分割することができます。
なぜJavaでパスワードの保存に文字配列が好まれるのですか?
JavaではStringオブジェクトは不変であり、文字列プールに格納されます。作成されたStringオブジェクトは、ガベージコレクションが完了するまでプールに保持されるため、パスワードを使用し終わってもメモリ上で利用可能です。これはセキュリティ上のリスクとなり、メモリダンプにアクセスできる者はパスワードを平文で見つけることができます。パスワードを格納するために文字配列を使用すると、使用し終わった後に空白に設定することができます。メモリ上で利用可能な期間を制御することができ、これによりセキュリティ上の脅威を防ぐことができます。
Javaで2つの文字列が等しいかどうかをチェックする方法はありますか?
2つの文字列が等しいかどうかを確認する方法は2つあります。==演算子またはequals()メソッドを使用することができます。==演算子を使用すると、文字列の値だけでなくオブジェクト参照もチェックされます。Javaプログラミングでは、文字列の値の等しさを確認することが多いです。この場合、equals()メソッドを使用して2つの文字列が等しいかどうかをチェックする必要があります。また、大文字小文字を無視するためにequalsIgnoreCaseという別の関数もあります。
String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
System.out.println("s1 == s2 ? " + (s1 == s2)); //true
System.out.println("s1 == s3 ? " + (s1 == s3)); //false
System.out.println("s1 equals s3 ? " + (s1.equals(s3))); //true
Javaにおける文字列プールとは何ですか?
文字列プールは、Javaのヒープメモリに保存されているStringオブジェクトのプールです。StringはJavaの特別なクラスであり、new演算子を使用してStringオブジェクトを作成することも、ダブルクォート内に値を指定することでも可能です。Javaの文字列プールについて詳しく学びましょう。
JavaのStringのintern()メソッドは何をしますか?
intern()メソッドが呼び出されると、プール内にこのStringオブジェクトと等しい文字列が既に存在する場合(equals(Object)メソッドによって決定される)、プールからその文字列が返されます。 それ以外の場合、このStringオブジェクトがプールに追加され、このStringオブジェクトへの参照が返されます。このメソッドは常に、このStringと同じ内容を持つStringオブジェクトを返しますが、一意の文字列のプールから取得されることが保証されています。
JavaでのStringはスレッドセーフですか?
Stringオブジェクトは不変ですので、作成後に値を変えることができません。これにより、Stringオブジェクトはスレッドセーフになり、マルチスレッド環境で安全に使用することができます。Javaにおけるスレッドセーフについて詳しく学びましょう。
なぜJavaでStringは人気のあるHashMapのキーとなっているのですか?
文字列オブジェクトは不変なため、作成時にハッシュコードがキャッシュされ、再計算する必要がありません。これは、他のHashMapのキーオブジェクトより処理が速いため、Mapのキーとして優れた選択肢です。
出力を推測してください。
以下のJavaコードスニペットの出力を予測して、自己テストをしてみてください。
public class StringTest {
public static void main(String[] args) {
String s1 = new String("digitalocean");
String s2 = new String("DIGITALOCEAN");
System.out.println(s1 = s2);
}
}
public class Test {
public void foo(String s) {
System.out.println("String");
}
public void foo(StringBuffer sb) {
System.out.println("StringBuffer");
}
public static void main(String[] args) {
new Test().foo(null);
}
}
Test.javaの12行目のエラー:fooへの参照が曖昧です
new Test().foo(null);
^
Test内のメソッドfoo(String)とメソッドfoo(StringBuffer)の両方が一致しますこのコードは、fooの両方のメソッドが同じ名前であり、メインでのfooメソッドの呼び出しでnullが渡されているため、コンパイル時エラーになります。コンパイラはどのメソッドを呼び出すかわからないのです。また、タイプYに対してメソッドXが曖昧ですというエラーについても参照することができます。
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2);
falseこのコードはnew演算子を使用してStringオブジェクトを作成するため、ヒープメモリ内に作成され、s1とs2は異なる参照を持ちます。ダブルクオートのみを使用して文字列を作成する場合、文字列プールに格納され、trueが表示されます。
String s1 = "abc";
StringBuffer s2 = new StringBuffer(s1);
System.out.println(s1.equals(s2));
String s1 = "abc";
String s2 = new String("abc");
s2.intern();
System.out.println(s1 == s2);
以下のコードによって、何個のStringオブジェクトが作成されますか?
String s1 = new String("Hello");
String s2 = new String("Hello");
結論
この記事では、Stringについて特に関連するいくつかのJavaの面接の質問がレビューされています。
おすすめの読み物:
Javaプログラミングの質問
Javaにおける文字列プログラム