متى يجب استخدام الأوليات بدلا من التفاف الكائنات ؟

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

سؤال

فعلا هنا هو موضوع مماثل مع قيمة عملية.بقدر ما أفهم ، الأوليات أداء أفضل وينبغي أن تستخدم في كل مكان باستثناء الحالات التي يكون فيها الكائن الميزات ذات الصلة (على سبيل المثال null التحقق) مطلوبة.أليس كذلك ؟

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

المحلول

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

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

نتيجة واحدة هي: انها لا تزال غير المستحسن استخدام autoboxing لإجراء العمليات الحسابية العلمية.على سبيل المثال ، قانون d = a * b + c هو عدد صحيح باستخدام فئات أ ، ب ، ج ، د ، و الشفرة التي تم إنشاؤها د.valueOf(أ.intValue() * ب.intValue() + c.intValue()).كل هذه الدعاء طريقة بهم النفقات العامة ، لذلك عادة ما ينصح باستخدام autoboxing عند الحاجة إلى تخزين الأوليات في مجموعات.

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


Jb يضيف هذا التعليق:

أيضا المجمع.valueOf(البدائية) يستخدم مجموعة من الأغلفة.لذلك يفضل عدد صحيح.valueOf(5) new Integer(5)

نصائح أخرى

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

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

نعم، الأوليات هي أسرع من الكائنات. منذ جافا 5 حتى يمكنك خلط الأوليات والأشياء من دون تحويل واحدة إلى أخرى يدويا. آلية autoboxing يعتني ذلك تماما.

وهذا يعني أنه إذا كنت وضعت بدائية في مجموعة، والمترجم لا يشكو، وتحويل بدائية إلى كائن ضمنا.

إذا كنت تحتاج البدائيون متجر في مجموعات قد تستخدم المشاعات-البدائيون .

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

وعملت مرة واحدة على المشروع الذي تستخدم الأوليات (والبيرة ORM) في الوصول إلى قاعدة البيانات:

 class Foo{
    int xxx = -1;
 ...
 }

وبعد ذلك كان لديك:

 void persist(Foo foo){
     ...
     statement.setInt(15,foo.getXXX()==-1?null:foo.getXXX());
     ...
}

والله كان الشر.

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

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