Membandingkan Nilai Panjang di Jawa

1. Gambaran keseluruhan

Dalam tutorial ringkas ini, kita akan membincangkan pelbagai cara untuk membandingkan dua contoh Long . Kami menekankan masalah yang timbul semasa menggunakan operator perbandingan rujukan ( == ).

2. Masalah Menggunakan Perbandingan Rujukan

Long adalah kelas pembungkus untuk jenis primitif panjang . Oleh kerana ia adalah objek dan bukan nilai primitif, kita perlu membandingkan kandungan contoh Long menggunakan .equals () dan bukannya operator perbandingan rujukan (==).

Dalam beberapa kes, kita mungkin mendapat idea bahawa == baik-baik saja, tetapi kelihatan menipu. Pertimbangkan bahawa kita dapat menggunakan == dengan bilangan yang rendah:

Long l1 = 127L; Long l2 = 127L; assertThat(l1 == l2).isTrue();

tetapi tidak dengan bilangan yang lebih besar. Kami akan mengalami masalah sekiranya nilai berada di luar lingkungan -128 hingga 127, mempunyai hasil yang sama sekali berbeza dan tidak dijangka:

Long l1 = 128L; Long l2 = 128L; assertThat(l1 == l2).isFalse();

Ini kerana Java mengekalkan kumpulan tetap untuk kejadian Long antara -128 dan 127.

Walau bagaimanapun, pengoptimuman ini tidak memberi kita lesen untuk menggunakan ==. Dalam kes umum, dua kotak yang mempunyai nilai primitif yang sama tidak menghasilkan rujukan objek yang sama.

3. Menggunakan. Sama ()

Salah satu penyelesaiannya adalah dengan menggunakan .equals () . Ini akan menilai kandungan (dan bukan rujukan) kedua-dua objek:

Long l1 = 128L; Long l2 = 128L; assertThat(l1.equals(l2)).isTrue();

4. Objek . Sama ()

Masalah dengan menggunakan sama () adalah kita perlu berhati-hati untuk tidak menyebutnya pada rujukan nol .

Nasib baik, ada kaedah utiliti selamat- nol yang boleh kita gunakan - Objects.equals ().

Mari lihat bagaimana ia berfungsi dalam praktik:

Long l1 = null; Long l2 = 128L; assertThatCode(() -> Objects.equals(l1, l2)).doesNotThrowAnyException();

Seperti yang kita lihat, kita tidak perlu bersusah payah jika ada Long yang ingin kita bandingkan adalah nol.

Di bawah tudung, Objects.equals () pertama kali menggunakan operator == untuk perbandingan, dan jika gagal, ia menggunakan standard sama dengan ().

5. Membuka Kotak Panjang Nilai

5.1. Menggunakan .longValue () Menghubungi

Seterusnya, mari gunakan pengendali perbandingan “==”, tetapi dengan cara yang selamat. Nombor kelas mempunyai kaedah .longValue () yang membuka nilai panjang primitif :

Long l1 = 128L; Long l2 = 128L; assertThat(l1.longValue() == l2.longValue()).isTrue();

5.2. Menghantar Nilai Primitif

Cara lain untuk membuka kotak Long adalah dengan memasukkan objek ke jenis primitif. Oleh itu, kami akan mengekstrak nilai primitif dan kemudian kami dapat menggunakan operator perbandingan:

Long l1 = 128L; Long l2 = 128L; assertThat((long) l1 == (long) l2).isTrue();

Perhatikan bahawa, untuk kaedah .longValue () atau menggunakan casting, kita harus memeriksa apakah objek itu kosong . Kita boleh mempunyai NullPointerException jika objek itu kosong .

6. Kesimpulannya

Dalam tutorial ringkas ini, kami telah meneroka pelbagai pilihan mengenai cara membandingkan objek Panjang . Kami telah menganalisis perbezaan ketika membandingkan rujukan ke objek atau kandungan.

Seperti biasa, kod sumber penuh artikel terdapat di GitHub.