השוואת ערכים ארוכים ב- Java

1. סקירה כללית

במדריך קצר זה נדון בדרכים שונות להשוות בין שתיים ארוך מקרים. אנו מדגישים את הבעיות המתעוררות בעת השימוש במפעיל השוואת הפניות (==).

2. בעיה באמצעות השוואת הפניות

ארוך הוא כיתת עטיפה לסוג פרימיטיבי ארוך. מכיוון שהם אובייקטים ולא ערכים פרימיטיביים, עלינו להשוות את התוכן של ארוך מקרים באמצעות .שווים() במקום אופרטור השוואת הפניות (==).

במקרים מסוימים, אנו עשויים לקבל את הרעיון ש == זה בסדר, אך המראה מטעה. קחו בחשבון שנוכל להשתמש == עם מספרים נמוכים:

ארוך l1 = 127L; ארוך l2 = 127L; assertThat (l1 == l2) .isTrue ();

אבל לא עם מספרים גדולים יותר. בסופו של דבר יהיו לנו בעיות אם הערכים הם מחוץ לטווח -128 עד 127, שיש תוצאה שונה לחלוטין ובלתי צפויה:

ארוך l1 = 128L; ארוך l2 = 128L; assertThat (l1 == l2) .isFalse ();

זה בגלל ש Java שומרת על מאגר קבוע למקרים של ארוך בין -128 ל- 127.

אופטימיזציה זו אינה נותנת לנו רישיון לשימוש ==. במקרה הכללי, שני מקרים מוסדרים בעלי ערך פרימיטיבי זהה אינם מניבים את אותה התייחסות לאובייקט.

3. שימוש .שווים()

אחד הפתרונות הוא להשתמש ב- .שווים(). זה יעריך את התוכן (ולא ההפניה) של שני האובייקטים:

ארוך l1 = 128L; ארוך l2 = 128L; assertThat (l1.equals (l2)). isTrue ();

4. Objects.equals ()

הבעיה בשימוש שווים() זה שאנחנו צריכים להיות זהירים ולא לקרוא לזה ריק התייחסות.

למרבה המזל, יש ריקשיטת שירות בטוחה בה אנו יכולים להשתמש - Objects.equals ().

בואו נראה איך זה עובד בפועל:

ארוך l1 = null; ארוך l2 = 128L; assertThatCode (() -> Objects.equals (l1, l2)). doesNotThrowAnyException ();

כפי שאנו רואים, איננו צריכים לטרוח אם כל אחד מה ארוךזה שאנחנו רוצים להשוות ריק.

מתחת למכסת המנוע, Objects.equals () ראשית משתמש באופרטור == לצורך ההשוואה, ואם זה נכשל הוא משתמש בתקן שווים().

5. ביטול איגרוף של ערכים ארוכים

5.1. משתמש ב .longValue () שיטה

לאחר מכן, בואו נשתמש באופרטור ההשוואה “==”, אך בצורה בטוחה. הכיתה מספר יש שיטה .longValue () אשר עוטף את הפרימיטיבי ארוך ערך:

ארוך l1 = 128L; ארוך l2 = 128L; assertThat (l1.longValue () == l2.longValue ()). isTrue ();

5.2. ליהוק לערכים פרימיטיביים

דרך אחרת לבטל את תיבת א ארוך הוא על ידי יציקת האובייקטים לסוגים פרימיטיביים. לכן, נחלץ את הערך הפרימיטיבי ואז נוכל להמשיך להשתמש במפעיל ההשוואה:

ארוך l1 = 128L; ארוך l2 = 128L; assertThat ((long) l1 == (long) l2) .isTrue ();

ציין זאת, בשביל ה .longValue () בשיטה או באמצעות יציקה, עלינו לבדוק אם האובייקט הוא ריק. יכול להיות שיש לנו NullPointerException אם האובייקט הוא ריק.

6. מסקנה

במדריך הקצר הזה, בדקנו אפשרויות שונות להשוואה ארוך חפצים. ניתחנו את ההבדלים כאשר משווים הפניות לאובייקטים או לתוכן.

כמו תמיד, קוד המקור המלא של המאמר זמין באתר GitHub.


$config[zx-auto] not found$config[zx-overlay] not found