يعد الكومة والمكدس مفهومين مهمين جدًا في بنية بيانات Java. تحلل هذه المقالة الفرق بين الاثنين بمزيد من التفاصيل. للرجوع اليها. التفاصيل هي كما يلي:
كومة Java هي منطقة بيانات في وقت التشغيل يتم من خلالها تخصيص مساحة لكائنات الفئة من خلال تعليمات مثل new وnewaray وanewarray وmultianewarray، ولا تتطلب إصدار كود البرنامج بشكل صريح المسؤول، تتمثل ميزة الكومة في أنها يمكنها تخصيص حجم الذاكرة ديناميكيًا، ولا يحتاج المترجم إلى إخبار العمر مسبقًا، لأنه يخصص الذاكرة ديناميكيًا في وقت التشغيل، وسيقوم جامع البيانات المهملة في Java تلقائيًا بجمع تلك التي لم تعد مستخدمة ولكن العيب هو أنه نظرًا للحاجة إلى تخصيص الذاكرة ديناميكيًا في وقت التشغيل، فإن سرعة الوصول تكون بطيئة.
تتمثل ميزة المكدس في أن سرعة الوصول أسرع من الكومة، وتأتي في المرتبة الثانية بعد السجل، ويمكن مشاركة بيانات المكدس. لكن العيب هو أنه يجب تحديد حجم وعمر البيانات المخزنة في المكدس، كما أن هناك نقصًا في المرونة. يقوم المكدس بشكل أساسي بتخزين بعض الأنواع الأساسية من المتغيرات (int، وshort، وlong، وbyte، وfloat، وdouble، وboolean، وchar) ومقابض الكائنات.
الميزة الخاصة المهمة جدًا للمكدس هي أنه يمكن مشاركة البيانات المخزنة في المكدس. لنفترض أننا نحدد أيضًا:
كثافة العمليات = 3؛
كثافة العمليات ب = 3؛
يقوم المترجم أولاً بمعالجة int a = 3؛ أولاً يقوم بإنشاء مرجع للمتغير a على المكدس، ثم يتحقق مما إذا كانت هناك قيمة 3 على المكدس، وإذا لم يتم العثور عليه، فإنه يخزن 3 في، ثم يشير إلى 3. ثم قم بمعالجة int b = 3؛ بعد إنشاء المتغير المرجعي لـ b، نظرًا لوجود قيمة 3 بالفعل في المكدس، سيتم توجيه b مباشرةً إلى 3. بهذه الطريقة، هناك موقف حيث يشير كل من a وb إلى 3 في نفس الوقت.
في هذا الوقت، إذا تم تعيين a=4 مرة أخرى، فسيقوم المترجم بإعادة البحث عما إذا كانت هناك قيمة 4 في المكدس سوف يشير مباشرة إلى هذا العنوان. ولذلك، فإن التغييرات في قيمة أ لن تؤثر على قيمة ب.
تجدر الإشارة إلى أن هذا النوع من مشاركة البيانات يختلف عن مشاركة مرجعي كائنين يشيران إلى كائن واحد في نفس الوقت، لأنه في هذه الحالة لن يؤثر تعديل a على b، بل يتم إكماله بواسطة المترجم، والذي مفيد لتوفير المساحة. إذا قام متغير مرجع كائن بتعديل الحالة الداخلية للكائن، فسوف يؤثر ذلك على متغير مرجع كائن آخر.
السلسلة هي نوع خاص من البيانات المجمعة. يمكن استخدامها:
String str = new String("abc");String str = "abc";
هناك طريقتان لإنشائه، الأولى هي استخدام new() لإنشاء كائن جديد سيتم تخزينه في الكومة. يتم إنشاء كائن جديد في كل مرة يتم استدعاؤه.
الطريقة الثانية هي أولاً إنشاء متغير مرجعي للكائن str من فئة String على المكدس، ثم التحقق مما إذا كان "abc" مخزنًا في المكدس، وإذا لم يكن الأمر كذلك، قم بتخزين "abc" على المكدس وجعل str تشير إلى "abc ". ، إذا كان هناك بالفعل "abc"، فأشر مباشرة إلى "abc".
عند مقارنة ما إذا كانت القيم في فئة ما متساوية، استخدم طريقة يساوي () عند اختبار ما إذا كانت مراجع فئتين مجمّعتين تشير إلى نفس الكائن، استخدم ==. يوضح المثال التالي النظرية المذكورة أعلاه.
String str1 = "abc"; String str2 = "abc";
يمكن ملاحظة أن str1 وstr2 يشيران إلى نفس الكائن.
String str1 =new String ("abc")؛ String str2 = new String ("abc")؛
استخدام الجديد هو إنشاء كائنات مختلفة. توليد واحدة في وقت واحد.
لذلك، إذا استخدمت الطريقة الأولى لإنشاء سلاسل "abc" متعددة، فهناك في الواقع كائن واحد فقط في الذاكرة، وهذه الطريقة في الكتابة مفيدة لتوفير مساحة الذاكرة البرنامج إلى حد ما، لأن JVM سيحدد تلقائيًا ما إذا كان من الضروري إنشاء كائن جديد بناءً على الوضع الفعلي للبيانات الموجودة في المكدس. بالنسبة لرمز String str = new String("abc");، يتم دائمًا إنشاء كائنات جديدة في الكومة، بغض النظر عما إذا كانت قيم السلسلة الخاصة بها متساوية أو ما إذا كان من الضروري إنشاء كائنات جديدة، وبالتالي زيادة العبء على البرنامج.
من ناحية أخرى، يرجى ملاحظة: عندما نحدد فئة باستخدام تنسيق مثل String str = "abc";، فإننا نفترض دائمًا أنه تم إنشاء كائن str لفئة String. تقلق بشأن الفخاخ! ربما لم يتم إنشاء الكائن! وبدلاً من ذلك قد يشير فقط إلى كائن تم إنشاؤه مسبقًا. فقط من خلال الطريقة الجديدة () يمكننا التأكد من إنشاء كائن جديد في كل مرة.
نظرًا لطبيعة فئة السلسلة غير القابلة للتغيير، عندما يحتاج متغير السلسلة إلى تغيير قيمته بشكل متكرر، يجب عليك التفكير في استخدام فئة StringBuffer لتحسين كفاءة البرنامج.
آمل أن يكون ما تصفه هذه المقالة مفيدًا للجميع في تعلم برمجة Java.