مقدمة
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
في جافا؟
نظرًا لأن كائن الـ 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