Rumah > Java > javaTutorial > teks badan

Item Mengutamakan jenis primitif daripada jenis primitif yang dibungkus

Patricia Arquette
Lepaskan: 2024-10-10 08:09:02
asal
495 orang telah melayarinya

Item  Dê preferência aos tipos primitivos em vez dos tipos primitivos empacotados

Jenis Primitif lwn. Jenis Primitif Berbungkus

  • Jenis Primitif: int, double, boolean, dll.
  • Jenis Primitif Berbungkus: Integer, Double, Boolean, dll.
  • Java mempunyai sistem jenis berganda: jenis primitif dan jenis rujukan (objek).
  • Setiap jenis primitif mempunyai kelas pembalut yang sepadan.

Perbezaan Utama

  • Identiti lwn. Nilai:
    Primitif: Mereka tidak mempunyai identiti; dua primitif dengan nilai yang sama sentiasa sama.
    Berbungkus: Ia adalah objek dan mempunyai identiti; dua objek boleh mempunyai nilai yang sama tetapi identiti berbeza.

  • Nilai Nol:
    Primitif: Sentiasa mempunyai nilai lalai (mis. 0 untuk int).
    Berbungkus: Mungkin batal, yang boleh membawa kepada pengecualian NullPointerException jika tidak dikendalikan dengan betul.

  • Prestasi:
    Primitif: Lebih cekap dari segi masa dan ruang.
    Berbungkus: Perkenalkan overhed kerana penciptaan objek tambahan.

Masalah Biasa Apabila Mencampurkan Primitif dan Pakej

  • 1. Perbandingan Identiti Daripada Nilai
  • Apabila membandingkan objek yang dibungkus menggunakan ==, anda sedang membandingkan rujukan objek, bukan nilainya. Ini boleh membawa kepada hasil yang tidak dijangka.

Contoh Bermasalah:

Comparator<Integer> naturalOrder = (i, j) -> (i < j) ? -1 : (i == j ? 0 : 1);

Salin selepas log masuk

Masalah: Perbandingan i == j membandingkan rujukan, bukan nilai.
Kelakuan Salah: naturalOrder.compare(new Integer(42), new Integer(42)) mengembalikan 1 dan bukannya 0.

Penyelesaian:
Gunakan kaedah compareTo atau kaedah utiliti kelas Integer.

Comparator<Integer> naturalOrder = Integer::compare;

Salin selepas log masuk

Atau, membetulkan pembanding asal:

Comparator<Integer> naturalOrder = (iBoxed, jBoxed) -> {
    int i = iBoxed;
    int j = jBoxed;
    return (i < j) ? -1 : ((i == j) ? 0 : 1);
};

Salin selepas log masuk

2. Autounboxing dan NullPointerException
Apabila menggunakan jenis pembungkusan yang boleh menjadi nol, autounboxing mungkin memberikan pengecualian jika objek itu adalah null.

Contoh Bermasalah:

Integer i = null;
if (i == 42) {
    System.out.println("Inacreditável");
}

Salin selepas log masuk

Masalah: i adalah batal; apabila membandingkan dengan 42, autounboxing nol berlaku, menghasilkan NullPointerException.
Penyelesaian: Gunakan jenis primitif apabila boleh.

int i = 0;
if (i == 42) {
    System.out.println("Inacreditável");
}

Salin selepas log masuk

3. Prestasi Merosot kerana Autoboxing/Unboxing
Penggunaan jenis berbalut secara tidak sengaja dalam operasi intensif boleh menyebabkan kemerosotan prestasi disebabkan oleh autoboxing dan penciptaan objek yang tidak perlu.

Contoh Bermasalah:

Long sum = 0L;
for (long i = 0; i <= Integer.MAX_VALUE; i++) {
    sum += i;
}
System.out.println(sum);

Salin selepas log masuk

Masalah: jumlah adalah Panjang yang dibungkus; dalam setiap lelaran, autoboxing/unboxing berlaku.

Kesan: Kod yang jauh lebih perlahan dan penggunaan memori yang berlebihan.
Penyelesaian:
Gunakan jenis primitif untuk pembolehubah tempatan dalam operasi intensif.

long sum = 0L;
for (long i = 0; i <= Integer.MAX_VALUE; i++) {
    sum += i;
}
System.out.println(sum);

Salin selepas log masuk

Bila Menggunakan Jenis Berbungkus

  • Koleksi: Anda tidak boleh menggunakan jenis primitif dalam koleksi generik (cth. Senarai).
  • Parameter Generik: Jenis generik tidak menyokong jenis primitif (cth. ThreadLocal).
  • API yang Memerlukan Objek: API tertentu memerlukan objek dan bukannya jenis primitif.

Amalan Baik

  • Pilih Jenis Primitif: Apabila boleh, gunakan jenis primitif untuk kesederhanaan dan kecekapan.
  • Berhati-hati dengan Autoboxing/Unboxing: Autoboxing mengurangkan verbositi tetapi boleh menimbulkan ralat halus.
  • Elakkan Perbandingan dengan == dalam Dibalut: Gunakan kaedah seperti equals() atau bandingkan nilai yang tidak dibalut.
  • Semak untuk Null: Apabila menggunakan jenis berpakej, ambil perhatian bahawa ia boleh menjadi batal dan menyebabkan NullPointerException.

Ringkasan
Jenis Primitif:
Lebih ringkas dan pantas.
Mereka tidak boleh batal.
Mereka tidak mempunyai identiti (hanya nilai).

Jenis Pembungkusan:
Diperlukan untuk digunakan dalam koleksi dan API generik.
Mereka boleh jadi batal.
Mereka mempunyai identiti objek.

Atas ialah kandungan terperinci Item Mengutamakan jenis primitif daripada jenis primitif yang dibungkus. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan