أسئلة وأجوبة حول سلاسل Java

مقدمة

String هي واحدة من أكثر فئات Java استخدامًا. يقدم هذا المقال بعض الأسئلة التمرينية والأجوبة حول String لمساعدتك في التحضير لمقابلة عمل.

يمكنك أيضًا تجربة اختبار سلسلة Java لاختبار معرفتك بفئة String.

ما هي فئة String في جافا؟ هل String نوع بيانات؟

String هي فئة في جافا وهي معرفة في حزمة java.lang. ليست نوع بيانات أساسيًا مثل int و long. تمثل فئة String سلاسل الأحرف. يتم استخدام String في جميع تطبيقات جافا تقريبًا. String غير قابل للتغيير ونهائي في جافا وتستخدم JVM حوض سلسلة لتخزين جميع كائنات String. يمكنك إنشاء كائن String باستخدام علامات اقتباس مزدوجة ويمكنك تحميل عامل الجمع للاقتباس.

ما هي بعض الطرق المختلفة لإنشاء كائن String في لغة البرمجة جافا؟

يمكنك إنشاء كائن String باستخدام مشغل new أو يمكنك استخدام علامات اقتباس مزدوجة لإنشاء كائن String. على سبيل المثال:

String str = new String("abc");
String str1 = "abc";

هناك العديد من المُنشئات المتاحة في فئة String للحصول على String من char array، byte array، StringBuffer، و StringBuilder.

عند إنشاء String باستخدام علامات اقتباس مزدوجة، يبحث المكدس الظاهري في حوض النصوص للتحقق مما إذا كان هناك أي String آخر مخزن بنفس القيمة. إذا تم بالفعل تخزين الـ String في حوض النصوص، يقوم المكدس الظاهري بإرجاع المرجع إلى تلك الكائن String. إذا لم يكن الـ String الجديد موجودًا في حوض النصوص، يقوم المكدس الظاهري بإنشاء كائن String جديد بالقيمة المعطاة ويخزنه في حوض النصوص. عند استخدام مشغل new، يقوم المكدس الظاهري بإنشاء كائن String ولكن لا يخزنه في حوض النصوص. يمكنك استخدام طريقة intern() لتخزين كائن String في حوض النصوص أو إرجاع المرجع إذا كان هناك بالفعل String بقيمة متساوية موجود في الحوض.

كتابة طريقة في جافا للتحقق مما إذا كانت سلسلة الإدخال هي عبارة عن جملة متناظرة.

A string is a palindrome if its value is the same when reversed. For example, aba is a palindrome string. The String class doesn’t provide any method to reverse the string but the StringBuffer and StringBuilder classes have a reverse() method that you can use to check whether a string is a palindrome. For example:

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;
}

كتابة طريقة في جافا لإزالة حرف معين من كائن سلسلة.

يمكننا استخدام الطريقة replaceAll لاستبدال جميع حالات ظهور سلسلة بأخرى. النقطة المهمة هنا هي أن replaceAll() تقبل String كوسيط، لذا يمكنك استخدام فئة Character لإنشاء سلسلة واستخدامها لاستبدال جميع الأحرف بسلسلة فارغة.

private static String removeChar(String str, char c) {
    if (str == null)
        return null;
    return str.replaceAll(Character.toString(c), "");
}

كيف يمكنك جعل سلسلة حروف في جافا أحرف كبيرة أو أحرف صغيرة؟

يمكنك استخدام فئة String وأساليب toUpperCase و toLowerCase للحصول على كائن String بالحالة العلوية أو الحالة السفلية. تحتوي هذه الأساليب على نسخة تقبل وسيطًا Locale وتستخدم قواعد اللغة المحددة لتحويل السلسلة إلى الحالة العلوية أو السفلية.

ما هي طريقة String subSequence؟

قدمت Java 1.4 واجهة CharSequence وتنفيذ الفئة String لهذه الواجهة، ولهذا السبب تحتوي فئة String على طريقة subSequence. داخليًا، تستدعي طريقة subSequence طريقة String substring.

كيف يمكنك مقارنة سلسلتين في برنامج Java؟

كيف يمكنك تحويل سلسلة نصية إلى مصفوفة حرفية في جافا؟

A String object is a sequence of characters, so you can’t convert it to a single character. You can use use the charAt method to get the character at given index or you can use the toCharArray() method to convert a string to character array. Learn more about converting a string to a character array.

كيف يمكنك تحويل سلسلة نصية إلى مصفوفة بايتية في جافا؟

يمكنك استخدام الطريقة getBytes() لتحويل كائن String إلى مصفوفة بايت ويمكنك استخدام البناء new String(byte[] arr) لتحويل مصفوفة بايت إلى كائن String. تعرف أكثر عن تحويل سلسلة نصية إلى مصفوفة بايت.

هل يمكنك استخدام String في حالة التبديل في جافا؟

قامت جافا 7 بتوسيع قدرة حالة التبديل لتشمل Strings؛ الإصدارات السابقة من جافا لا تدعم هذا. إذا كنت تقوم بتنفيذ تدفق شرطي للسلاسل، يمكنك استخدام شروط if-else ويمكنك استخدام حالة التبديل إذا كنت تستخدم جافا 7 أو الإصدارات الأحدث. تعرف أكثر عن سلسلة حالة التبديل في جافا.

اكتب برنامج جافا لطباعة جميع الترتيبات الممكنة لسلسلة نصية.

ستحتاج إلى استخدام التكرار لإيجاد جميع الترتيبات الممكنة لسلسلة. على سبيل المثال، ترتيبات سلسلة “AAB” هي “AAB”، “ABA”، و “BAA”. كما ستحتاج أيضًا إلى استخدام “Set” للتأكد من عدم وجود قيم مكررة. تعرف أكثر عن كيفية “إيجاد جميع الترتيبات الممكنة لسلسلة” في الرابط التالي: إيجاد جميع الترتيبات الممكنة لسلسلة.

اكتب دالة جافا لإيجاد أطول كلمة بالندية في سلسلة معينة.

A string can contain palindrome substrings within it. Learn more about how to find the longest palindrome substring in a string.

ما هي الاختلافات بين “String” و “StringBuffer” و “StringBuilder” في جافا؟

A String object is immutable and final in Java, so whenever you manipulate a String object, it creates a new String object. String manipulations are resource consuming, so Java provides two utility classes for string manipulations, StringBuffer and StringBuilder.

StringBuffer و StringBuilder هما فئات قابلة للتغيير. عمليات StringBuffer متزامنة مع الخيط ومتزامنة، بينما عمليات StringBuilder غير متزامنة مع الخيط. يجب عليك استخدام StringBuffer في بيئة متعددة الخيوط واستخدام StringBuilder في بيئة مع خيط واحد. أداء StringBuilder أسرع من StringBuffer بسبب عدم وجود تكلفة التزامن.

تعرف على المزيد حول الاختلافات بين String و StringBuffer و StringBuilder وعمليات قياس أداء StringBuffer وStringBuilder.

لماذا تكون String غير قابلة للتغيير في جافا؟

String غير قابل للتغيير في جافا لأن هذا يقدم العديد من الفوائد:

  • تصنيف السلاسل ممكن لأن String غير قابل للتغيير في جافا.
  • تزيد الأمان لأن أي هاكر لا يمكنه تغيير قيمتها وتستخدم لتخزين المعلومات الحساسة مثل اسم المستخدم أو كلمة المرور لقاعدة البيانات.
  • نظرًا لأن String غير قابل للتغيير، فمن الآمن استخدامه في التعدد الخيوط ولا تحتاج إلى أي تزامن.
  • يتم استخدام السلاسل في محملات الفئات في جافا ويوفر الحالة الثابتة ضمانًا بأن الفئة الصحيحة تم تحميلها بواسطة فئة “ClassLoader”.

تعرف على المزيد حول لماذا يكون الـ “String” لا يتغير في جافا.

كيف يمكنك تقسيم سلسلة في جافا؟

يمكنك استخدام “split(String regex)” لتقسيم الـ “String” إلى مصفوفة من السلاسل بناءً على التعبير العادي المقدم.

لماذا يفضل استخدام مصفوفة الأحرف على الـ “String” لتخزين كلمات المرور في جافا؟

A String object is immutable in Java and is stored in the string pool. Once it’s created it stays in the pool until garbage collection completes, so even though you’re done with the password it’s available in memory for longer duration. It’s a security risk because anyone having access to memory dump can find the password as clear text. If you use a character array to store password, you can set it to blank once you’re done with it. You can control for how long it’s available in memory and that avoids the security threat.

كيف يمكنك التحقق مما إذا كانت سلسلتان متساويتان في جافا؟

هناك طريقتان للتحقق مما إذا كانت سلسلتين متساويتين. يمكنك استخدام مشغل == أو طريقة equals(). عند استخدام مشغل ==، يتم التحقق من قيمة String وكذلك مرجع الكائن. في كثير من الأحيان في برمجة Java، تريد التحقق فقط من تساوي قيمة String. في هذه الحالة، يجب عليك استخدام طريقة equals() للتحقق مما إذا كانت سلسلتين Strings متساويتين. هناك وظيفة أخرى تسمى equalsIgnoreCase يمكنك استخدامها لتجاهل الحالة.

String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");

System.out.println("s1 == s2 ? " + (s1 == s2)); //true
System.out.println("s1 == s3 ? " + (s1 == s3)); //false
System.out.println("s1 equals s3 ? " + (s1.equals(s3))); //true

ما هو “السلسلة المشتركة” في Java؟

السلسلة المشتركة هي مجموعة من كائنات String المخزنة في ذاكرة الطريقة في Java. String هو فئة خاصة في Java ويمكنك إنشاء كائن String باستخدام المشغل new وكذلك من خلال توفير قيم بين علامتي اقتباس مزدوجة. اعرف المزيد حول سلسلة النصوص في Java.

ماذا يفعل الأسلوب intern() في جافا؟

عند استدعاء الأسلوب intern()، إذا احتوى مجموعة السلسلة بالفعل على سلسلة متساوية لهذا الكائن السلسلة وفقًا لأسلوب equals(Object)، يتم إرجاع السلسلة من المجموعة. وإلا، يتم إضافة هذا الكائن السلسلة إلى المجموعة ويتم إرجاع مرجع إلى هذا الكائن السلسلة. يعيد هذا الأسلوب دائمًا كائن سلسلة يحتوي على نفس المحتوى كهذا الكائن السلسلة ولكنه مضمون أنه من مجموعة من السلاسل الفريدة.

هل الكائن String آمن للاستخدام في خيوط جافا؟

A String object is immutable, so you can’t change its value after creation. This makes the String object thread-safe and so it can be safely used in a multi-threaded environment. Learn more about thread Safety in Java.

نظرًا لأن كائن الـ String لا يمكن تغييره، فإن تجميعة هاشكود تُخزن عند إنشائه ولا يلزم إعادة حسابه. هذا يجعله مرشحًا مثاليًا لكونه مفتاحًا في خريطة، حيث يتم معالجته بشكل أسرع من كائنات مفتاح HashMap الأخرى.

تخمين النتيجة

قم بتجربة نفسك عن طريق تخمين نتيجة مقتطفات كود جافا التالية.

public class StringTest {
    
  	public static void main(String[] args) {
   		String s1 = new String("digitalocean");
   		String s2 = new String("DIGITALOCEAN");
   		System.out.println(s1 = s2);
   	}
    
}
Output
DIGITALOCEAN

النتيجة هي DIGITALOCEAN لأن الكود يعيّن قيمة String s2 لـ String s1. علامة = هي مشغل تعيين يعيّن قيمة y إلى x بتنسيق (x = y). علامة == هي مشغل مقارنة يتحقق مما إذا كان كائن المرجع هو نفسه في السلسلتين.


public class Test {
    
   	 public void foo(String s) {
   	 System.out.println("String");
   	 }
    
   	 public void foo(StringBuffer sb) {
   	 System.out.println("StringBuffer");
   	 }
    
   	 public static void main(String[] args) {
   		new Test().foo(null);
   	}
    
}
Output
Test.java:12: error: reference to foo is ambiguous
   		new Test().foo(null);
   		           ^
  both method foo(String) in Test and method foo(StringBuffer) in Test match

تنتج هذه الشفرة خطأ في وقت الترجمة لأن كلا من طرق foo لديهما نفس الاسم واستدعاء طريقة foo في طريقة main يمرر null. المترجم لا يعرف أي طريقة يجب استدعاؤها. يمكنك أيضًا الرجوع إلى خطأ الطريقة X غامضة بالنسبة لنوع Y.


String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2);
Output
false

الناتج هو false لأن الكود يستخدم المشغل new لإنشاء كائن String، لذلك يتم إنشاؤه في ذاكرة العنقود وستحتوي s1 وs2 على مرجع مختلف. إذا قمت بإنشاء السلاسل باستخدام علامات اقتباس مزدوجة فقط، فسيكونون في مجموعة السلاسل وسيتم طباعة true.


String s1 = "abc";
StringBuffer s2 = new StringBuffer(s1);
System.out.println(s1.equals(s2));
Output
false

الناتج هو false لأن s2 ليست من نوع String. تمتلك طريقة equals() في فئة String مشغل instanceof للتحقق مما إذا كان نوع الكائن الممرر هو String وإرجاع قيمة خاطئة إذا لم يكن الكائن String.


String s1 = "abc";
String s2 = new String("abc");
s2.intern();
System.out.println(s1 == s2);
Output
false

الناتج هو false. تقوم طريقة intern() بإرجاع مرجع الكائن String من مجموعة السلاسل. ومع ذلك، الكود لا يعيد تعيينه إلى s2 ولا يوجد تغيير في s2 وبالتالي s1 و s2 لديهما مرجع كائن مختلف. إذا قمت بتغيير الكود في السطر 3 إلى s2 = s2.intern();، فسيكون الناتج true.

كم عدد كائنات String التي تم إنشاؤها بواسطة الكود التالي؟

String s1 = new String("Hello");  
String s2 = new String("Hello");
Answer

الجواب هو ثلاثة. الكود في السطر 1 ينشئ كائن String بقيمة Hello في حوض السلاسل (الكائن الأول) ثم ينشئ كائن String جديد بقيمة Hello في ذاكرة الأسرة (الكائن الثاني). الكود في السطر 2 ينشئ كائن String جديد بقيمة Hello في ذاكرة الأسرة (الكائن الثالث) ويعيد استخدام سلسلة Hello من حوض السلاسل.

الاستنتاج

في هذه المقالة، قمت بمراجعة بعض أسئلة مقابلات جافا بشكل خاص حول String.

القراءة الموصى بها:

أسئلة برمجة جافا
برامج السلاسل في جافا

Source:
https://www.digitalocean.com/community/tutorials/java-string-interview-questions-and-answers