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

StackOverflow https://stackoverflow.com/questions/242079

  •  04-07-2019
  •  | 
  •  

سؤال

في Java، يمكننا دائمًا استخدام مصفوفة لتخزين مرجع الكائن.ثم لدينا ArrayList أو HashTable الذي يمكن توسيعه تلقائيًا لتخزين الكائنات.ولكن هل يعرف أحد طريقة أصلية للحصول على مجموعة قابلة للتوسيع تلقائيًا من مراجع الكائنات؟

يحرر:ما أعنيه هو أنني أريد معرفة ما إذا كانت Java API تحتوي على فئة ما مع القدرة على تخزين المراجع إلى الكائنات (ولكن لا يتم تخزين الكائن الفعلي مثل XXXList أو HashTable) والقدرة على التوسيع التلقائي.

هل كانت مفيدة؟

المحلول

وصفائف جافا، بحكم تعريفها، حجم ثابت. إذا كنت بحاجة لصناعة السيارات في النمو، واستخدام الطبقات XXXList.

وتحرير - تم توضيح مسألة قليلا

وعندما كنت بدأت لأول مرة لمعرفة جافا (قادمة من C ++ C وخلفية)، وكان هذا على الارجح واحدة من أول الأشياء التي تعثرت لي. أتمنى أن تلقي بعض الضوء.

وعلى عكس C ++، صفائف كائن في جافا تفعل <م> لا التحف المخزن. أنها تخزين مراجع الكائنات.

في C ++، إذا أعلن شيئا مشابها:

String myStrings[10];

ويمكنك أن تحصل على 10 كائنات سلسلة. في هذه المرحلة، سيكون من القانوني تماما أن تفعل شيئا مثل println (myStrings [5] مدة العرض)؛ - كنت أحصل '0' - منشئ الافتراضي لسلسلة يخلق سلسلة فارغة مع طول 0

في جاوة، عند بناء مجموعة جديدة، يمكنك الحصول على الحاوية الفارغة التي يمكن أن تعقد 10 المراجع سلسلة. حتى الدعوة:

String[] myStrings = new String[10];
println(myStringsp[5].length);

وسوف بطرح استثناء مؤشر فارغة، لأنك لم توضع في الواقع إشارة سلسلة في مجموعة حتى الان.

إذا كنت قادما من C ++ الخلفية، والتفكير في سلسلة جديدة [10] بأنها يعادل الجديدة (سلسلة *) [10] من C ++.

وهكذا، مع أخذ ذلك في الاعتبار، فإنه ينبغي أن يكون واضحا إلى حد ما لماذا ArrayList <م> هو الحل لصناعة السيارات التوسع في مجموعة من الكائنات (في واقع الأمر، ويتم تنفيذ ArrayList باستخدام صفائف بسيطة، مع خوارزمية النمو بنيت في أن يخصص صفائف الموسعة الجديدة حسب الحاجة ونسخ المحتوى من القديم إلى الجديد).

في الواقع، هناك بالفعل عدد قليل نسبيا من الحالات التي نستخدم المصفوفات. إذا كنت تكتب وعاء (شيء أقرب إلى ArrayList، أو شجرة باير)، ثم أنها مفيدة، أو إذا كنت تفعل الكثير من التلاعب بايت مستوى منخفض - ولكن في المستوى الذي تحدث معظم تنمية، وذلك باستخدام واحدة من الطبقات مجموعات هو إلى حد بعيد الأسلوب المفضل.

نصائح أخرى

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

ويمكنك وضع إشارة إلى كائن في اثنين أو أكثر من المجموعات. هذه هي الطريقة التي يمكن أن يكون الجداول التجزئة فرزها ومثل ...

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

مباشرة من صفيف دروس جافا على صفحة الشمس:

-> المصفوفة عبارة عن كائن حاوية يحتوي على ملف مُثَبَّت عدد القيم من نوع واحد.

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

في جاوة، كل متغيرات الكائنات هي المراجع. لذلك

Foo myFoo = new Foo();
Foo anotherFoo = myFoo;

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

وليس هناك بناء لغة من الدرجة الأولى أن يفعل ذلك أنني على علم، إذا كان هذا هو ما كنت أبحث عنه.

وانها ليست فعالة جدا، ولكن إذا كنت مجرد إلحاق إلى صفيف، يمكنك استخدام أباتشي العموم ArrayUtils.add ( ) . تقوم بإرجاع نسخة من مجموعة الأصلية مع عنصر إضافي في ذلك.

وإذا كان يمكنك كتابة التعليمات البرمجية في جافا سكريبت، نعم، يمكنك أن تفعل ذلك. صفائف جافا سكريبت هي مصفوفات متفرق. انها ستوسع أيهما بالطريقة التي تريدها.

ويمكنك كتابة

وعلى [0] = 4،
و[1000] = 434؛
و[888] = "سلسلة"؛

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top