Membandingkan Nilai-Nilai Panjang di Jawa

1. Ikhtisar

Dalam tutorial singkat ini, kita akan membahas berbagai cara untuk membandingkan dua contoh Long . Kami menekankan masalah yang muncul saat menggunakan operator perbandingan referensi ( == ).

2. Masalah Menggunakan Perbandingan Referensi

Long adalah kelas pembungkus untuk tipe primitif long . Karena mereka adalah objek dan bukan nilai primitif, kita perlu membandingkan konten instance Long menggunakan .equals () daripada operator perbandingan referensi (==).

Dalam beberapa kasus, kita mungkin mendapatkan ide bahwa == tidak apa-apa, tetapi penampilan menipu. Pertimbangkan bahwa kita dapat menggunakan == dengan angka rendah:

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

tapi tidak dengan jumlah yang lebih besar. Kami akan mengalami masalah jika nilainya berada di luar kisaran -128 hingga 127, memiliki hasil yang sama sekali berbeda dan tidak terduga:

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

Ini karena Java mempertahankan kumpulan konstan untuk instance Long antara -128 dan 127.

Namun, pengoptimalan ini tidak memberi kami lisensi untuk menggunakan ==. Dalam kasus umum, dua contoh kotak yang memiliki nilai primitif yang sama tidak menghasilkan referensi objek yang sama.

3. Menggunakan .equals ()

Salah satu solusinya adalah dengan menggunakan .equals () . Ini akan mengevaluasi konten (dan bukan referensi) dari kedua objek:

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

4. Objects.equals ()

Masalah dengan menggunakan equals () adalah kita perlu berhati-hati untuk tidak memanggilnya pada referensi null .

Untungnya, ada metode utilitas null -safe yang bisa kita gunakan - Objects.equals ().

Mari kita lihat cara kerjanya dalam praktik:

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

Seperti yang bisa kita lihat, kita tidak perlu repot jika ada Long yang ingin kita bandingkan adalah null.

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

5. Nilai Panjang Unboxing

5.1. Menggunakan Metode .longValue ()

Selanjutnya, mari gunakan operator perbandingan “==”, tetapi dengan cara yang aman. Nomor kelas memiliki metode .longValue () yang membuka bungkus nilai panjang primitif :

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

5.2. Mentransmisikan ke Nilai Primitif

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

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

Perhatikan bahwa, untuk metode .longValue () atau menggunakan casting, kita harus memeriksa apakah objeknya null . Kita bisa memiliki NullPointerException jika objeknya null .

6. Kesimpulan

Dalam tutorial singkat ini, kami telah menjelajahi berbagai opsi tentang cara membandingkan objek Panjang . Kami telah menganalisis perbedaan saat membandingkan referensi ke objek atau konten.

Seperti biasa, kode sumber lengkap artikel tersedia di GitHub.