Saya 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
boolean bar = true;
System.out.printf("Bar is %b\n", bar);
System.out.printf("Bar is %d\n", (bar)?1:0);
int baz = 1;
System.out.printf("Baz is %d\n", baz);
System.out.printf("Baz is %b\n", baz);
dengan output
Bar is true
Bar is 1
Baz is 1
Baz is true
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 bentuk
jika nilai \ dalam {0,1} kemudian dilemparkan ke tipe boolean, jika tidak lempar pengecualian.
Semua 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
boolean foo = true;
vs.
Boolean foo = true;
"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:
"Lebih sedikit operasi pengecoran runtime => lebih banyak kecepatan."
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.