JavaRush /จาวาบล็อก /Random-TH /สตริงจาวา คำถามและคำตอบในการสัมภาษณ์ ตอนที่ 1
Andrey
ระดับ

สตริงจาวา คำถามและคำตอบในการสัมภาษณ์ ตอนที่ 1

เผยแพร่ในกลุ่ม
คลาสนี้Stringเป็นหนึ่งในคลาสที่ใช้กันอย่างแพร่หลายที่สุดใน Java บทความนี้มีคำถามและคำตอบในการสัมภาษณ์ Java String ที่สำคัญ สตริงจาวา  คำถามและคำตอบในการสัมภาษณ์ ตอนที่ 1 - 1พวกเขาจะมีประโยชน์มากในการเข้าใจภาพรวมของชั้นเรียนให้ครบถ้วน และจะเตรียมคุณให้พร้อมสำหรับ คำถามสัมภาษณ์ Stringที่เกี่ยวข้องกับชั้นเรียนString

1. String ใน Java คืออะไร? นี่เป็นข้อมูลประเภทใด?

String เป็นคลาสใน Java ที่กำหนดไว้ในแพ็คเกจ java.lang ไม่ใช่ชนิดข้อมูลดั้งเดิมเช่น int และ long คลาส String แสดงถึงชุดอักขระสตริง Strings ถูกใช้ในแอปพลิเคชัน Java เกือบทั้งหมด และมีข้อเท็จจริงบางประการที่เราควรรู้เกี่ยวกับคลาส String เป็นimmutableประเภทข้อมูลที่ไม่เปลี่ยนรูป ( ) และสรุปผลใน Java และStringเครื่องเสมือนจะจัดเก็บอ็อบเจ็กต์ทั้งหมดของคลาสไว้ในพูลสตริง คุณลักษณะอีกประการหนึ่งStringคือวิธีการรับออบเจ็กต์คลาสStringโดยใช้เครื่องหมายคำพูดคู่และการโอเวอร์โหลดตัวดำเนินการ "+" สำหรับการต่อข้อมูล

2. การสร้างออบเจ็กต์ String มีวิธีใดบ้าง

เราสามารถสร้างวัตถุโดยใช้ตัวดำเนินการใหม่เช่นเดียวกับคลาสอื่นๆ ใน Java หรือคุณสามารถใช้เครื่องหมายคำพูดคู่เพื่อสร้างStringวัตถุ นอกจากนี้ยังมีตัวสร้างคลาสหลายตัวStringสำหรับรับสตริงจากอาร์เรย์อักขระ อาร์เรย์ไบต์ และยังใช้ StringBufferหรือStringBuilder
String str = new String("abc");
String str1 = "abc";
เมื่อเราสร้างสตริงโดยใช้เครื่องหมายคำพูดคู่ Java Virtual Machine จะค้นหาสตริงอื่นที่มีค่าเดียวกันในพูลสตริง หากพบสตริง ระบบจะส่งคืนเฉพาะการอ้างอิงไปยังอ็อบเจ็กต์ที่มีอยู่ของคลาสStringมิฉะนั้น ออบเจ็กต์ใหม่จะถูกสร้างขึ้นด้วยค่าที่ได้รับและจัดเก็บไว้ในพูล เมื่อเราใช้ตัวดำเนินการใหม่ เครื่องเสมือนจะสร้างวัตถุStringแต่ไม่ได้เก็บไว้ในพูลสตริง เราสามารถใช้เมธอดนี้intern()เพื่อจัดเก็บสตริงในพูลสตริง หรือรับข้อมูลอ้างอิงหากสตริงดังกล่าวมีอยู่แล้วในพูล

3. เขียนวิธีการตรวจสอบว่าสตริงเป็นพาลินโดรมหรือไม่

สตริงเรียกว่าพาลินโดรมหากอ่านได้เหมือนกันทั้งสองทิศทาง ตัวอย่างเช่น “aba” เป็นสตริงพาลินโดรมิก คลาสStringไม่มีวิธีการใด ๆ สำหรับการย้อนกลับสตริง แต่คลาสStringBufferมีStringBuilderวิธีการย้อนกลับซึ่งเราสามารถตรวจสอบได้ว่าสตริงของเราเป็นพาลินโดรมหรือไม่
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นี้และนั่นคือเหตุผลเดียวที่จะใช้เมธอดsubSequenceในคลาส Stringภายในมันเรียกว่าsubstring. ตัวอย่างง่ายๆ ของการใช้วิธีการ:
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 ได้อย่างไร?

คลาสStringสืบทอดอินเทอร์เฟซComparableและมีสองตัวเลือกวิธีcompareTo()การ วิธีการcompareTo(String anotherString)เปรียบเทียบวัตถุStringกับอาร์กิวเมนต์ที่ได้รับStringแบบพจนานุกรม หากบรรทัดปัจจุบันนำหน้าสตริงที่ได้รับ เมธอดจะส่งกลับจำนวนเต็มลบ และหากสตริงตามหลังอาร์กิวเมนต์ที่ได้รับ ก็จะส่งคืนจำนวนเต็มintegerบวก ถ้าเมธอดคืนค่า 0 แสดงว่าสตริงมีค่าเท่ากัน ซึ่งในกรณีนี้เมธอดequals(String str)ก็จะคืนค่าเป็นจริงด้วย compareToIgnoreCase(String str): วิธีการนี้คล้ายกับวิธีก่อนหน้ายกเว้นว่าจะละเว้นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ ใช้ CASE_INSENSITIVE_ORDER Comparator สำหรับการเปรียบเทียบแบบคำนึงถึงขนาดตัวพิมพ์ หากค่าที่ส่งคืนเป็นศูนย์ วิธีการequalsIgnoreCase(String str)ก็จะคืนค่าเป็นจริงด้วย ลองดูตัวอย่างเล็กๆ น้อยๆ เพื่ออธิบายวิธีการเหล่านี้:
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. เราสามารถใช้สตริงในโครงสร้างสวิตช์ได้หรือไม่?

คำถามที่ยุ่งยากนี้ใช้เพื่อทดสอบความรู้ของคุณเกี่ยวกับพัฒนาการของภาษาในปัจจุบัน Java 7 ขยายคำสั่ง switchเพื่อใช้สตริง Java เวอร์ชันก่อนหน้าไม่รองรับสิ่งนี้ หากคุณกำลังใช้โฟลว์แบบมีเงื่อนไขสำหรับสตริง คุณสามารถใช้เงื่อนไข if-else และคุณสามารถใช้คำสั่ง switch หากคุณใช้ Java 7 หรือใหม่กว่า ตัวอย่างเล็กๆ ของการใช้สตริงในคำสั่ง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)
จุดการใช้งานคีย์switchสำหรับสตริงใน Java
  • การใช้สตริงในการออกแบบswitchทำให้โค้ดสามารถอ่านได้ง่ายขึ้นโดยกำจัดเงื่อนไขหลายif-elseลูกโซ่
  • สตริงในswitchจะต้องตรงตามตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ ตัวอย่างด้านบนแสดงสิ่งนี้
  • ตัวดำเนินการswitchใช้วิธีString.equals()การเปรียบเทียบค่าผลลัพธ์กับ ค่า ตัวพิมพ์ดังนั้นให้เพิ่มการตรวจสอบเป็น NULL เพื่อหลีกNullPointerExceptionเลี่ยง
  • ตามเอกสารประกอบ Java 7 สำหรับสตริงในswitchคอมไพเลอร์ Java จะสร้างโค้ดไบต์ที่มีประสิทธิภาพมากขึ้นสำหรับสตริงในโครงสร้างswitchมากกว่าเงื่อนไขที่ต่อif-elseกัน
  • ตรวจสอบให้แน่ใจว่าจะใช้กับ Java 7 หรือใหม่กว่า ไม่เช่นนั้นคุณจะได้รับxception.

11. เขียนโปรแกรมที่พิมพ์การเรียงสับเปลี่ยนทั้งหมดของสตริง

นี่เป็นคำถามที่ยุ่งยาก และเราต้องใช้การเรียกซ้ำเพื่อค้นหาการเรียงสับเปลี่ยนทั้งหมดของสตริง ตัวอย่างเช่น การเรียงสับเปลี่ยนของ "AAB" อาจเป็น "AAB", "ABA" และ "BAA" นอกจากนี้เรายังต้องใช้ Set เพื่อให้แน่ใจว่าเราไม่มีแถวที่ซ้ำกัน เพื่อให้ได้การเรียงสับเปลี่ยนทั้งหมด ขั้นแรกเราใช้อักขระตัวแรกของสตริงและจัดเรียงอักขระที่เหลือใหม่ ถ้า String = “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