مقارنة القيمة الصحيحة
-
11-09-2019 - |
سؤال
أنا مبرمج مبتدئ جافا وأقرأ متغيرا من فئة عدد صحيح يمكن وصفه ثلاث طرق مختلفة في API. لدي الكود التالي:
if (count.compareTo(0)) {
System.out.println(out_table);
count++;
}
هذا داخل حلقة ونواتج فقط out_table
.
هدفي هو معرفة كيفية معرفة ما إذا كانت القيمة في عدد صحيح count > 0
.
أنا أدرك ذلك count.compare(0)
هل الطريقة الصحيحة؟ أو هو count.equals(0)
?
أنا أعرف ال count == 0
غير صحيح. هل هذا صحيح؟ هل هناك مشغل مقارنة القيمة حيث لها فقط count=0
?
المحلول
الأعداد الصحيحة AutoNBoxed، لذلك يمكنك فقط القيام به
if (count > 0) {
....
}
نصائح أخرى
لمعرفة ما إذا كان Integer
أكبر من 0، يمكنك:
تحقق فيما لو
compareTo(O)
إرجاع رقم موجب:if (count.compareTo(0) > 0) ...
ولكن هذا يبدو سخيفا جدا، أليس كذلك؟ أفضل فقط ...
استعمال الاسترجة1:
if (count > 0) ....
هذا يعادل:
if (count.intValue() > 0) ...
من المهم أن نلاحظ ذلك "
==
يتم تقييمه مثل هذا، معInteger
معامل Unboxed بدلا منint
المعامل محاصر. غير ذلك،count == 0
سوف يعود خطأ عندماcount
تمت تهيئة as.new Integer(0)
(لأن "==
"اختبارات المساواة المرجعية).
1من الناحية الفنية، يستخدم المثال الأول الاسترجة (قبل Java 1.5 لا يمكنك تمرير int
ل compareTo
) ويستخدم المثال الثاني الإخراج من العلبة. وبعد غالبا ما تسمى الميزة المشتركة ببساطة "Autoboxing" لفترة قصيرة، والتي غالبا ما تم توسيعها في استدعاء كلا النوعين من التحويلات "Autoboxing". أعتذر عن استخدام LAX الخاص بي للمصطلحات.
من الأفضل تجنب الاستمتاع غير الضروري لأسباب.
لشيء واحد، إنه أبطأ بعض الشيء من int < int
, ، كما كنت (في بعض الأحيان) إنشاء كائن إضافي؛
void doSomethingWith(Integer integerObject){ ...
int i = 1000;
doSomethingWith(i);//gets compiled into doSomethingWith(Integer.valueOf(i));
القضية الأكبر هي أن الاستمتاع المخفي يمكن أن تخفي الاستثناءات:
void doSomethingWith (Integer count){
if (count>0) // gets compiled into count.intValue()>0
استدعاء هذه الطريقة مع null
سوف رمي أ NullPointerException
.
تم وصف الانقسام بين الأعمليين والأجسام المجمع في جافا على أنه kludge للسرعة. الاستهلاابي يخفي تقريبا هذا، ولكن ليس تماما - منظف فقط لتتبع النوع. لذلك إذا كان لديك كائن صحيح، يمكنك فقط الاتصال compare()
أو intValue()
, ، وإذا كنت قد حصلت على البدائية فقط تحقق من القيمة مباشرة.
يمكنك أيضا استخدام المساواة:
Integer a = 0;
if (a.equals(0)) {
// a == 0
}
وهو ما يعادل:
if (a.intValue() == 0) {
// a == 0
}
و أيضا:
if (a == 0) {
}
(توفر مترجم Java تلقائيا intvalue.())
لاحظ أن التمهيدي / AutoNBoxing يمكن أن يعرض علامة نفقية كبيرة (خاصة الموجودة داخل الحلقات).
على الرغم من أنه يمكنك بالتأكيد استخدام compareTo
الطريقة على مثيل عدد صحيح، ليس من الواضح عند قراءة التعليمات البرمجية، لذلك يجب عليك تجنب القيام بذلك.
يتيح لك Java استخدام الاستروبوكسينج (انظر http://java.sun.com/j2se/1.5.0/docs/guide/language/autoboxing.html.) للمقارنة مباشرة مع int، حتى تتمكن من القيام:
if (count > 0) { }
و ال Integer
نموذج count
يحصل تحويل تلقائيا إلى int
للمقارنة.
إذا كنت تواجه مشكلة في فهم هذا، تحقق من الرابط أعلاه، أو تخيل أنه يقوم بذلك:
if (count.intValue() > 0) { }
شيء آخر يراقبه هو إذا كانت القيمة الثانية كانت كائن عدد صحيح آخر بدلا من "0" حرفي، يقوم المشغل "==" بتقارير مؤشرات الكائنات ولن يقوم Unbox Auto-Unbox.
بمعنى آخر:
Integer a = new Integer(0);
Integer b = new Integer(0);
int c = 0;
boolean isSame_EqOperator = (a==b); //false!
boolean isSame_EqMethod = (a.equals(b)); //true
boolean isSame_EqAutoUnbox = ((a==c) && (a.equals(c)); //also true, because of auto-unbox
//Note: for initializing a and b, the Integer constructor
// is called explicitly to avoid integer object caching
// for the purpose of the example.
// Calling it explicitly ensures each integer is created
// as a separate object as intended.
// Edited in response to comment by @nolith
حسنا، قد أتأخر عن ذلك، لكني أرغب في مشاركة شيء ما:
بالنظر إلى الإدخال: system.out.println (Isgreaterthanzero (-1))؛
public static boolean isGreaterThanZero(Integer value) {
return value == null?false:value.compareTo(0) > 0;
}
عائدات خاطئة
public static boolean isGreaterThanZero(Integer value) {
return value == null?false:value.intValue() > 0;
}
إرجاع حقيقي حتى أفكر في "مقارنة" الخاص بك سيكون أكثر دقة.