JavaRush /Java Blog /Random-JA /Java 文字列。インタビューの質問と回答、パート 1
Andrey
レベル 26

Java 文字列。インタビューの質問と回答、パート 1

Random-JA グループに公開済み
このクラスは、StringJava で最も広く使用されているクラスの 1 つです。この記事では、Java String の面接での重要な質問と回答をいくつか紹介します。 Java 文字列。 インタビューの質問と回答、パート 1 - 1彼らはクラスの全体像を把握するのに非常に役立ちString、クラスに関連したString面接の質問に備えてくれます。

1. Java の文字列とは何ですか? これはどのようなデータ型ですか?

String は、java.lang パッケージで定義される Java のクラスです。int や long のようなプリミティブなデータ型ではありません。String クラスは文字列文字セットを表します。文字列はほぼすべての Java アプリケーションで使用されており、String クラスについて知っておくべき事実がいくつかあります。immutableこれはJava における不変 ( ) かつ最終化されたデータ型であり、String仮想マシンはクラスのすべてのオブジェクトを文字列プールに格納します。もう 1 つの機能は、二重引用符を使用し、連結用の「+」演算子をオーバーロードして Stringクラス オブジェクトを取得する方法です。String

2. String オブジェクトを作成するさまざまな方法には何がありますか?

Java の他のクラスと同じように new 演算子を使用してオブジェクトを作成することも、二重引用符を使用してオブジェクトを作成することもできますStringString文字配列、バイト配列から文字列を取得したり、StringBufferor を使用したりするためのクラス コンストラクターもいくつかありますStringBuilder
String str = new String("abc");
String str1 = "abc";
二重引用符を使用して文字列を作成すると、Java 仮想マシンは文字列プール内で同じ値を持つ別の文字列を探します。文字列が見つかった場合は、クラスの既存のオブジェクトへの参照のみが返されString、そうでない場合は、受け取った値を使用して新しいオブジェクトが作成され、プールに格納されます。new 演算子を使用すると、仮想マシンはオブジェクトを作成しますStringが、それを文字列プールに保存しません。このメソッドを使用して、intern()文字列を文字列プールに保存したり、そのような文字列がすでにプールにある場合は参照を取得したりできます。

3. 文字列が回文であるかどうかを確認するメソッドを作成します。

文字列が両方向で同じように読める場合、その文字列は回文と呼ばれます。たとえば、「aba」は回文文字列です。このクラスにはString文字列を反転するメソッドがありませんが、文字列が回文であるかどうかを確認できる反転メソッドがあります StringBufferStringBuilder
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;
    }

4. 文字列から特定の文字を削除するメソッドを作成します。

メソッドを使用して、replaceAll出現する文字列をすべて別の文字列に置き換えることができます。このメソッドは引数として文字列を受け取るため、クラスを使用してCharacter文字から文字列を作成し、それを使用してすべての文字を空の文字列に置き換えます。
private static String removeChar(String str, char ch) {
        if (str == null)
            return null;
        return str.replaceAll(Character.toString(ch), "");
    }

5. 文字列を大文字または小文字に変換するにはどうすればよいですか?

クラスメソッドを使用して、大文字と小文字の両方の文字列をString toUpperCase取得toLowerCaceできます。これらのメソッドには、引数を受け取りLocale、そのローカリゼーション ルールを使用して文字列を大文字または小文字に変換するオーバーロードがあります。

6. subSequence メソッドは何をしますか?

Java 1.4 ではこのインターフェイスが導入されCharSequence、クラスはこのインターフェイスを継承します。これがクラスにStringメソッドを実装する唯一の理由です。内部的には を呼び出します。このメソッドの簡単な使用例: subSequenceStringsubstring
public class StringSubsequence {

    public static void main(String[] args) {
        String str = "www.journaldev.com";
        System.out.println("Last 4 char String: "+str.subSequence(str.length()-4, str.length()));
        System.out.println("First 4 char String: "+str.subSequence(0, 4));
        System.out.println("website name: "+str.subSequence(4, 14));

        //substring vs subSequence
        System.out.println("substring == subSequence ? "
			+(str.substring(4, 14) == str.subSequence(4, 14)));

        System.out.println("substring equals subSequence ? "
			+(str.substring(4, 14).equals(str.subSequence(4, 14))));
    }
}
プログラムの出力には次が表示されます。
Last 4 char String: .com
First 4 char String: www.
website name: journaldev
substring == subSequence ? false
substring equals subSequence ? true
理想的には、常に を使用する必要がありますsubstring

7. Java で 2 つの文字列を比較するにはどうすればよいですか?

このクラスはStringインターフェイスを継承しComparable、2 つのメソッド オプションがありますcompareTo()。このメソッドは、compareTo(String anotherString)オブジェクトStringと受け取った引数をString辞書編集的に比較します。現在の行が受信した文字列より前にある場合、メソッドは負の整数を返し、文字列が受信した引数の後にある場合は、正の整数を返しますinteger。メソッドが 0 を返す場合、文字列は同じ値を持ちます。この場合、メソッドequals(String str)も true を返します。 compareToIgnoreCase(String str): このメソッドは、大文字と小文字を無視することを除いて、前のメソッドと似ています。大文字と小文字を区別しない比較には CASE_INSENSITIVE_ORDER コンパレータを使用します。戻り値がゼロの場合、メソッドはequalsIgnoreCase(String str)true も返します。これらのメソッドを説明するための小さな例を見てみましょう。
public class StringCompareToExample {
    public static void main(String[] args) {
        String str = "ABC";
        System.out.println(str.compareTo("DEF"));
        System.out.println(str.compareToIgnoreCase("abc"));
    }
}
プログラムは次を出力します。
-3
0

8. 文字列を文字に、またはその逆に変換するにはどうすればよいですか?

これはひっかけの質問です。文字列は一連の文字であるため、単一の文字にしか変換できません。メソッドを使用してcharAt指定された位置にある文字を取得することも、メソッドを使用してtoCharArray()文字列を文字の配列に変換することもできます。Java で文字列を文字に変換する方法、および文字を文字列に変換する方法を示す簡単な例。
import java.util.Arrays;

public class StringToCharToString {
    public static void main(String[] args) {
        //String to char array
        String str = "123";
        char[] chArr = str.toCharArray();
        System.out.println("String to char array: "+Arrays.toString(chArr));
        //String to char
        char c = str.charAt(1);
        System.out.println("String to char: "+c);
        //char to String
        String s = Character.toString(c);
        System.out.println("char to String: "+s);
        //удалить все заданные символы из строки
        System.out.println("removing all chars from String: "
                                 +removeCharFromString("1ABCD12DW", '1'));
    }

    private static String removeCharFromString(String str, char c) {
        return str.replaceAll(Character.toString( c ), "");
    }
}
プログラムは次を出力します。
String to char array: [1, 2, 3]
String to char: 2
char to String: 2
removing all chars from String: ABCD2DW

9. 文字列をバイト配列に、またはその逆に変換するにはどうすればよいですか?

メソッドを使用してgetBytes()文字列をバイト配列に変換したり、コンストラクターを使用してnew String(byte[] arr)バイト配列を文字列に変換したりできます。
import java.util.Arrays;

public class StringByteArray {
     public static void main(String[] args) {
        String str = "www.journaldev.com";
        //преобразование String в byte array
        byte[] byteArr = str.getBytes();
        System.out.println("String to byte array : "+Arrays.toString(byteArr));
        //преобразование byte array и String
        String str1 = new String(byteArr);
        System.out.println("byte array to String : "+str1);
        //посмотрим, str и str1 одинаковые or нет
        System.out.println("str == str1? " + (str == str1));
        System.out.println("str.equals(str1)? " + (str.equals(str1)));
    }
}
プログラムは次を出力します。
String to byte array : [119, 119, 119, 46, 106, 111, 117, 114, 110, 97, 108, 100, 101, 118, 46, 99, 111, 109]
byte array to String : www.journaldev.com
str == str1? false
str.equals(str1)? true

10. switch 構造で文字列を使用できますか?

この難しい質問は、言語の現在の開発に関する知識をテストするために使用されます。Java 7 では、switch ステートメントが文字列を使用するように拡張されていますが、以前のバージョンの Java ではこれがサポートされていません。文字列の条件フローを実装している場合は、if-else 条件を使用でき、Java 7 以降を使用している場合は switch ステートメントを使用できます。ステートメントで文字列を使用する小さな例switchと、条件を使用して同じロジックを示す別のメソッドを示しますif-else
public class SwitchStringExample {

    public static void main(String[] args) {
        printColorUsingSwitch("red");
        printColorUsingIf("red");
        // оператор switch регистрозависимый
        printColorUsingSwitch("RED");
        printColorUsingSwitch(null);
    }

    private static void printColorUsingIf(String color) {
        if (color.equals("blue")) {
            System.out.println("BLUE");
        } else if (color.equals("red")) {
            System.out.println("RED");
        } else {
            System.out.println("INVALID COLOR CODE");
        }
    }

    private static void printColorUsingSwitch(String color) {
        switch (color) {
        case "blue":
            System.out.println("BLUE");
            break;
        case "red":
            System.out.println("RED");
            break;
        default:
            System.out.println("INVALID COLOR CODE");
        }
    }
}
プログラムは次を出力します。
RED
RED
INVALID COLOR CODE
Exception in thread "main"
java.lang.NullPointerException
    at com.journaldev.util.SwitchStringExample.printColorUsingSwitch(SwitchStringExample.java:24)
    at com.journaldev.util.SwitchStringExample.main(SwitchStringExample.java:10)
switchJava における文字列の 主な使用ポイント。
  • 設計で文字列を使用すると、switch複数の条件の連鎖が排除され、コードが読みやすくなりますif-else
  • の文字列ではswitch大文字と小文字が区別されます。上記の例はこれを示しています。
  • 演算子は、結果の値をcaseswitch値と比較するメソッドを使用するため、回避するために NULL のチェックを追加します。String.equals()NullPointerException
  • の文字列に関する Java 7 ドキュメントによると、Java コンパイラは、連結された条件よりもswitch構造内の文字列に対して効率的なバイトコードを生成します。switchif-else
  • これが Java 7 以降で使用されていることを確認してください。それ以外の場合は、 が返されますxception

11. 文字列のすべての順列を出力するプログラムを作成します。

これは難しい質問であり、文字列のすべての順列を見つけるには再帰を使用する必要があります。たとえば、「AAB」の順列は「AAB」、「ABA」、「BAA」になる可能性があります。また、Set を使用して、重複した行がないことを確認する必要があります。すべての順列を取得するには、まず文字列の最初の文字を取得し、残りの文字を並べ替えます。文字列 = "ABC" の場合、最初の文字 char = A、残りの順列 BC および CB。これで、順列内の利用可能な位置に最初の文字を挿入できるようになりました。BC -> ABC、BAC、BCA CB -> ACB、CAB、CBA プログラム例:
import java.util.HashSet;
import java.util.Set;

public class StringHelper {
    public static Set<String> permutationFinder(String str) {
        Set<String> perm = new HashSet<String>();
        //Handling error scenarios
        if (str == null) {
            return null;
        } else if (str.length() == 0) {
            perm.add("");
            return perm;
        }
        char initial = str.charAt(0); // первый символ
        String rem = str.substring(1); // полная строка без первого символа
        Set<String> words = permutationFinder(rem);
        for (String strNew : words) {
            for (int i = 0;i<=strNew.length();i++){
                perm.add(charInsert(strNew, initial, i));
            }
        }
        return perm;
    }

    public static String charInsert(String str, char c, int j) {
        String begin = str.substring(0, j);
        String end = str.substring(j);
        return begin + c + end;
    }

    public static void main(String[] args) {
        String s = "AAC";
        String s1 = "ABC";
        String s2 = "ABCD";
        System.out.println("\nPermutations for " + s + " are: \n" + permutationFinder(s));
        System.out.println("\nPermutations for " + s1 + " are: \n" + permutationFinder(s1));
        System.out.println("\nPermutations for " + s2 + " are: \n" + permutationFinder(s2));
    }
}
プログラム出力:
Permutations for AAC are:
[AAC, ACA, CAA]

Permutations for ABC are:
[ACB, ABC, BCA, CBA, CAB, BAC]

Permutations for ABCD are:
[DABC, CADB, BCAD, DBAC, BACD, ABCD, ABDC, DCBA, ADBC, ADCB, CBDA, CBAD, DACB, ACBD, CDBA, CDAB, DCAB, ACDB, DBCA, BDAC, CABD, BADC, BCDA, BDCA]
記事の続き
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION