Подтвердить что ты не робот

Почему коллекции в java имеют индекс int?

ArrayList(int initialCapacity)

и другие коллекции в java работают с индексом int.

Не может быть случаев, когда int недостаточно, и может потребоваться больше диапазон int?

UPDATE:  Для Java 10 или какой-либо другой версии для этого потребуется разработать новую структуру Collection. Поскольку использование long с текущими коллекциями будет разорвать обратную совместимость. Не правда ли?

4b9b3361

Ответ 1

Теоретически может существовать, но в настоящее время такие большие массивы (массивы с индексами вне диапазона целого числа) не поддерживаются JVM, и поэтому ArrayList также не поддерживает это.

Есть ли необходимость в этом? Это не является частью вопроса per se, но, похоже, очень много, поэтому я буду обращаться к нему в любом случае. Короткий ответ в большинстве ситуаций - нет, но в некоторых - да. Верхнее значение int в Java составляет 2,147,483,647, чуть более 2 миллиардов. Если бы это был массив байтов, о котором мы говорили, это ограничивает верхний предел чуть более 2 ГБ по количеству байтов, которые мы можем хранить в массиве. Назад, когда была задумана Java, и для типичной машины не было ненужной памяти в тысячу раз меньше, чем это, это явно не было проблемой - но теперь даже машина с низким уровнем (настольная/переносная) имеет больше чем это, не говоря уже о большом сервере, так ясно, что это уже не ограничение, которое никто никогда не сможет достичь. (Да, мы могли бы упаковать байты в объект-оболочку и создать массив из них, но это не та точка, к которой мы обращаемся здесь.) Если мы переключимся на тип данных long, то это подталкивает верхний предел байт-массива до 9,2 эксабайт (более 9 млрд. ГБ). Это ставит нас твердо в "нам не нужно разумно беспокоиться об этом пределе", по крайней мере в обозримом будущем.

Итак, является ли это изменение Java? Один из планов Java 10 состоит в том, чтобы решить "большие данные", которые могут включать поддержку массивов с индексами long. Очевидно, это далеко, но Oracle, по крайней мере, думает об этом:

В таблице для JDK 9 показан переход на гипервизор Java Virtual Machine (JVM), а также на повышение его производительности, в то время как JDK 10 может перемещаться с 32-разрядных до 64-разрядных адресных массивов для больших данных множества.

Теоретически вы можете обойти это ограничение, используя свои собственные классы коллекций, которые использовали несколько массивов для хранения своих данных, тем самым минуя неявный предел int - так что это несколько возможно, если вам действительно нужна эта функциональность сейчас, просто в настоящее время довольно беспорядочно.

Что касается обратной совместимости, если эта функция входит? Ну, вы, очевидно, не могли просто изменить все int на long s, там должно быть еще несколько шаблонов и, в зависимости от вариантов реализации, возможно, даже новых типов коллекций для этих больших коллекций (учитывая, d найти свой путь в большинстве Java-кода, это может быть лучшим вариантом.) Независимо от того, что, несмотря на то, что обратная совместимость, разумеется, вызывает озабоченность, существует множество возможных способов обойти это, чтобы это не показательная пробка протяженность воображения.

Ответ 2

Фактически вы правы. Коллекции, такие как списки массивов, поддерживают только значения int на данный момент, но если вы хотите обойти это ограничение, вы можете использовать Карты и наборы, где ключ может быть любым, что вы хотите, и, таким образом, вы можете иметь столько записей, сколько хотите. Но я лично считаю, что значений int достаточно для таких структур, как массивы, но если бы я хотел получить больше, я думаю, что я бы использовал таблицу Derby, база данных станет более полезной в таких случаях.