Tôi hơi mở rộng câu trả lời được cung cấp (từ trước đến nay họ tập trung vào thuật ngữ "riêng" / nhân tạo của họ tập trung vào lập trình một ngôn ngữ cụ thể thay vì quan tâm đến bức tranh lớn hơn đằng sau bối cảnh tạo ra ngôn ngữ lập trình , nói chung là khi mọi thứ như sự cân nhắc về an toàn so với bộ nhớ tạo nên sự khác biệt):
int không phải là boolean
Xem xét
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);
với đầu ra
Bar is true
Bar is 1
Baz is 1
Baz is true
Mã Java trên dòng thứ 3 (bar)?1:0
minh họa rằng thanh ( boolean ) không thể được chuyển đổi hoàn toàn (được đúc) thành một int . Tôi đưa ra điều này không phải để minh họa các chi tiết triển khai đằng sau JVM, nhưng để chỉ ra rằng về mặt cân nhắc ở mức độ thấp (như kích thước bộ nhớ), người ta phải thích các giá trị hơn mức an toàn kiểu. Đặc biệt là nếu loại an toàn đó không thực sự / được sử dụng đầy đủ như trong các loại boolean nơi kiểm tra được thực hiện dưới dạng
if value \ in {0,1} thì chuyển sang kiểu boolean, nếu không thì ném ngoại lệ.
Tất cả chỉ để nói rằng {0,1} <{-2 ^ 31, .., 2 ^ 31 -1}. Có vẻ như quá mức, phải không? Loại an toàn là thực sự quan trọng trong các loại do người dùng xác định, không phải trong việc đúc nguyên thủy (mặc dù cuối cùng được bao gồm trong loại đầu tiên).
Byte không phải là loại hoặc bit
Lưu ý rằng trong bộ nhớ, biến của bạn trong phạm vi {0,1} sẽ vẫn chiếm ít nhất một byte hoặc một từ (xbits tùy thuộc vào kích thước của thanh ghi) trừ khi được chăm sóc đặc biệt (ví dụ: được đóng gói độc đáo trong bộ nhớ - 8 "boolean" bit thành 1 byte - qua lại).
Bằng cách ưu tiên an toàn loại (như đặt / gói giá trị vào hộp của một loại cụ thể) so với đóng gói giá trị bổ sung (ví dụ: sử dụng dịch chuyển bit hoặc số học), người ta thực sự chọn cách viết ít mã hơn để đạt được nhiều bộ nhớ hơn. (Mặt khác, người ta luôn có thể xác định loại người dùng tùy chỉnh sẽ tạo điều kiện cho tất cả các chuyển đổi không có giá trị hơn Boolean).
từ khóa so với loại
Cuối cùng, câu hỏi của bạn là về việc so sánh từ khóa với loại . Tôi tin rằng điều quan trọng là để giải thích lý do tại sao hoặc làm thế nào một cách chính xác, bạn sẽ có được hiệu suất bằng cách sử dụng / thích các từ khóa ( "đánh dấu" như nguyên thủy ) so với các loại (lớp do người dùng định nghĩa hợp bình thường sử dụng một từ khóa class ) hay nói cách khác
boolean foo = true;
so với
Boolean foo = true;
"Điều" đầu tiên (loại) không thể được mở rộng (phân lớp) và không phải không có lý do. Thuật ngữ Java hiệu quả của các lớp nguyên thủy và gói có thể được dịch đơn giản thành giá trị nội tuyến (LITITH hoặc hằng được thay thế trực tiếp bởi trình biên dịch bất cứ khi nào có thể suy ra thay thế hoặc nếu không - vẫn dự phòng để bọc giá trị).
Tối ưu hóa đạt được do tầm thường:
"Ít hoạt động đúc thời gian chạy => tốc độ nhanh hơn."
Đó là lý do tại sao khi suy luận kiểu thực tế được thực hiện, nó có thể (vẫn) kết thúc việc khởi tạo lớp gói với tất cả các thông tin loại nếu cần thiết (hoặc chuyển đổi / chuyển thành như vậy).
Vì vậy, sự khác biệt giữa boolean và Boolean chính xác là trong Compilation và Runtime (hơi xa nhưng gần như là thể hiện so với getClass () ).
Cuối cùng, autoboxing chậm hơn so với nguyên thủy
Lưu ý một thực tế rằng Java có thể làm autoboxing chỉ là một "cú pháp đường". Nó không tăng tốc bất cứ điều gì, chỉ cho phép bạn viết ít mã hơn. Đó là nó. Đúc và gói vào thùng chứa thông tin loại vẫn được thực hiện. Vì lý do hiệu suất, chọn arithologists sẽ luôn bỏ qua việc quản lý thêm việc tạo các thể hiện lớp với thông tin loại để thực hiện an toàn loại. Thiếu an toàn loại là giá bạn phải trả để đạt được hiệu suất. Đối với mã có an toàn loại biểu thức có giá trị boolean (khi bạn viết ít hơn và do đó mã ẩn ) sẽ rất quan trọng, ví dụ như đối với các điều khiển luồng if-then-other.