Ada diskusi sekitar Integer
vs int
di Jawa. Nilai default dari yang pertama adalah null
sementara yang kedua itu 0
. Bagaimana dengan Boolean
vs boolean
?
Variabel dalam aplikasi saya dapat memiliki 0
/ 1
nilai. Saya ingin menggunakan boolean
/ Boolean
dan memilih untuk tidak menggunakan int
. Bisakah saya menggunakan Boolean
/ boolean
sebagai gantinya?
Jawaban:
Ya, Anda bisa menggunakan
Boolean
/boolean
sebagai gantinya.Yang pertama adalah Obyek dan yang kedua adalah tipe primitif.
Yang pertama, Anda akan mendapatkan lebih banyak metode yang akan berguna.
Yang kedua murah mengingat biaya memori Yang kedua akan menghemat lebih banyak memori, jadi lakukan saja
Sekarang pilih jalanmu.
sumber
AsyncTask
, Anda hanya bisa menggunakanBoolean
sajaboolean
.true
,false
dan dinull
mana boolean memiliki 2 status logis (true
danfalse
)Boolean
membungkus tipe primitif boolean. Di JDK 5 dan ke atas, Oracle (atau Sun sebelum Oracle membelinya) memperkenalkan autoboxing / unboxing , yang pada dasarnya memungkinkan Anda untuk melakukan iniatau
Yang pada dasarnya adalah kompiler,
Jadi, untuk jawaban Anda, itu YA.
sumber
Boolean
aboolean
. Jika AndaBoolean
yaitunull
dan Anda mencoba untuk menetapkan keboolean
, itu akan melemparNullPointerException
pada saat runtime.Boolean
suatu kelas lalu mengapa nilainya selalu salah bahkan jika saya mengubah nilai dari kelas lain yang merujuk ke variabel Boolean yang sama? apa gunanya iniBoolean
jika kita tidak dapat merujuk dari berbagai instance instance / pass sebagai argumen?AtomicBoolean
danSaya sedikit memperluas jawaban yang diberikan (karena sejauh ini mereka berkonsentrasi pada terminologi "sendiri" / buatan mereka yang berfokus pada pemrograman bahasa tertentu alih-alih menjaga gambaran yang lebih besar di belakang layar menciptakan bahasa pemrograman , secara umum, yaitu ketika hal-hal seperti pertimbangan keamanan-jenis vs memori membuat perbedaan):
int bukan boolean
Mempertimbangkan
dengan output
Kode Java pada baris ke-3
(bar)?1:0
menggambarkan bahwa bilah ( boolean ) tidak dapat secara implisit dikonversi (dicor) menjadi int . Saya membahas hal ini bukan untuk menggambarkan detail implementasi di belakang JVM, tetapi untuk menunjukkan bahwa dalam hal pertimbangan tingkat rendah (karena ukuran memori) kita harus lebih memilih nilai daripada keamanan jenis. Terutama jika jenis keamanan itu tidak benar-benar / sepenuhnya digunakan seperti dalam jenis boolean di mana pemeriksaan dilakukan dalam bentukSemua menyatakan bahwa {0,1} <{-2 ^ 31, .., 2 ^ 31 -1}. Sepertinya berlebihan, kan? Keamanan jenis benar-benar penting dalam tipe yang ditentukan pengguna, bukan dalam casting primitif secara implisit (meskipun yang terakhir termasuk dalam yang pertama).
Bytes bukan tipe atau bit
Perhatikan bahwa dalam memori variabel Anda dari kisaran {0,1} masih akan menempati setidaknya satu byte atau kata (xbits tergantung pada ukuran register) kecuali diurus secara khusus (misalnya dikemas dengan baik dalam memori - 8 "boolean" bit menjadi 1 byte - maju dan mundur).
Dengan lebih memilih keamanan jenis (seperti dalam memasukkan / membungkus nilai ke dalam kotak dari jenis tertentu) daripada pengemasan nilai tambahan (misalnya menggunakan bit shift atau aritmatika), orang tidak secara efektif memilih menulis lebih sedikit kode daripada mendapatkan lebih banyak memori. (Di sisi lain, orang selalu dapat menentukan jenis pengguna khusus yang akan memfasilitasi semua konversi yang tidak bernilai daripada Boolean).
kata kunci vs. jenis
Terakhir, pertanyaan Anda adalah tentang membandingkan kata kunci vs. jenis . Saya percaya penting untuk menjelaskan mengapa atau bagaimana tepatnya Anda akan mendapatkan kinerja dengan menggunakan / lebih suka kata kunci ("ditandai" sebagai primitif ) daripada tipe (kelas komposit yang dapat ditentukan pengguna normal menggunakan kelas kata kunci lain ) atau dengan kata lain
vs.
"Benda" pertama (tipe) tidak dapat diperpanjang (subklas) dan bukan tanpa alasan. Terminologi Java yang efektif dari kelas-kelas primitif dan pembungkus dapat dengan mudah diterjemahkan ke dalam nilai inline (suatu LITERAL atau sebuah konstanta yang secara langsung diganti oleh kompiler setiap kali dimungkinkan untuk menyimpulkan substitusi atau jika tidak - masih mundur ke dalam pembungkus nilai).
Optimalisasi tercapai karena sepele:
Itulah sebabnya ketika inferensi tipe aktual dilakukan, ia mungkin (masih) berakhir di instantiating kelas pembungkus dengan semua informasi tipe jika perlu (atau mengubah / casting ke dalamnya).
Jadi, perbedaan antara boolean dan Boolean adalah persis di Kompilasi dan Runtime (agak jauh akan tetapi hampir sama instanceof vs getClass () ).
Akhirnya, autoboxing lebih lambat daripada primitif
Perhatikan fakta bahwa Java dapat melakukan autoboxing hanyalah "gula sintaksis". Itu tidak mempercepat apa pun, hanya memungkinkan Anda untuk menulis lebih sedikit kode. Itu dia. Pengecoran dan pembungkus ke dalam wadah informasi tipe masih dilakukan. Untuk alasan kinerja pilihlah aritmatika yang akan selalu melewatkan perawatan ekstra untuk membuat instance kelas dengan informasi tipe untuk mengimplementasikan keselamatan tipe. Kurangnya keamanan jenis adalah harga yang Anda bayar untuk mendapatkan kinerja. Untuk kode dengan ekspresi tipe keselamatan bernilai boolean (ketika Anda menulis lebih sedikit dan karenanya kode implisit ) akan sangat penting misalnya untuk kontrol aliran if-then-else.
sumber
Anda dapat menggunakan konstanta Boolean -
Boolean.TRUE
danBoolean.FALSE
bukannya0
dan1
. Anda dapat membuat variabel sebagai tipeboolean
jika primitif adalah yang Anda cari. Dengan cara ini Anda tidak perlu membuatBoolean
objek baru .sumber
Pada dasarnya boolean mewakili tipe data primitif di mana Boolean mewakili tipe data referensi. cerita ini dimulai ketika Java ingin menjadi murni berorientasi objek itu disediakan konsep kelas pembungkus untuk datang menggunakan tipe data primitif.
b1
danb2
tidak sama.sumber
Satu pengamatan: (meskipun ini bisa dianggap efek samping)
boolean menjadi primitif dapat mengatakan ya atau tidak.
Boolean adalah objek (bisa merujuk pada ya atau tidak atau 'tidak tahu' yaitu nol)
sumber
Anda bisa menggunakan Boolean / boolean. Kesederhanaan adalah caranya. Jika Anda tidak memerlukan api spesifik (Koleksi, Aliran, dll.) Dan Anda tidak memperkirakan bahwa Anda akan membutuhkannya - gunakan versi primitifnya (boolean).
Dengan primitif Anda menjamin bahwa Anda tidak akan melewati nilai nol.
Anda tidak akan jatuh dalam perangkap seperti ini. Kode di bawah ini melempar NullPointerException (dari: Booleans, operator kondisional, dan autoboxing ):
public static void main(String[] args) throws Exception { Boolean b = true ? returnsNull() : false; // NPE on this line. System.out.println(b); } public static Boolean returnsNull() { return null; }
Gunakan Boolean saat Anda membutuhkan objek, misalnya:
sumber