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

Использование 'new' для массивов в Java

Я занимаюсь некоторыми базовыми учебниками. Один из них попросил меня создать массив для хранения следующих строковых значений:

Beyonce (f)
David Bowie (m)
Elvis Costello (m)
Madonna (f)
Elton John (m)
Charles Aznavour (m)

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

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

Шахта выглядит следующим образом:

String names[] = {"Beyonce (f)", "David Bowie (m)", "Elvis Costello (m)", "Madonna (f)", "Elton John (m)", "Charles Aznavour (m)"};

И предоставленный ответ таков:

String[] singers = new String[6];
singers[0] = "Beyonce (f)";
singers[1] = "David Bowie (m)";
singers[2] = "Elvis Costello (m)";
singers[3] = "Madonna (f)";
singers[4] = "Elton John (m)";
singers[5] = "Charles Aznavour (m)";

Должен ли я создавать "новый" массив? Если да, то почему? И в чем разница между ними?

4b9b3361

Ответ 1

Ваш ответ эквивалентен, но более читабельен и менее подвержен ошибкам, потому что вам не нужны "магические числа" для каждого элемента массива со "страхом" доступа к элементу из определения массива и, следовательно, создание IndexOutOfBoundsException.

Ответ 2

Оба делают то же самое.

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

В вашем втором attepmt вы сначала создаете массив длиной 6. И затем помещайте в каждый слот один объект.

Когда их использовать:

  • Если вы с самого начала знаете, какие элементы будут в массиве, используйте первый aproach - он чище, короче
  • Но если есть какая-то логика, которая определила, кто должен быть помещен в каждый слот, тогда второй будет лучше. Например, если вы хотите создать массив размером 10, но вы заполните его во время выполнения.
  • Первый aproach также более безопасен, потому что компилятор создал массив на основе длины ввода. Добавление нового элемента в код изменит размер массива. Во втором aproach вам придется изменить размер вручную, иначе ArrayOutOfBoundException будет выброшен при добавлении исполнителей [6].
  • Но если вы не знаете длину массива (вы будете заполнять список во время выполнения), то вы должны использовать List или другую динамическую структуру (Set, List)

Ответ 3

Оба являются допустимыми способами инициализации массива.

Ваш способ инициализации массива может быть выполнен только в том же выражении, которое определяет переменную массива, хотя впоследствии это можно сделать аналогичным образом:

String[] names = null;
names = new String[] {"Beyonce (f)", "David Bowie (m)", "Elvis Costello (m)", "Madonna (f)", "Elton John (m)", "Charles Aznavour (m)"};

Предоставленный ответ явно создает массив строк, задает количество строк, которые может хранить этот массив, и присваивает значения индексам массива.

Ответ 4

Оба решения правильны. Первый использует инициализатор массива, второй - первый экземпляр массива, а затем заполняет его значениями. Можно утверждать, что первое решение более надежное, так как во втором решении длина массива должна быть явно задана до того, как будут представлены записи, и можно использовать индексы без возможности массива, которые будут обнаружены только в во время выполнения.

Ответ 5

Новый массив может быть создан с помощью оператора new, за которым следует тип элемента массива, и размер массива между символами [ ] - это называется Выражение создания массива. Или, когда вы объявляете переменную, вы также можете использовать литерал массива, который называется Array Initializers (но это нельзя использовать для присвоения значения массив позже, когда он объявлен).

Когда вы пишете

String names[] = {"A", "B", "C"};

Это просто краткая форма и эквивалентна

String[] names = new String[] {"A", "B", "C"};

Обратите внимание, что для указания того, что должен быть объявлен массив указанного типа, могут использоваться как формы String[] names, так и String names[], и они эквивалентны: altough:

String names[], names2; // Only names is an array, names2 is just a String

В то время как

String[] names, names2; // Both names and names2 are arrays!

Рекомендуется использовать вторую форму, чтобы избежать путаницы и несчастных случаев, если позже вы добавите в объявление больше имен переменных.

Давайте более подробно рассмотрим, что происходит в двух случаях:

// "Slow" filling
String[] names = new String[3]; // Filled with null values by default
names[0] = "A"; // Explicit index, index range check!
names[1] = "B"; // Explicit index, index range check!
names[2] = "C"; // Explicit index, index range check!

// "Fast" filling at creation time, implicit indices and array length,
// No index checks!
String[] names = {"A", "B", "C"};

Преимущества создания и инициализации массива за один шаг

Существует несколько преимуществ создания и инициализации массива за один шаг:

  • Это меньше подвержено ошибкам: компилятор определит длину массива, а также компилятор инициализирует элементы массива на основе списка, который вы предоставляете. Нет такой вещи, как использование неправильного значения индекса или получение ArrayIndexOutOfBoundsException.
  • Это будет быстрее, потому что JVM (виртуальная машина Java) не будет инициализировать массив с null значениями.
  • Это будет быстрее, потому что вам не нужно указывать явные значения индекса, и JVM не должен работать с ними. Также JVM не проверяет, находятся ли индексы в допустимом диапазоне (т.е. 0..length-1).
  • Меньше обслуживания/накладных расходов, если позже вы хотите добавить еще один элемент в середине массива, вам просто нужно вставить его туда, где вы хотите. Если бы вы инициализировали ваш массив другим способом, вам нужно было бы обновить все последующие индексы.
  • Исходный код Java будет короче, компактнее, а также скомпилированный байт-код будет короче.

Подробнее о массивах можно узнать в Спецификация языка Java: Глава 10. Массивы

Ответ 6

"Новый" оператор в java отвечает за создание нового объекта или можно сказать экземпляр класса. Фактически, он динамически выделяет память в куче с ссылкой, которую мы определяем, указав из стека.