Массив объектов в Java
⚡ Умное резюме
Массив объектов в Java Эта переменная хранит ссылки на объекты в непрерывном слоте фиксированного размера, позволяя одной переменной хранить множество экземпляров класса и обращаться к каждому из них через индекс для итерации, изменения и передачи в методы.
Что такое массив объектов в... Java?
A Java массив объектов хранит несколько экземпляров объектов одного класса в одном контейнере фиксированного размера. В отличие от примитивного массива, который хранит такие значения, как... int, double или boolean В каждом слоте непосредственно хранится массив объектов. РекомендацииКаждый слот указывает на адрес объекта в памяти, а сам объект находится в памяти. Java куча.
Эта компоновка соответствует способу размещения любого объекта. переменная in Java Работает. Массив просто группирует несколько ссылок на объекты вместе, чтобы вы могли обращаться к ним по индексу. Это естественный выбор, когда количество объектов известно заранее и не меняется в течение всего времени работы программы.
Синтаксис
ClassName[] obj = new ClassName[array_length];
Правая сторона отводит пространство для array_length ссылки, все инициализированы значением null. Нет объекта ClassName Существует пока только контейнер, способный хранить ссылки на такие объекты.
Как создать массив объектов в Java
Создание рабочего массива объектов всегда требует двух этапов выделения памяти. Первый этап выделяет место для контейнера ссылок, а второй — для каждого объекта, на который будет указывать этот контейнер. Пропуститьping Второй шаг является наиболее распространенным источником NullPointerException для начинающих Java код.
Шаг 1) Откройте редактор кода и скопируйте следующий код:
class ObjectArray { public static void main(String args[]) { Account obj[] = new Account[2]; // obj[0] = new Account(); // obj[1] = new Account(); obj[0].setData(1, 2); obj[1].setData(3, 4); System.out.println("For Array Element 0"); obj[0].showData(); System.out.println("For Array Element 1"); obj[1].showData(); } } class Account { int a; int b; public void setData(int c, int d) { a = c; b = d; } public void showData() { System.out.println("Value of a = " + a); System.out.println("Value of b = " + b); } }
Шаг 2) Сохраните файл как ObjectArray.javaЗатем скомпилируйте и запустите его.
Шаг 3) Обратите внимание на ошибку. Попробуйте отладить её, прежде чем переходить к шагу 4.
Шаг 4) Осмотрите линию Account obj[] = new Account[2];Он выделяет массив из двух ссылочных переменных типа Accountно оно ничего не выделяет Account объекты. Оба слота вмещают nullи звоня obj[0].setData(...) на null ссылка вызывает NullPointerException во время выполнения.
Шаг 5) Раскомментируйте строки 4 и 5. Эти две строки создают реальные Account объекты и присвоить их obj[0] и obj[1]Теперь массив содержит реальные ссылки, и код работает без ошибок.
Выход:
For Array Element 0 Value of a = 1 Value of b = 2 For Array Element 1 Value of a = 3 Value of b = 4
Как инициализировать массив объектов в Java
Помимо инициализации с помощью сеттеров, показанной выше, массив объектов можно инициализировать тремя более чистыми способами. Каждый стиль жертвует многословностью ради ясности, поэтому выберите тот, который лучше всего подходит для конкретной ситуации.
- Инициализация цикла — сначала выделяем место в массиве, затем проходим по каждому индексу и присваиваем новый объект. Это стандартный шаблон для больших массивов или когда количество объектов является динамическим.
- Инициализация конструктора — Передавайте значения непосредственно в конструктор во время создания, поэтому отдельный вызов сеттера не требуется.
- Инициализация литералов массива — объявлять и заполнять в одном операторе с помощью встроенного оператора
{ ... }Инициализатор, идеально подходит для небольших фиксированных наборов данных.
class Account { int a, b; public Account(int a, int b) { // constructor this.a = a; this.b = b; } } public class InitDemo { public static void main(String[] args) { // 1) Loop initialisation Account[] loopArr = new Account[3]; for (int i = 0; i < loopArr.length; i++) { loopArr[i] = new Account(i, i * 10); } // 2) Constructor initialisation, one slot at a time Account[] ctorArr = new Account[2]; ctorArr[0] = new Account(1, 2); ctorArr[1] = new Account(3, 4); // 3) Array literal initialisation Account[] litArr = { new Account(5, 6), new Account(7, 8), new Account(9, 10) }; System.out.println("loop size = " + loopArr.length); System.out.println("ctor size = " + ctorArr.length); System.out.println("literal size= " + litArr.length); } }
Инициализация цикла является самым безопасным вариантом по умолчанию, поскольку гарантирует отсутствие оставшихся слотов. nullИнициализация конструктором явно указывает на необходимость использования разных аргументов для каждого объекта, а литералы массивов позволяют сохранить компактность небольшого демонстрационного кода. Не смешивайте стили внутри одного массива без веской причины: согласованность упрощает обнаружение ошибок.
Итерация и доступ к элементам в Java Массив объектов
После заполнения массива объектов три шаблона охватывают практически все потребности в доступе. Выберите стиль цикла, который соответствует тому, насколько контроль над индексом необходим коду.
Classic for поиска Предоставляет доступ к индексу, который полезен для замены элементов, сравнения соседних элементов или итерации по поддиапазону.
for (int i = 0; i < obj.length; i++) { System.out.println("Element " + i); obj[i].showData(); }
Повышенная for поиска Цикл «for-each» скрывает индекс и читается более естественно, когда индекс не нужен:
for (Account acc : obj) {
acc.showData();
}
Потоки (Java 8 и более поздние версии) Преобразовать массив в конвейер, что удобно для фильтрации и отображения.pingили агрегирование без написания цикла:
import java.util.Arrays;
Arrays.stream(obj)
.filter(acc -> acc.a > 0)
.forEach(Account::showData);
Для чтения или обновления отдельного элемента используйте прямой доступ по индексу, например. obj[1].setData(10, 20)Всегда сначала проверяйте длину с помощью obj.length чтобы избежать ArrayIndexOutOfBoundsExceptionКогда любой слот мог быть nullЗащитите доступ с помощью проверки на null или Optional чтобы программа продолжала работать, а не вылетала.
Массив объектов против списка объектов в Java
Простой массив объектов работает быстро и предсказуемо, но его фиксированный размер становится ограничением, как только количество объектов изменяется во время выполнения. JavaФреймворк Collections предоставляет ArrayList в качестве динамической альтернативы. В таблице ниже показано, когда каждый из вариантов уместен.
| Характеристика | Массив объектов | ArrayList of Objects |
|---|---|---|
| Размер | Исправлено при создании | Автоматически увеличивается и уменьшается в размерах. |
| Декларация | Account[] a = new Account[5]; | List<Account> list = new ArrayList<>(); |
| Элемент доступа | a[i] | list.get(i) |
| Добавить элемент | Не поддерживается после создания | list.add(obj) |
| Тип безопасности | Типизация осуществляется на этапе компиляции посредством объявления. | Обобщенные типы данных применяются на этапе компиляции. |
| Эффективности | Проиндексированные чтения немного быстрее. | Амортизированная сложность O(1) сложение, некоторые накладные расходы на каждый элемент. |
| Предпочтительно, когда | Размер известен и фиксирован. | Размер неизвестен или изменяется во время выполнения. |
Используйте массивы, когда важны ограниченный объем памяти и предсказуемая индексация, например, в матричных структурах или в критически важных с точки зрения производительности областях кода. ArrayList В большинстве повседневных приложений это происходит потому, что возможность добавлять и удалять элементы без перераспределения памяти перевешивает небольшие накладные расходы на каждый элемент.



