Jenis Primitif lwn. Jenis Primitif Berbungkus
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
Contoh Bermasalah:
Comparator<Integer> naturalOrder = (i, j) -> (i < j) ? -1 : (i == j ? 0 : 1);
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;
Atau, membetulkan pembanding asal:
Comparator<Integer> naturalOrder = (iBoxed, jBoxed) -> { int i = iBoxed; int j = jBoxed; return (i < j) ? -1 : ((i == j) ? 0 : 1); };
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"); }
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"); }
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);
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);
Bila Menggunakan Jenis Berbungkus
Amalan Baik
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!