Динамические массивы в JDK8

1

Я просто начал общаться с Java, как бывший программист C/C++. Я заинтригован тем, как массивы объявлены в JDK8. Я следую книге, в которой говорится, что я объявляю массив как объект следующим.

    int[] exampleArray = new int[10];

Я полностью согласен с использованием массива как объекта. Но на моей IDE (Netbeans 8) я получаю уведомление, в котором говорится, что "массив полей полей может быть окончательным". Когда я удаляю new int[10] я получаю нормальную компиляцию и никаких уведомлений. Означает ли это, что массивы в JDK динамически распределяются? Я еще не пытался перебирать массив.

Из того, что я нашел в Google, я думаю, что массивы реализованы как связанные списки правильно?

Если нет, сообщите, пожалуйста, правильное использование массивов на Java.

благодаря

  • 2
    Я думаю, что ты ... перепутал здесь. Уведомление, поступающее от Netbeans, предполагает, что оно может быть объявлено окончательным, что не зависит от используемой вами версии Java. В дополнение к этому, способ объявления и создания экземпляра массива, как правило, заключается в вызове new .
  • 0
    о, я вижу, так что нет динамически распределенных массивов?
Показать ещё 5 комментариев
Теги:
arrays
java-8
netbeans-8

2 ответа

5
Лучший ответ

О массивах

Из спецификации языка Java (версия 8), стр. 329:

На языке программирования Java массивы являются объектами (§4.3.1), динамически создаются и могут быть назначены переменным типа Object (§ 4.3.3). Все методы класса Object могут быть вызваны в массиве.

Ключ здесь - Object. Поэтому переменная exampleArray потенциально может быть null. Публичные методы (не считая public static void main), которые принимают массивы и varargs (также известный как "параметр переменной exampleArray.length в массив по времени выполнения), поскольку параметры не могут быть уверены, что всегда безопасно вызывать exampleArray.length например (потому что для вас может быть брошено NullPointerException). Кроме того, для каждого типа (класса и интерфейса), который вы пишете, будет создан соответствующий объект класса для представления массива (например, Foo[].class и Bar[].class).

Как будет реализован массив, над спецификацией и JLS (спецификация языка Java) не будет устранять эту проблему, по крайней мере, то, что я мог бы найти, после того, как вы выкапывали немного.

Кроме того, при назначении массива переменной вы можете использовать сокращенную строку:

int[] exampleArray = { 1, 2, 3 };

Знайте, что место, где вы кладете свои скобки, не имеет значения. Например, вот несколько способов объявить двухмерный массив:

int[][] multi = {{}};

int[] multi[];

int multi[][];

Как вы уже привыкли, первый пример является самым популярным, а JLS (спецификация языка Java) явно указывает на смешанную нотацию (стр. 332).

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

Конечные переменные

final ключевое слово имеет несколько разных значений, зависящих от того, как вы его используете, в каком контексте. Прежде всего, константы существуют только как литералы исходного кода на многих языках. Последнее поле в Java может быть изменено, если вы используете низкоуровневый API, так как константные указатели могут быть введены в C++ для не-константных указателей. Но, объявив переменную в Java как final она сообщит компилятору и большую часть времени выполнения, что эта переменная будет записана только один раз. То, как я это вижу, используя последнее ключевое слово в Java, имеет три причины.

  1. Ваш исходный код читается лучше. Вы сразу же будете "гарантированы" как читатель исходного кода, который переменная.. будет записана только один раз. Если он появляется как локальная переменная в методе, то он, скорее всего, инициализируется слишком прямо на месте, и вы можете легко почувствовать, что переменная больше не изменит значение. Если вы видите статическое поле или поле экземпляра, помеченное как final, вы можете быть уверены, что поле будет явно инициализировано программистом где-то прежде, чем объект будет полностью сконструирован (скорее всего, в конструкторе).

  2. Помещение финала перед переменной приведет к значительному сокращению времени кодирования путем кэширования ошибок программиста. Скажем, например, что у вас есть пять миллионов случаев в инструкции switch, что каждый из них даст определенное значение уже объявленной неизменной переменной и которая должна быть возвращена вызывающему абоненту через некоторое время после переключения. Если вы забыли break любом месте, ваш код все еще компилируется. Но если вы указали переменную как окончательную, весь экран будет мгновенно красным, и компилятор поймает этот случай после случая, который не затормозил, и зажег тот факт, что он просто попытался переназначить новое значение для вашего драгоценного поле.

  3. Среда выполнения может сделать некоторые интересные оптимизации, основанные на том, что переменная не должна изменяться. Например, все конечные примитивы автоматически поточно защищены.

1

Да, массивы динамически распределяются на Java. Попробуйте следующий код:

int size = new Scanner(System.in).nextInt();
int[] exampleArray = new int[size];
System.out.println(exampleArray.length);

Кроме того, я согласен с замечанием Макото, что предложение IDE может ввести в заблуждение

  • 0
    Отличный ответ. Спасибо за помощь! Это определенно динамически распределенный массив.
  • 0
    int exampleArray = new int[size] не компилируется.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню