هل المصفوفات في جافا تخزين البيانات أو المؤشرات

0

كنت أقرأ عن مكان البيانات وأريد استخدامها لتحسين محرك اللعبة الذي أكتب.

لنفترض أنني قمت بإنشاء خمسة كائنات في أوقات مختلفة موجودة الآن في أماكن مختلفة في الذاكرة ليست بجانب بعضها البعض. إذا قمت بإضافتها جميعًا إلى مصفوفة ، فهل سيحمل هذا الصفيف المؤشرات على هذه الكائنات فقط وسيبقى في نفس المكان في الذاكرة أو سيضيفها جميعًا إلى مصفوفة لإعادة ترتيبها وجعلها متجاورة.

أسأل هذا لأنني اعتقدت أن استخدام المصفوفات سيكون طريقة جيدة لجعلها متجاورة ، لكنني لا أعرف ما إذا كانت المصفوفة ستصلح مشكلتي!

3 الاجابة

3
افضل جواب

TL ؛ د

إن معالجة مجموعة من المراجع للكائنات ليس لها تأثير على الكائنات ، وليس لها تأثير على موقع الكائنات في الذاكرة.

شاء

صفيف من الكائنات هو في الواقع صفيف من المراجع (المؤشرات) إلى الكائنات. المؤشر هو عنوان لموقع آخر في الذاكرة.

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

هذا البحث التلقائي ، بعد المؤشر إلى الكائن ، يجعل مجموعة المؤشرات تبدو وكأنها مجموعة من الكائنات. تفكر مبرمجة جافا في صفيفها على أنها تحتفظ بأجسامها عندما تكون الأشياء في الواقع عبارة عن قفزة قفزة .

يتم تنفيذ المصفوفات في Java ككتل متجاورة من الذاكرة. بالنسبة لمجموعة من الكائنات ، يتم تخزين مؤشرات هذه الكائنات في ذاكرة متجاورة. ولكن عندما نصل إلى العناصر ، فإننا نقفز إلى مكان آخر في الذاكرة للوصول إلى الكائن الفعلي الذي نريده.

Imagen 689488

قد تكون إضافة العناصر "رخيصة" في أنه إذا حدث أن تكون الذاكرة متاحة في الجوار في الذاكرة ، فيمكن تخصيصها للصفيف لإفساح المجال لمزيد من العناصر. في الممارسة العملية ، هذا غير مرجح. من المحتمل أن يتم إنشاء صفيف جديد في مكان آخر في الذاكرة ، مع نسخ جميع المؤشرات إلى الصفيف الجديد ثم تجاهل الصفيف الأصلي.

مثل هذه المجموعة الجديدة من النسخ والنسخ "باهظة الثمن". عندما يكون ذلك ممكنًا ، نريد تجنب هذه العملية. إذا كنت تعرف الحجم الأقصى المحتمل للصفيف ، فحدد هذا الحجم عند الإعلان عن الصفيف. تتم المطالبة بمجموعة الذاكرة المتجاورة بالكامل على الفور ، مع وجود محتوى فارغ في الصفيف حتى تقوم فيما بعد بتعيين مؤشر للعناصر.

يعد الإدراج في منتصف صفيف أمرًا مكلفًا أيضًا. إما أن يتم إنشاء مصفوفة جديدة ويتم نسخ العناصر فوقها ، أو يجب نقل جميع العناصر بعد نقطة الإدراج إلى الموضع المجاور لها.

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

البدائيون

في جافا ، الأنواع البدائية الثمانية ( byte ، short ، int ، long ، float ، double ، boolean و char ) ليست كائنات / فئات وليست برمجة كائنية التوجه . ميزة واحدة هي أنها سريعة وتأخذ القليل من الذاكرة ، مقارنة بالأشياء.

مصفوفة من البدائية تحمل القيم داخل الصفيف نفسه. لذلك يتم تخزين هذه القيم بجانب بعضها البعض ، متجاورة في الذاكرة. لا توجد مراجع / مؤشرات. لا تقفز في الذاكرة.

بالنسبة للإضافة أو الإدراج ، ينطبق نفس السلوك المذكور أعلاه. باستثناء أنه بدلاً من خلط المؤشرات ، يتم خلط القيم البدائية الفعلية حولها.

Imagen 689489

نصائح

في تطبيقات الأعمال ، من الأفضل عمومًا استخدام الكائنات.

وهذا يعني استخدام فئات الأغلفة بدلاً من البدائية. فمثلا، Integer بدلا من int . تسهيلات الملاكمة التلقائية في Java تجعل ذلك أسهل من خلال التحويل التلقائي بين القيم البدائية ومُغلف الكائنات.

وتفضيل الأشياء يعني استخدام أ Collection بدلا من المصفوفات ، عادة أ List ، على وجه التحديد أ ArrayList . أو للاستخدام غير القابل للتغيير ، أ List عاد التنفيذ من الجديد List.of طريقة.

على النقيض من تطبيقات الأعمال ، في الحالات القصوى حيث تكون السرعة واستخدام الذاكرة أمرًا بالغ الأهمية ، مثل محرك اللعبة الخاص بك ، ثم تحقق أقصى استفادة من المصفوفات والأوليات.

:مؤلف
0

تتعامل Java مع مراجع الكائنات فقط. على هذا النحو ، ليس هناك ما يضمن أن عناصر المصفوفة ستكون متجاورة في الذاكرة.

تحرير: تخمين أن هذه الإجابة لم تكن واضحة. خطأي. قصدت أنه ليس هناك ما يضمن أن الكائنات نفسها ستكون متجاورة ، على الرغم من حقيقة أن المراجع ستكون ، حيث يتم تخزين صفائف 1-D بشكل متواصل. ومع ذلك ، فإن إجابة باسل بورك تشرح بشكل مثالي كيفية عمل ذلك.

:مؤلف
0

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

:مؤلف

أسئلة ذات صلة

فوق
قائمة طعام