في Java، يتم تخزين السلاسل في الذاكرة ككائنات من فئة String.
عند تخصيص الذاكرة لأي برنامج Java، يقوم JVM (جهاز Java الظاهري) بتقسيم الذاكرة المخصصة إلى قسمين. جزء واحد هو المكدس والجزء الآخر هو الكومة. في ذاكرة الكومة، تقوم Java بتخصيص بعض الذاكرة، خاصة بالنسبة للقيم الحرفية التي تسمى تلك الذاكرة تجمع سلسلة ثابتة (SCP). SCP هي المنطقة المحددة مسبقًا داخل الكومة. يساعد تجمع السلسلة في توفير مساحة كبيرة لـ Java Runtime. تستخدم فئة السلسلة SCP لتخزين سلسلة حرفية فريدة.
في ذاكرة Stack، يتم تخزين المتغيرات أو المراجع المتغيرة أو المراجع إلى الكائنات.
في ذاكرة الكومة، يتم تخزين كافة الكائنات التي تم تخصيصها ديناميكيًا. لتخصيص ذاكرة لكائن نستخدم كلمة رئيسية جديدة.
هناك طريقتان لإنشاء كائنات السلسلة.
String str1 = "MyString"؛
عندما نقوم بإنشاء سلسلة حرفية، يتحقق JVM أولاً مما إذا كانت السلسلة الحرفية موجودة بالفعل في تجمع ثابت السلسلة. إذا لم يكن متاحًا، فسيتم إنشاء سلسلة حرفية جديدة في SCP.
في الصورة أعلاه، يشير str1 إلى "MyString" في SCP. فيما يلي الطرق التي يتم بها التعامل مع القيم الحرفية للسلسلة التي تم إنشاؤها حديثًا.
String str2 = new String("MyString"); // إنشاء مثيل لفئة السلسلة باستخدام كلمة أساسية جديدة
عندما يتم إنشاء كائن سلسلة باستخدام كلمة رئيسية جديدة، فإنه سيتم إنشاء كائنين. واحد في SCP والآخر في الكومة ويتم تخزين المتغير المرجعي في المكدس.
لقد أنشأنا بالفعل "MyString" الحرفي باستخدام
String str1 = "MyString"؛
نظرًا لأنه لا يمكننا الحصول على نسخ مكررة في SCP، فلن يقوم JVM بإنشاء كائن آخر في SCP ولكنه سيعيد المرجع الموجود إلى المتغير str3 في المكدس وسيقوم بإنشاء كائن واحد في الكومة. ستشير Str3 إلى الكائن "MyString" في الكومة ولكن ليس في SCP.
فيما يلي الحالات المختلفة لكيفية تخصيص الذاكرة لكائنات السلسلة.
الحالة 1: كيف يتم تخزين كائنات السلسلة المحددة أعلاه في الذاكرة.
سلاسل الطبقة العامةStorageConcept
{
الفراغ الثابت العام (String[] args)
{
String str1 = "MyString"؛
String str2 = سلسلة جديدة("MyString");
System.out.println(str1 == str2); //الإخراج:خطأ
System.out.println(str1.equals(str2)); // الإخراج: صحيح
}
}
عندما نقارن str1 وstr2 باستخدام عامل التشغيل "=="، فإنه يُرجع خطأ. كما نعلم، يقوم عامل التشغيل "==" بمقارنة عناوينهم الفعلية. هنا في مثالنا، يشير str1 إلى الكائن في SCP ويشير str2 إلى الكائن الموجود في الكومة. لذلك ترجع كاذبة.
لكن في حالة str1.equals(str2)، كما نعلم، تتحقق الدالة "يساوي" من أن الأحرف الفردية لكل من str1 وstr3 لها نفس القيمة المخزنة وترجع صحيحة.
الحالة 2 : سلسلة حرفية أخرى
String str3 = "MyString"؛
سيشير كل من str1 وstr3 إلى نفس السلسلة الحرفية في SCP.
سلاسل الطبقة العامةStorageConcept
{
الفراغ الثابت العام (String[] args)
{
String str1 = "MyString"؛
String str3 = "MyString"؛
System.out.println(str1 == str2); // الإخراج: صحيح
System.out.println(str1.equals(str2)); // الإخراج: صحيح
}
}
s1 == s3 تُرجع صحيحًا، حيث يقوم عامل التشغيل "==" بمقارنة عناوينهم الفعلية وليس المحتوى.
s1.equals(s3) تُرجع صحيحًا، وتقوم الدالة "يساوي" بالتحقق من الأحرف الفردية في كلا المتغيرين المرجعيين.
الحالة 3 : يتم إنشاء كائن سلسلة آخر باستخدام كلمة رئيسية جديدة
String str4 = سلسلة جديدة("NewString");
في هذه الحالة، سيتحقق JVM من هذه السلسلة في SCP ولا يمكنه العثور على كائن السلسلة بالقيمة "NewString"، لذلك سيقوم بإنشاء كائنين أحدهما في SCP والآخر في الكومة، وسيتم تخزين المتغير المرجعي str4 في المكدس. سيكون لدى Str4 مرجع للكائن الموجود في الكومة.
الحالة 4 : يتم إنشاء سلسلة حرفية أخرى.
String str5 = "NewString"؛
في هذه الحالة، سوف يقوم JVM بالتحقق من SCP إذا كان هذا الحرفي متاحًا بالفعل أم لا، هنا "NewString" موجود بالفعل في SCP لذلك لن يقوم JVM بإنشاء نسخة مكررة في SCP بدلاً من ذلك فإنه يقوم بإرجاع المرجع إلى المتغير str5.
الحالة 5 : تعيين سلسلة واحدة إلى سلسلة أخرى
String str4 = سلسلة جديدة("NewString");
سلسلة str6 = str4؛ // تعيين
هنا ستشير str6 وstr4 إلى نفس الكائن في الكومة ولن تمحو القيمة في str4.
سلاسل الطبقة العامةStorageConcept
{
الفراغ الثابت العام (String[] args)
{
String str4 = سلسلة جديدة("NewString");
سلسلة str6 = str4؛
System.out.println(str4 == str6); // الإخراج: صحيح
}
}
سيعطي JVM مرجع "NewString" في الكومة إلى المتغير str6. هذا هو السبب وراء إرجاع str4 == str6 صحيحًا.
في الختام، إنشاء كائنات سلسلة باستخدام سلسلة حرفية وبواسطة عامل تشغيل "جديد" له إيجابياته وسلبياته.
باستخدام السلسلة الحرفية، يمكننا جعل الذاكرة أكثر كفاءة من خلال عدم إنشاء نسخ مكررة. يقوم JVM بإنشاء كائن فريد واحد وتبقى السلسلة في SCP إلى الأبد. الجانب السلبي لهذا هو أن تجمع السلسلة له حجم ثابت وسيمتلئ في وقت ما.
ولكن باستخدام كلمة أساسية جديدة، يتم إنشاء كائنين، أحدهما في SCP والآخر في الكومة. في الكومة، إذا لم نكن بحاجة إلى الكائن، فسيتم محوه بواسطة أداة تجميع البيانات المهملة لتوفير مساحة. لكن الجانب السلبي لهذا هو أنه مع عامل التشغيل "الجديد" سيتعين على JVM دائمًا إنشاء كائن جديد وهذا يمثل حملًا زائدًا على JVM.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3