Java文字列インタビューの質問と回答

導入

Stringは、最も広く使われているJavaのクラスの一つです。この記事では、Stringに関する練習問題と回答を提供し、面接の準備を支援します。

また、Java String Quizを試して、Stringクラスの知識をテストすることもできます。

JavaにおけるStringクラスとは何ですか?Stringはデータ型ですか?

StringはJavaのクラスであり、java.langパッケージに定義されています。これは、intlongのようなプリミティブなデータ型ではありません。Stringクラスは文字列を表します。ほとんどのJavaアプリケーションでStringが使用されています。StringはJavaでは不変でfinalであり、JVMはすべてのStringオブジェクトを格納するために文字列プールを使用します。ダブルクォートを使用してStringオブジェクトをインスタンス化でき、+演算子を連結のためにオーバーロードすることができます。

JavaでStringオブジェクトを作成するさまざまな方法は何ですか?

new演算子を使用してStringオブジェクトを作成するか、ダブルクォートを使用してStringオブジェクトを作成できます。 例えば:

String str = new String("abc");
String str1 = "abc";

Stringクラスには、char arraybyte arrayStringBuffer、および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のStringComparable インターフェースを実装しており、compareTo() メソッドには2つのバリエーションがあります。 compareTo(String anotherString) メソッドは、String オブジェクトを辞書順でString 引数と比較します。 もしString オブジェクトが引数より前にある場合、負の整数を返し、String オブジェクトが引数に続く場合、正の整数を返します。 両方のString オブジェクトが同じ値の場合、ゼロを返します。 この場合、equals(String str) メソッドもtrueを返します。 compareToIgnoreCase(String str) メソッドは最初のメソッドと似ていますが、大文字小文字を無視します。 大文字小文字を無視した比較にはComparatorCASE_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の順列はAABABA、およびBAAです。また、重複のないようにするためにSetを使用する必要があります。詳細は文字列のすべての順列を見つけるで学んでください。

与えられた文字列内で最長の回文を見つけるJava関数を記述してください。

A string can contain palindrome substrings within it. Learn more about how to find the longest palindrome substring in a string.

StringStringBuffer、および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.

StringBufferStringBuilderは可変クラスです。StringBufferの操作はスレッドセーフで同期されていますが、StringBuilderの操作はスレッドセーフではありません。マルチスレッド環境ではStringBufferを使用し、シングルスレッド環境ではStringBuilderを使用する必要があります。StringBuilderのパフォーマンスは同期のオーバーヘッドがないため、StringBufferよりも速くなります。

StringStringBuffer、および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.

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の面接の質問について説明しました。

おすすめの読み物:

Javaプログラミングの質問
Javaでの文字列プログラム

Source:
https://www.digitalocean.com/community/tutorials/java-string-interview-questions-and-answers