Почему максимальная емкость Java HashMap 1 < 30, а не 1 < 31, даже если максимальное значение int равно 2 31 -1? Максимальная емкость инициализируется как static final int MAXIMUM_CAPACITY = 1 << 30;
Почему максимальная емкость Java HashMap 1 << 30, а не 1 << 31?
Ответ 1
Java использует знаковые целые числа, что означает, что первый бит используется для хранения знака числа (положительный/отрицательный).
Четырехбайтовое целое имеет 32 бита, в которых числовая часть может охватывать только 31 бит из-за бит-подписи. Это ограничивает диапазон числа 2 ^ 31 - 1 (из-за включения 0) в - (2 ^ 31).
Ответ 2
Хотя хэш-карта могла обрабатывать количество элементов между 2 ^ 30 и 2 ^ 31-1 без использования больших целых типов, написание кода, который работает корректно даже вблизи верхних пределов языка целочисленных типов трудно. Кроме того, на языке, который рассматривает целые числа как абстрактное алгебраическое кольцо, которое "обертывает" на переполнение, а не как числа, которые должны либо давать результаты с числовыми результатами, либо бросать исключения, когда они не могут этого сделать, может быть трудно гарантировать, что 't любые случаи, когда переполнение приведет к тому, что недопустимые операции будут удалены.
Указание верхнего предела 2 ^ 30 или даже 2 ^ 29 и обеспечение правильного поведения при вещах, не превышающих этого, часто намного проще, чем пытаться обеспечить правильное поведение вплоть до 2 ^ 31-1. Отсутствие особой причины выжать каждый последний бит диапазона, как правило, лучше использовать более простой подход.
Ответ 3
По умолчанию тип данных int
представляет собой 32-битное подписанное двухкомпонентное целое число, которое имеет минимальное значение -2^31
и максимальное значение (2^31)-1
, варьируется от -2147,483,648 до 2,147,483,647.
Первый бит зарезервирован для бита знака - он равен 1, если число отрицательное, а 0 - положительное.
1 << 30
равен 1 073 741 824
это двухкомпонентное двоичное целое число: 01000000-00000000-00000000-00000000.
1 << 31
равно -2,147,483,648.
это двухкомпонентное двоичное целое - 10000000-000000000000000000000000.
В нем указано, что максимальный размер, на который может распространяться хэш-карта, составляет 1 073 741 824 = 2 ^ 30.
Ответ 4
Вы думаете о беззнаке, с подписанным верхним диапазоном (2 ^ 31) -1