JavaRush /مدونة جافا /Random-AR /سلسلة جافا. أسئلة وأجوبة المقابلة، الجزء الأول
Andrey
مستوى

سلسلة جافا. أسئلة وأجوبة المقابلة، الجزء الأول

نشرت في المجموعة
يعد الفصل Stringأحد الفصول الأكثر استخدامًا في Java. توفر هذه المقالة بعض الأسئلة والأجوبة المهمة لمقابلة Java String. سلسلة جافا.  أسئلة وأجوبة المقابلة، الجزء 1 - 1ستكون مفيدة جدًا في الحصول على صورة كاملة للفصل Stringوستجهزك لأي Stringسؤال في المقابلة يتعلق بالفصل.

1. ما هي السلسلة في جافا؟ ما نوع البيانات هذا؟

السلسلة هي فئة في Java تم تعريفها في حزمة java.lang. إنه ليس نوع بيانات بدائيًا مثل int وlong. تمثل فئة السلسلة مجموعة أحرف سلسلة. يتم استخدام السلاسل النصية في جميع تطبيقات Java تقريبًا، وهناك بعض الحقائق التي يجب أن نعرفها عن فئة السلسلة. إنه immutableنوع بيانات غير قابل للتغيير () ونهائي في Java ويقوم Stringالجهاز الظاهري بتخزين جميع كائنات الفئة في تجمع سلسلة. ميزة أخرى Stringهي طريقة الحصول على كائنات الفئة Stringباستخدام علامات الاقتباس المزدوجة والتحميل الزائد على عامل التشغيل "+" للتسلسل.

2. ما هي الطرق المختلفة لإنشاء كائن سلسلة؟

يمكننا إنشاء كائنات باستخدام العامل الجديد تمامًا مثل أي فئة أخرى في 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. ماذا تفعل طريقة التسلسل الفرعي؟

قدم 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. كيفية مقارنة سلسلتين في جافا؟

يرث الفصل 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 بتوسيع بيان التبديل لاستخدام السلاسل؛ الإصدارات السابقة من Java لا تدعم هذا. إذا كنت تقوم بتنفيذ تدفق شرطي للسلاسل، فيمكنك استخدام شروط if-else ويمكنك استخدام بيان التبديل إذا كنت تستخدم 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 الخاصة بالسلاسل الموجودة في Java switch، يقوم مترجم Java بإنشاء رمز ثانوي أكثر كفاءة للسلاسل الموجودة في البنية switchمقارنةً بالشروط المتسلسلة if-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