2014-02-07 25 views
12

Warum ist die maximale Kapazität eines Java HashMap 31 < < 30 und nicht 1 < < 31, obwohl der maximale Wert eines int ist 2 -1? Die maximale Kapazität wird initialisiert als static final int MAXIMUM_CAPACITY = 1 << 30;Warum ist die maximale Kapazität einer Java HashMap 1 << 30 und nicht 1 << 31?

+2

Signed Integer hat einen Bereich von ** 2^31-1 ** bis ** - (2^31) **. Denken Sie daran, dass ein Bit für das Zeichen reserviert ist. – initramfs

+0

Antworten perfekt, danke – tesnik03

+0

Neben, 2 ** 31 ist 2 Milliarden, und jeder Hash-Eintrag erfordert ein Objekt für den Eintrag selbst, ein Objekt für den Schlüssel und ein Objekt für den Wert.Die minimale Objektgröße beträgt in der Regel etwa 24 Byte, also 144 Milliarden Byte, bevor Sie Speicherplatz für alles andere in der Anwendung reservieren. Es ist sicher zu sagen, dass das MAXIMUM_CAPACITY-Limit nur theoretisch ist. –

Antwort

11

Java verwendet vorzeichenbehaftete Ganzzahlen, was bedeutet, dass das erste Bit zum Speichern des Vorzeichens der Zahl (positiv/negativ) verwendet wird.

Eine 4-Byte-Ganzzahl hat 32 Bits, in denen der numerische Teil aufgrund des Signierbits nur 31 Bits umfassen kann. Dies begrenzt den Bereich der Anzahl auf 2^31 - 1 (aufgrund der Einbeziehung von 0) auf - (2^31).

0

Sie von unsigned denken, mit unterzeichnet oberen Bereich (2^31) -1

4

Während es möglich wäre für eine Hash-Karte Artikelmengen zu handhaben zwischen 2^30 und 2^31-1 Ohne größere Integer-Typen zu verwenden, ist es schwierig, Code zu schreiben, der sogar in der Nähe der Obergrenzen der Integer-Typen einer Sprache korrekt funktioniert. In einer Sprache, die ganze Zahlen als einen abstrakten algebraischen Ring behandelt, der den Überlauf "umschließt", und nicht als Zahlen, die entweder numerisch korrekte Ergebnisse liefern oder Ausnahmen auslösen sollten, kann es schwierig sein, sicherzustellen, dass es aren gibt In allen Fällen, in denen Überläufe dazu führen, dass ungültige Vorgänge unerkannt bleiben.

Die Angabe einer Obergrenze von 2^30 oder sogar 2^29 und die Sicherstellung eines korrekten Verhaltens bei Dingen, die nicht größer sind, ist oft viel einfacher als der Versuch, das korrekte Verhalten bis zu 2^31-1 zu gewährleisten. Da es keinen besonderen Grund gibt, jedes kleinste Stück Bandbreite auszuquetschen, ist es im Allgemeinen besser, den einfacheren Ansatz zu verwenden.

3

Standardmäßig wird der int Datentyp ist eine 32-Bit-Zweierkomplement-Ganzzahl-Komplement signierten, die einen Minimalwert von -2^31 und einen Maximalwert von (2^31)-1 hat, reicht von -2.147.483.648 bis 2.147.483.647.

Das erste Bit ist für das Vorzeichenbit reserviert - es ist 1 wenn die Zahl negativ ist und 0 wenn es positiv ist.

1 << 30 gleich 1,073,741,824
es Zweier-Komplement-Binär-Ganzzahl 01000000-00000000-00000000-00000000 ist.

1 << 31 gleich -2.147.483.648.
es ist Zweierkomplement binäre Ganzzahl ist 10000000-00000000-00000000-00000000.

Es besagt, dass die maximale Größe, auf die Hash-Karte erweitert werden kann, 1.073.741.824 = 2^30 ist.

Verwandte Themen