سؤال

بغض النظر عن سعة الكومة، هل هناك طرق لتجاوز قيود Integer.MAX_VALUE في Java؟

الأمثلة هي:

  1. تقتصر المجموعات على Integer.MAX_VALUE.
  2. يقتصر StringBuilder / StringBuffer على Integer.MAX_VALUE.
هل كانت مفيدة؟

المحلول

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

وبالمثل، يمكن لـ StringBuilder إنشاء سلسلة بحجم 2 جيجابايت قبل أن تصل إلى MAX_VALUE الحد الذي هو أكثر من كاف لأي غرض عملي.

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

نصائح أخرى

مع طويلة؟تناسبني.

يحرر: اه توضيح السؤالرائع.إجابتي الجديدة والمحسنة:

مع خوارزمية الترحيل.

من قبيل الصدفة، إلى حد ما في الآونة الأخيرة لسؤال آخر (بحث ثنائي في ملف مفروز (معين للذاكرة؟) في Java), ، قمت بإعداد خوارزمية ترحيل للالتفاف حول كثافة العمليات المعلمات في واجهة برمجة تطبيقات java.nio.MappedByteBuffer.

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

سيسمح هذا الأسلوب بحوالي 2 ^ 62 عنصرًا.

مجموعة مصفوفة الفهارس تقتصر على Integer.MAX_VALUE، وليس الحجم الفعلي للمصفوفة.

لذلك يرتبط الحد الأقصى لحجم المصفوفة بحجم نوع المصفوفة.

byte = 1 byte => max  2 Gb data
char = 2 byte => max  4 Gb data
int  = 4 byte => max  8 Gb data
long = 8 byte => max 16 Gb data

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

قصير:Integer.MAX_VALUE ليس حدًا حقًا لأنك تحتاج إلى مساحة كبيرة من الذاكرة للوصول إلى الحد الأقصى فعليًا.إذا كان يجب أن تصل إلى هذا الحد، فقد ترغب في التفكير في تحسين الخوارزمية و/أو تخطيط البيانات :)

نعم، مع فئة BigInteger.

ترقية الذاكرة ضرورية..:)

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