لماذا هذا الرمز في رمي IndexOfOutBoundsException - الملقب ما الأمر مع ensureCapacity()?

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

  •  10-07-2019
  •  | 
  •  

سؤال

النظر في المسائل التالية اثنين قصاصات من التعليمات البرمجية:

int index = 676;
List<String> strings = new ArrayList<String>();
strings.add(index, "foo");

و

int index = 676;
List<String> strings = new ArrayList<String>();
strings.ensureCapacity(index);
strings.add(index, "foo");

في الحالة الأولى, أنا لا أستغرب أن نرى IndexOfOutBoundsException. وفقا API, add(int index, E element) سوف رمي IndexOfOutBoundsException "إذا كان الفهرس خارج النطاق (index < 0 || index > size())".حجم strings 0 قبل أي عناصر تم إضافة لذلك المؤشر سيكون بالتأكيد أكبر من ArrayList الحجم.

ولكن في الحالة الثانية ، أتوقع الدعوة إلى ensureCapacity تنمو strings مثل أن الدعوة إلى add هل صحيح إدراج سلسلة "foo" في مؤشر 676 - لكنه لا.

  1. لماذا لا ؟

  2. ماذا علي أن أفعل حتى add(index, "foo") يعمل index > strings.size()?

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

المحلول

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

نصائح أخرى

ArrayList.ensureCapacity() لا تغيير الحجم الفعلي القائمة (التي يتم إرجاعها من قبل حجم ()) ، بل تخصيص الداخلية العازلة بحيث لن تحتاج إلى تخصيص المخزن المؤقت ليصل إلى هذا الحجم (عند استدعاء قائمة.إضافة(كائن).

/**
 * Increases the capacity of this <tt>ArrayList</tt> instance, if
 * necessary, to ensure that it can hold at least the number of elements
 * specified by the minimum capacity argument.
 */

اتخاذ تخمين ، أعتقد أن ما تبحث عنه هو

Integer index = Integer.valueOf(676);
Map<Integer,String> strings = new HashMap<Integer,String>();
strings.put(index, "foo");

طول الخاص بك هو 676, ولكن عليك أن تتذكر أن يتم على أساس الصفر ، حتى في الواقع, كنت أريد مؤشر -1 أن يكون العدد الأقصى.

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