Ich erweitere die bereitgestellten Antworten ein wenig (da sie sich bisher auf ihre "eigene" / künstliche Terminologie konzentrieren und sich auf die Programmierung einer bestimmten Sprache konzentrieren, anstatt sich um das Gesamtbild hinter den Kulissen der Erstellung der Programmiersprachen im Allgemeinen zu kümmern , dh wenn es um Dinge geht wie Typensicherheit vs. Speicherüberlegungen machen den Unterschied):
int ist nicht boolesch
Erwägen
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);
mit Ausgabe
Bar is true
Bar is 1
Baz is 1
Baz is true
Java-Code in der 3. Zeile (bar)?1:0
zeigt, dass Balken ( Boolescher Wert ) nicht implizit in einen Int konvertiert (umgewandelt) werden können . Ich spreche dies nicht an, um die Details der Implementierung hinter JVM zu veranschaulichen, sondern um darauf hinzuweisen, dass man in Bezug auf Überlegungen auf niedriger Ebene (als Speichergröße) Werte der Typensicherheit vorziehen muss. Insbesondere, wenn diese Art von Sicherheit nicht wirklich / vollständig verwendet wird, wie bei booleschen Typen, bei denen Überprüfungen in Form von durchgeführt werden
Wenn der Wert \ in {0,1} ist, wird er in einen booleschen Typ umgewandelt, andernfalls wird eine Ausnahme ausgelöst.
Alles nur um zu sagen, dass {0,1} <{-2 ^ 31, .., 2 ^ 31 -1}. Scheint ein Overkill zu sein, oder? Die Typensicherheit ist bei benutzerdefinierten Typen wirklich wichtig, nicht beim impliziten Gießen von Grundelementen (obwohl die letzten im ersten enthalten sind).
Bytes sind keine Typen oder Bits
Beachten Sie, dass Ihre Variable aus dem Bereich von {0,1} im Speicher immer noch mindestens ein Byte oder ein Wort belegt (xbits abhängig von der Größe des Registers), sofern nicht speziell darauf geachtet wird (z. B. gut im Speicher verpackt - 8 "boolean"). Bits in 1 Byte - hin und her).
Indem man die Typensicherheit (wie beim Einfügen / Umschließen von Werten in eine Box eines bestimmten Typs) dem Packen von zusätzlichen Werten (z. B. durch Verwendung von Bitverschiebungen oder Arithmetik) vorzieht, entscheidet man sich effektiv dafür, weniger Code zu schreiben, anstatt mehr Speicher zu gewinnen. (Andererseits kann man immer einen benutzerdefinierten Benutzertyp definieren, der die gesamte Konvertierung erleichtert, die nicht wert ist als Boolean).
Schlüsselwort vs. Typ
Schließlich geht es bei Ihrer Frage um den Vergleich von Keyword und Typ . Ich glaube , dass es wichtig ist , zu erklären , warum oder wie genau werden Sie die Leistung erhalten , indem Sie / lieber Schlüsselwörter ( „markiert“ als primitive ) über Typen (normale Verbundbenutzerdefinierbare Klassen ein anderes Schlüsselwort Klasse ) oder in anderen Worten :
boolean foo = true;
vs.
Boolean foo = true;
Das erste "Ding" (Typ) kann nicht ohne Grund erweitert (Unterklasse) werden. Effektiv Java Terminologie von primitiven und Verpackungs Klassen kann einfach in übersetzt wird Inline - Wert (ein Literal oder eine Konstante, die durch die Compiler direkt ersetzt wird , wann immer es möglich ist , um die Substitution zu schließen , oder wenn nicht - nach wie vor Rückfall in den Wert Einwickeln).
Die Optimierung wird durch Trivialität erreicht:
"Weniger Laufzeit-Casting-Vorgänge => mehr Geschwindigkeit."
Das ist der Grund, warum die eigentliche Typinferenz (noch) dazu führen kann, dass die Wrapping-Klasse bei Bedarf mit allen Typinformationen instanziiert wird (oder in solche konvertiert / umgewandelt wird).
Also der Unterschied zwischen Boolean und Boolean liegt also genau in Compilation und Runtime (etwas weit fortgeschritten , aber fast als Instanz von vs. getClass () ).
Schließlich ist Autoboxing langsamer als Grundelemente
Beachten Sie die Tatsache, dass Java dies kann Autoboxing ausführen kann und nur ein "syntaktischer Zucker" ist. Es beschleunigt nichts, erlaubt Ihnen nur, weniger Code zu schreiben. Das ist es. Das Umwandeln und Umwickeln in einen Typinformationscontainer wird weiterhin durchgeführt. Wählen Sie aus Leistungsgründen Arithmetik, bei der die Erstellung von Klasseninstanzen mit Typinformationen zur Implementierung der Typensicherheit immer übersprungen wird. Mangelnde Typensicherheit ist der Preis, den Sie zahlen, um Leistung zu erzielen. Für Code mit Ausdrücken mit booleschem Wert ist die Typensicherheit (wenn Sie weniger und damit impliziten Code schreiben ) von entscheidender Bedeutung, z.