JavaRush /وبلاگ جاوا /Random-FA /رشته جاوا. پرسش و پاسخ مصاحبه، بخش اول
Andrey
مرحله

رشته جاوا. پرسش و پاسخ مصاحبه، بخش اول

در گروه منتشر شد
کلاس Stringیکی از پرکاربردترین کلاس ها در جاوا است. این مقاله چند پرسش و پاسخ مهم مصاحبه رشته جاوا را ارائه می دهد. رشته جاوا.  پرسش و پاسخ مصاحبه، بخش 1 - 1آنها در بدست آوردن تصویری کامل از کلاس بسیار مفید خواهند بود و شما را برای هر سوال مصاحبه Stringمرتبط با کلاس آماده می کنند .String

1. String در جاوا چیست؟ این چه نوع داده ای است؟

String یک کلاس در جاوا است که در بسته java.lang تعریف شده است. این یک نوع داده اولیه مانند int و long نیست. کلاس String یک مجموعه کاراکتر رشته ای را نشان می دهد. رشته ها تقریباً در تمام برنامه های جاوا استفاده می شوند و چند واقعیت وجود دارد که باید در مورد کلاس String بدانیم. این یک immutableنوع داده غیرقابل تغییر ( ) و نهایی شده در جاوا است و Stringماشین مجازی تمام اشیاء کلاس را در یک مجموعه رشته ای ذخیره می کند. یکی دیگر از ویژگی های Stringاین است که راه برای به دست آوردن اشیاء کلاس Stringبا استفاده از دو نقل قول و بارگذاری بیش از حد عملگر "+" برای الحاق.

2. راه های مختلف ایجاد یک شی String چیست؟

می‌توانیم مانند هر کلاس دیگر در جاوا، اشیایی را با استفاده از عملگر جدید ایجاد کنیم یا می‌توانیم از دو کوتیشن برای ایجاد یک شی استفاده کنیم String. Stringهمچنین چندین سازنده کلاس برای گرفتن یک رشته از یک آرایه کاراکتر، یک آرایه بایت و همچنین استفاده StringBufferاز یا وجود دارد StringBuilder.
String str = new String("abc");
String str1 = "abc";
هنگامی که ما یک رشته با استفاده از کوتیشن های دوگانه ایجاد می کنیم، ماشین مجازی جاوا در مجموعه رشته ها به دنبال رشته دیگری با همان مقدار می گردد. اگر رشته پیدا شد، آنگاه فقط یک مرجع به یک شی موجود از کلاس برگردانده می شود String، در غیر این صورت یک شی جدید با مقدار دریافتی ایجاد می شود و در pool ذخیره می شود. هنگامی که از عملگر جدید استفاده می کنیم، ماشین مجازی یک شی ایجاد می کند Stringاما آن را در مجموعه رشته ها ذخیره نمی کند. می‌توانیم از این روش intern()برای ذخیره یک رشته در استخر رشته‌ای استفاده کنیم یا اگر چنین رشته‌ای قبلاً در استخر وجود داشته باشد، یک مرجع دریافت کنیم.

3. روشی بنویسید تا بررسی کنید که آیا یک رشته پالیندروم است یا خیر.

یک رشته اگر در هر دو جهت یکسان خوانده شود پالیندروم نامیده می شود. به عنوان مثال، "آبا" یک رشته پالیندرومیک است. کلاس Stringهیچ روشی برای معکوس کردن یک رشته ارائه نمی‌کند، اما کلاس‌ها یک متد معکوس StringBufferدارند StringBuilderکه با آن می‌توانیم بررسی کنیم که آیا رشته ما یک palindrome است یا خیر.
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 چه کاری انجام می دهد؟

جاوا 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. چگونه دو رشته را در جاوا مقایسه کنیم؟

کلاس Stringرابط را به ارث می برد Comparableو دو گزینه متد دارد 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()برای تبدیل یک رشته به آرایه‌ای از کاراکترها استفاده کنیم. یک مثال ساده که نحوه تبدیل رشته به کاراکتر و کاراکتر به رشته در جاوا را نشان می دهد.
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. آیا می توانیم از یک رشته در ساختار سوئیچ استفاده کنیم؟

این سوال پیچیده برای آزمایش دانش شما از پیشرفت فعلی زبان استفاده می شود. جاوا 7 دستور switch را برای استفاده از رشته ها گسترش می دهد؛ نسخه های قبلی جاوا این را پشتیبانی نمی کنند. اگر یک جریان شرطی برای رشته ها پیاده سازی می کنید، می توانید از شرایط if-else استفاده کنید و اگر از جاوا 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)
نکات کلیدی استفاده switchاز رشته ها در جاوا.
  • استفاده از رشته ها در طراحی switchبا حذف زنجیره های متعدد شرایط، کد را خواناتر می کند if-else.
  • رشته‌ها به switchحروف بزرگ و کوچک حساس هستند، مثال بالا این را نشان می‌دهد.
  • اپراتور switchاز روشی String.equals()برای مقایسه مقدار به دست آمده با مقادیر مورد استفاده می کند ، بنابراین برای اجتناب از آن یک بررسی برای NULL اضافه کنید NullPointerException.
  • با توجه به مستندات جاوا 7 برای رشته ها در switch, کامپایلر جاوا بایت کد کارآمدتری را برای رشته ها در یک ساختار تولید می کند switchتا برای شرایط پیوسته if-else.
  • مطمئن شوید که این با جاوا 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