Почему массивы Java имеют фиксированную длину?

int[] array = new int[10]; // Length is fixed when the array is created.

Длина массива устанавливается при создании массива. После создания его длина фиксируется.

Почему так должно быть?


person Hicham Moustaid    schedule 07.03.2016    source источник
comment
потому что так задумано. Если вы хотите динамически изменять размер, используйте коллекцию.   -  person Stultuske    schedule 07.03.2016
comment
Это было разработано так ... хорошо, но почему?   -  person Hicham Moustaid    schedule 07.03.2016
comment
каково ваше собственное мнение о нем?   -  person Tyagi Akhilesh    schedule 07.03.2016
comment
@HichamMoustaid: если вы хотите узнать, почему, вам придется спросить тех, кто принял решение.   -  person Stultuske    schedule 07.03.2016
comment
@HitchamMoustaid, вы хотите принять ответ?   -  person SusanW    schedule 14.06.2016


Ответы (2)


Как отмечалось в других ответах, фиксированный размер является частью определения, и вам придется поговорить с первоначальными авторами, чтобы узнать правду.

Но, как правило, реализовать контейнер переменной длины значительно сложнее, и существует ряд стратегий для его достижения под капотом (связный список, перераспределение памяти...).

Если бы авторы определили массивы переменной длины еще в начале 1990-х годов, это привело бы к нескольким нежелательным последствиям:

  • базовое определение массивов JVM было бы гораздо более сложным, и все реализации были бы вынуждены обеспечивать эту сложность на низком уровне;
  • в данной JVM будет реализована «универсальная» реализация изменения размера, которая может не удовлетворить многие варианты использования;
  • разные реализации могут привести к большим различиям в производительности, что может потребовать дополнительного сложного определения ограничений;
  • он вводит проблемы безопасности потоков вокруг проверки границ массива, потому что a.length становится изменяемым;
  • дополнительная лингвистическая поддержка выражения расширения => более крупный язык;
  • влияние на производительность индексации массива, возможное отсутствие индексации O(1);
  • незнакомая территория для программистов на C и C++, привыкших к нерасширяемым массивам (или имеющим такие механизмы в библиотеках);
  • создание в камне механизма переменной длины, который уже адекватно обрабатывается структурами более высокого уровня (java.util.Vector раньше, а теперь Java Collections, Guava и т. д.).

Подводя итог, можно сказать, что массивы в семействе языков C, из которых родилась Java, в целом должны быть простыми инструментами для построения структур более высокого уровня - тогда не было ничего удивительного в ограничении фиксированного размера. Теперь у нас есть выбор реализаций таких структур (LinkedList, ArrayList и т. д.), которые обеспечивают выбор поведения во время выполнения, и большинство разработчиков используют эти абстракции.

person SusanW    schedule 07.03.2016

Это в определении Java arrays:

Массив — это объект-контейнер, который содержит фиксированное количество значений одного типа.

(см. здесь).

Используйте ArrayList для реализации массива переменного размера.

person Mena    schedule 07.03.2016