JavaRush /Blog Java /Random-VI /Chuỗi Java. Câu hỏi và đáp án phỏng vấn phần 1
Andrey
Mức độ

Chuỗi Java. Câu hỏi và đáp án phỏng vấn phần 1

Xuất bản trong nhóm
Lớp này Stringlà một trong những lớp được sử dụng rộng rãi nhất trong Java. Bài viết này cung cấp một số câu hỏi và câu trả lời phỏng vấn Java String quan trọng. Chuỗi Java.  Câu hỏi và đáp án phỏng vấn phần 1 - 1Chúng sẽ rất hữu ích trong việc có được bức tranh toàn cảnh về lớp học Stringvà giúp bạn chuẩn bị cho bất kỳ Stringcâu hỏi phỏng vấn nào liên quan đến lớp học.

1. Chuỗi trong Java là gì? Đây là kiểu dữ liệu gì?

Chuỗi là một lớp trong Java được định nghĩa trong gói java.lang. Nó không phải là kiểu dữ liệu nguyên thủy như int và long. Lớp String đại diện cho một bộ ký tự chuỗi. Chuỗi được sử dụng trong hầu hết các ứng dụng Java và có một số thông tin mà chúng ta nên biết về lớp String. Nó là một immutablekiểu dữ liệu bất biến ( ) và được hoàn thiện trong Java và Stringmáy ảo lưu trữ tất cả các đối tượng của lớp trong một nhóm chuỗi. Một tính năng khác Stringlà cách lấy các đối tượng lớp Stringbằng cách sử dụng dấu ngoặc kép và nạp chồng toán tử “+” để nối.

2. Có những cách nào để tạo một đối tượng String?

Chúng ta có thể tạo các đối tượng bằng toán tử mới giống như bất kỳ lớp nào khác trong Java hoặc chúng ta có thể sử dụng dấu ngoặc kép để tạo một đối tượng String. Ngoài ra còn có một số hàm tạo lớp Stringđể lấy chuỗi từ mảng ký tự, mảng byte và cũng có thể sử dụng StringBufferor StringBuilder.
String str = new String("abc");
String str1 = "abc";
Khi chúng ta tạo một chuỗi bằng dấu ngoặc kép, Máy ảo Java sẽ tìm trong nhóm chuỗi để tìm một chuỗi khác có cùng giá trị. Nếu tìm thấy chuỗi thì chỉ trả về một tham chiếu đến đối tượng hiện có của lớp String, nếu không, một đối tượng mới sẽ được tạo với giá trị nhận được và được lưu trữ trong nhóm. Khi chúng ta sử dụng toán tử mới, máy ảo sẽ tạo một đối tượng Stringnhưng không lưu trữ nó trong nhóm chuỗi. Chúng ta có thể sử dụng phương thức này intern()để lưu trữ một chuỗi trong nhóm chuỗi hoặc lấy tham chiếu nếu chuỗi đó đã có trong nhóm.

3. Viết phương thức kiểm tra một chuỗi có phải là chuỗi palindrome hay không.

Một chuỗi được gọi là palindrome nếu nó đọc giống nhau ở cả hai hướng. Ví dụ: “aba” là một chuỗi palindromic. Lớp này Stringkhông cung cấp bất kỳ phương thức nào để đảo ngược một chuỗi, nhưng các lớp StringBufferStringBuildermột phương thức đảo ngược mà chúng ta có thể kiểm tra xem chuỗi của chúng ta có phải là một bảng màu hay không.
private static boolean isPalindrome(String str) {
        if (str == null)
            return false;
        StringBuilder strBuilder = new StringBuilder(str);
        strBuilder.reverse();
        return strBuilder.toString().equals(str);
    }
Đôi khi người phỏng vấn có thể yêu cầu không sử dụng các lớp khác cho việc kiểm tra này, trong trường hợp đó chúng ta có thể so sánh các ký tự trong chuỗi ở cả hai bên để kiểm tra palindrome.
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. Viết phương thức xóa một ký tự khỏi chuỗi.

Chúng ta có thể sử dụng một phương thức replaceAllđể thay thế tất cả các lần xuất hiện của một chuỗi bằng một chuỗi khác. Lưu ý rằng phương thức này lấy một chuỗi làm đối số, vì vậy chúng tôi sử dụng lớp này Characterđể tạo một chuỗi từ một ký tự và sử dụng nó để thay thế tất cả các ký tự bằng chuỗi trống.
private static String removeChar(String str, char ch) {
        if (str == null)
            return null;
        return str.replaceAll(Character.toString(ch), "");
    }

5. Làm thế nào chúng ta có thể chuyển đổi một chuỗi thành chữ hoa hoặc chữ thường?

Chúng ta có thể sử dụng các phương thức lớp String toUpperCaseđể toLowerCacelấy cả chuỗi chữ hoa và chữ thường. Các phương thức này có tình trạng quá tải, nhận một đối số Localevà sử dụng các quy tắc bản địa hóa của nó để chuyển đổi chuỗi thành chữ hoa hoặc chữ thường.

6. Phương thức subSequence có tác dụng gì?

Java 1.4 đã giới thiệu giao diện CharSequence, một lớp Stringkế thừa giao diện này và đó là lý do duy nhất để triển khai một phương thức subSequencetrong một lớp String. Bên trong nó gọi substring. Một ví dụ đơn giản về việc sử dụng phương pháp:
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))));
    }
}
Đầu ra của chương trình sẽ hiển thị như sau:
Last 4 char String: .com
First 4 char String: www.
website name: journaldev
substring == subSequence ? false
substring equals subSequence ? true
Lý tưởng nhất là bạn nên luôn sử dụng substring.

7. Làm thế nào để so sánh hai chuỗi trong Java?

Lớp Stringkế thừa giao diện Comparablevà có hai tùy chọn phương thức compareTo(). Phương thức này compareTo(String anotherString)so sánh đối tượng Stringvới đối số nhận được Stringtheo từ điển. Nếu dòng hiện tại đứng trước chuỗi nhận được, phương thức sẽ trả về một số nguyên âm và nếu chuỗi theo sau đối số nhận được, nó sẽ trả về một số nguyên dương integer. Nếu phương thức trả về 0 thì chuỗi có cùng giá trị, trong trường hợp đó phương thức equals(String str)cũng sẽ trả về true. compareToIgnoreCase(String str): Phương pháp này tương tự như phương pháp trước ngoại trừ việc nó bỏ qua chữ hoa chữ thường. Nó sử dụng Bộ so sánh CASE_INSENSITIVE_ORDER để so sánh không phân biệt chữ hoa chữ thường. Nếu giá trị trả về bằng 0 thì phương thức equalsIgnoreCase(String str)cũng sẽ trả về true. Hãy xem một ví dụ nhỏ để giải thích các phương pháp này:
public class StringCompareToExample {
    public static void main(String[] args) {
        String str = "ABC";
        System.out.println(str.compareTo("DEF"));
        System.out.println(str.compareToIgnoreCase("abc"));
    }
}
Chương trình sẽ xuất ra kết quả như sau:
-3
0

8. Làm thế nào để chuyển đổi một chuỗi thành ký tự và ngược lại?

Đây là một câu hỏi mẹo vì chuỗi là một chuỗi các ký tự nên chúng ta chỉ có thể chuyển đổi nó thành một ký tự duy nhất. Chúng ta có thể sử dụng một phương thức charAtđể lấy ký tự nằm ở một vị trí xác định hoặc chúng ta có thể sử dụng một phương thức toCharArray()để chuyển đổi một chuỗi thành một mảng ký tự. Một ví dụ đơn giản cho thấy cách chuyển đổi chuỗi thành ký tự và ký tự thành chuỗi trong 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 ), "");
    }
}
Chương trình sẽ xuất ra kết quả như sau:
String to char array: [1, 2, 3]
String to char: 2
char to String: 2
removing all chars from String: ABCD2DW

9. Làm thế nào để chuyển đổi một chuỗi thành mảng byte và ngược lại?

Chúng ta có thể sử dụng một phương thức getBytes()để chuyển đổi một chuỗi thành một mảng byte và chúng ta có thể sử dụng hàm tạo new String(byte[] arr)để chuyển đổi một mảng byte thành một chuỗi.
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)));
    }
}
Chương trình sẽ xuất ra kết quả như sau:
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. Chúng ta có thể sử dụng chuỗi trong cấu trúc switch không?

Câu hỏi khó này được sử dụng để kiểm tra kiến ​​thức của bạn về sự phát triển hiện tại của ngôn ngữ. Java 7 mở rộng câu lệnh switch để sử dụng chuỗi; các phiên bản Java trước đó không hỗ trợ điều này. Nếu bạn đang triển khai luồng có điều kiện cho chuỗi, bạn có thể sử dụng điều kiện if-else và bạn có thể sử dụng câu lệnh switch nếu bạn đang sử dụng Java 7 trở lên. Một ví dụ nhỏ về việc sử dụng một chuỗi trong một câu lệnh switchvà một phương thức khác hiển thị logic tương tự bằng cách sử dụng các điều kiện 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");
        }
    }
}
Chương trình sẽ xuất ra kết quả như sau:
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)
Các điểm sử dụng chính switchcủa chuỗi trong Java.
  • việc sử dụng chuỗi trong thiết kế switchgiúp mã dễ đọc hơn bằng cách loại bỏ nhiều chuỗi điều kiện if-else.
  • các chuỗi trong switchphân biệt chữ hoa chữ thường, ví dụ trên cho thấy điều này.
  • toán tử switchsử dụng một phương pháp String.equals()để so sánh giá trị kết quả với các giá trị trường hợp , vì vậy hãy thêm dấu kiểm cho NULL để tránh NullPointerException.
  • Theo tài liệu Java 7 về chuỗi switch, trình biên dịch Java tạo ra mã byte hiệu quả hơn cho các chuỗi trong một cấu trúc switchso với các điều kiện nối if-else.
  • hãy đảm bảo rằng điều này sẽ được sử dụng với Java 7 trở lên, nếu không bạn sẽ nhận được xception.

11. Viết chương trình in ra tất cả các hoán vị của một chuỗi.

Đây là một câu hỏi khó và chúng ta phải sử dụng đệ quy để tìm tất cả các hoán vị của một chuỗi, ví dụ các hoán vị của “AAB” có thể là “AAB”, “ABA” và “BAA”. Chúng ta cũng cần sử dụng Set để đảm bảo không có hàng trùng lặp. Để có được tất cả các hoán vị, trước tiên chúng ta lấy ký tự đầu tiên của chuỗi và sắp xếp lại các ký tự còn lại. Nếu String = “ABC” Ký tự đầu tiên char = A và các hoán vị còn lại BC và CB. Bây giờ chúng ta có thể chèn ký tự đầu tiên vào các vị trí có sẵn trong hoán vị. BC -> ABC, BAC, BCA CB -> ACB, CAB, CBA Chương trình ví dụ:
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));
    }
}
Đầu ra chương trình:
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]
Tiếp tục bài viết
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION