導入
String
は、最も広く使われているJavaのクラスの一つです。この記事では、String
に関する練習問題と回答を提供し、面接の準備を支援します。
また、Java String Quizを試して、String
クラスの知識をテストすることもできます。
JavaにおけるString
クラスとは何ですか?String
はデータ型ですか?
String
はJavaのクラスであり、java.lang
パッケージに定義されています。これは、int
やlong
のようなプリミティブなデータ型ではありません。String
クラスは文字列を表します。ほとんどのJavaアプリケーションでString
が使用されています。String
はJavaでは不変でfinalであり、JVMはすべてのString
オブジェクトを格納するために文字列プールを使用します。ダブルクォートを使用してString
オブジェクトをインスタンス化でき、+
演算子を連結のためにオーバーロードすることができます。
JavaでString
オブジェクトを作成するさまざまな方法は何ですか?
new
演算子を使用してString
オブジェクトを作成するか、ダブルクォートを使用してString
オブジェクトを作成できます。 例えば:
String str = new String("abc");
String str1 = "abc";
String
クラスには、char array
、byte array
、StringBuffer
、およびStringBuilder
からString
を取得するためのいくつかのコンストラクタが用意されています。
ダブルクォートを使用してString
を作成すると、JVMは同じ値で格納されている他のString
があるかどうかを文字列プールで検索します。 もし新しいString
がプールにすでに格納されている場合、JVMはそのString
オブジェクトへの参照を返します。 新しいString
がプールにない場合、JVMは指定された値で新しいString
オブジェクトを作成し、文字列プールに格納します。 new
演算子を使用すると、JVMはString
オブジェクトを作成しますが、それを文字列プールに格納しません。 intern()
メソッドを使用して、String
オブジェクトを文字列プールに格納するか、プール内に等しい値を持つString
がすでに存在する場合は参照を返すことができます。
入力された文字列が回文かどうかをチェックするJavaメソッドを書いてください。
A string is a palindrome if its value is the same when reversed. For example, aba
is a palindrome string. The String
class doesn’t provide any method to reverse the string but the StringBuffer
and StringBuilder
classes have a reverse()
method that you can use to check whether a string is a palindrome. For example:
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
メソッドを使用して、すべての大文字または小文字のString
オブジェクトを取得できます。これらのメソッドには、Locale
引数を受け入れ、指定されたロケールのルールを使用して文字列を大文字または小文字に変換するバリアントがあります。
String subSequence
メソッドとは何ですか?
Java 1.4では、CharSequence
インターフェースが導入され、String
クラスがこのインターフェースを実装しているため、String
クラスにはsubSequence
メソッドがあります。内部的には、subSequence
メソッドはString substring
メソッドを呼び出します。
Javaプログラムで2つの文字列を比較するにはどうすればよいですか?
JavaのString
はComparable
インターフェースを実装しており、compareTo()
メソッドには2つのバリエーションがあります。 compareTo(String anotherString)
メソッドは、String
オブジェクトを辞書順でString
引数と比較します。 もしString
オブジェクトが引数より前にある場合、負の整数を返し、String
オブジェクトが引数に続く場合、正の整数を返します。 両方のString
オブジェクトが同じ値の場合、ゼロを返します。 この場合、equals(String str)
メソッドもtrue
を返します。 compareToIgnoreCase(String str)
メソッドは最初のメソッドと似ていますが、大文字小文字を無視します。 大文字小文字を無視した比較にはComparator
とCASE_INSENSITIVE_ORDER
が使用されます。 値がゼロの場合、equalsIgnoreCase(String str)
もtrue
を返します。
String
を文字配列に変換するにはどうすればよいですか?
A String
object is a sequence of characters, so you can’t convert it to a single character. You can use use the charAt
method to get the character at given index or you can use the toCharArray()
method to convert a string to character array. Learn more about converting a string to a character array.
String
をバイト配列に変換するにはどうすればよいですか?
getBytes()
メソッドを使用して、String
オブジェクトをバイト配列に変換し、コンストラクタnew String(byte[] arr)
を使用してバイト配列をString
オブジェクトに変換できます。 文字列をバイト配列に変換する方法について詳しく学ぶ。
Javaでswitch caseでString
を使用できますか?
Java 7は、switch caseの機能をString
に拡張しました。以前のJavaバージョンではこれをサポートしていません。文字列の条件付きフローを実装する場合は、if-else条件を使用できます。Java 7以降のバージョンを使用している場合は、switch caseを使用できます。 Java switch case stringについて詳しく学ぶ。
文字列のすべての順列を出力するJavaプログラムを書いてください。
ある文字列のすべての順列を見つけるには、再帰を使用する必要があります。例えば、AAB
の順列はAAB
、ABA
、およびBAA
です。また、重複のないようにするためにSet
を使用する必要があります。詳細は文字列のすべての順列を見つけるで学んでください。
与えられた文字列内で最長の回文を見つけるJava関数を記述してください。
A string can contain palindrome substrings within it. Learn more about how to find the longest palindrome substring in a string.
String
、StringBuffer
、およびStringBuilder
のJavaにおける違いは何ですか?
A String
object is immutable and final in Java, so whenever you manipulate a String
object, it creates a new String
object. String manipulations are resource consuming, so Java provides two utility classes for string manipulations, StringBuffer
and StringBuilder
.
StringBuffer
とStringBuilder
は可変クラスです。StringBuffer
の操作はスレッドセーフで同期されていますが、StringBuilder
の操作はスレッドセーフではありません。マルチスレッド環境ではStringBuffer
を使用し、シングルスレッド環境ではStringBuilder
を使用する必要があります。StringBuilder
のパフォーマンスは同期のオーバーヘッドがないため、StringBuffer
よりも速くなります。
String
、StringBuffer
、およびStringBuilder
の違いやStringBufferとStringBuilderのベンチマークについて詳しく学んでください。
String
がJavaで不変な理由は何ですか?
String
がJavaで不変なのは、いくつかの利点があるためです:
String
がJavaで不変なので、Stringプールが可能になります。- その値を変更することができず、データベースのユーザー名やパスワードなどの機密情報を格納するために使用されるため、セキュリティが向上します。
String
が不変なので、マルチスレッドで安全に使用でき、同期は不要です。- 文字列はJavaのクラスローダーで使用され、不変性は
ClassLoader
クラスによって正しいクラスがロードされていることを保証します。
Javaで String
が不変である理由について詳しく学ぶ
Javaで文字列を分割する方法は?
提供された正規表現に基づいて split(String regex)
を使用して String
を String
配列に分割できます。
なぜ文字配列がJavaでパスワードを保存するために String
よりも好ましいのですか?
A String
object is immutable in Java and is stored in the string pool. Once it’s created it stays in the pool until garbage collection completes, so even though you’re done with the password it’s available in memory for longer duration. It’s a security risk because anyone having access to memory dump can find the password as clear text. If you use a character array to store password, you can set it to blank once you’re done with it. You can control for how long it’s available in memory and that avoids the security threat.
Javaで2つの文字列が等しいかどうかを確認する方法は?
2つの文字列が等しいかどうかをチェックする方法が2つあります。 ==
演算子またはequals()
メソッドを使用できます。 ==
演算子を使用すると、String
の値とオブジェクト参照の両方をチェックします。 Javaプログラミングでは、通常、String
の値の等価性のみをチェックすることが望ましいです。 この場合、2つのString
が等しいかどうかをチェックするには、equals()
メソッドを使用する必要があります。 大文字小文字を区別しないで比較するために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()
メソッドは何をしますか?
JavaでString
はスレッドセーフですか?
A String
object is immutable, so you can’t change its value after creation. This makes the String
object thread-safe and so it can be safely used in a multi-threaded environment. Learn more about thread Safety in Java.
なぜJavaでString
が人気のあるHashMap
のキーですか?
String
オブジェクトは不変であるため、そのハッシュコードは作成時にキャッシュされ、再計算する必要はありません。これにより、他の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);
}
}
Output
DIGITALOCEAN
出力はDIGITALOCEAN
です。なぜなら、このコードはString s2
の値をString s1
に代入しているからです。=
は代入演算子であり、y
の値をx
に代入する形式で使用されます((x = y)
)。==
は比較演算子であり、両方の文字列に対して参照オブジェクトが同じかどうかをチェックします。
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);
}
}
Output
Test.java:12: error: reference to foo is ambiguous
new Test().foo(null);
^
both method foo(String) in Test and method foo(StringBuffer) in Test match
このコードはコンパイル時エラーを引き起こします。なぜなら、main
内でのfoo
メソッドの呼び出しがnull
を渡しており、両方のfoo
メソッドに同じ名前があるため、コンパイラはどのメソッドを呼び出すか判断できないからです。メソッドXは型Yの曖昧です。
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2);
Output
false
出力は `false` です。コードは `new` 演算子を使用して `String` オブジェクトを作成するため、それはヒープメモリに作成され、`s1` と `s2` は異なる参照を持ちます。ダブルクォートのみを使用して文字列を作成すると、文字列プールに配置され、`true` が表示されます。
String s1 = "abc";
StringBuffer s2 = new StringBuffer(s1);
System.out.println(s1.equals(s2));
Output
false
出力は `false
` です。`s2` は `String` の型ではありません。`String` クラスの `equals()` メソッドの実装は、渡されたオブジェクトの型が `String` かどうかを確認するために `instanceof` 演算子を使用し、オブジェクトが `String` でない場合は `false` を返します。
String s1 = "abc";
String s2 = new String("abc");
s2.intern();
System.out.println(s1 == s2);
Output
false
出力は `false
` です。`intern()` メソッドは文字列プールから `String` オブジェクトの参照を返します。しかし、コードはそれを `s2` に戻しませんし、`s2` に変更はありません。そのため、`s1` と `s2` は異なるオブジェクト参照を持ちます。行3のコードを `s2 = s2.intern();` に変更すると、出力は `true
` になります。
以下のコードによって作成される `String` オブジェクトはいくつですか?
String s1 = new String("Hello");
String s2 = new String("Hello");
Answer
答えは3です。1行目のコードは、文字列プール(最初のオブジェクト)に値が「Hello」のString
オブジェクトを作成し、その後、ヒープメモリー(2番目のオブジェクト)に値が「Hello」の新しいString
オブジェクトを作成します。2行目のコードは、ヒープメモリー(3番目のオブジェクト)に値が「Hello」の新しいString
オブジェクトを作成し、文字列プールからHello
文字列を再利用します。
結論
この記事では、特にString
に関するいくつかのJavaの面接の質問について説明しました。
おすすめの読み物:
Source:
https://www.digitalocean.com/community/tutorials/java-string-interview-questions-and-answers