Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Скидка до 20% на услуги дата-центра. Аренда серверной стойки. Colocation от 1U!

Миграция в облако #SotelCloud. Виртуальный сервер в облаке. Выбрать конфигурацию на сайте!

Виртуальная АТС для вашего бизнеса. Приветственные бонусы для новых клиентов!

Виртуальные VPS серверы в РФ и ЕС

Dedicated серверы в РФ и ЕС

По промокоду CITFORUM скидка 30% на заказ VPS\VDS

VPS/VDS серверы. 30 локаций на выбор

Серверы VPS/VDS с большим диском

Хорошие условия для реселлеров

4VPS.SU - VPS в 17-ти странах

2Gbit/s безлимит

Современное железо!

Массивы массивов

Перевод на русский © Сергей Миссан, 2000
Оригинал статьи опубликован на сайте Javable.com

Java Q&A

Когда и как следует использовать массивы массивов?

В Java все объекты обрабатываются с помощью ссылок. Объект может иметь несколько ссылок и ссылка может указывать на разные объекты в разные моменты времени. В этом смысле ссылки напоминают указатели C/C++ (правда, они не поддерживают операции с указателями, которые заменены в Java семантикой массивов). Давайте посмотрим на пример:

String s = new String( "Привет, мир" );
// s является ссылкой типа String, указывающей
// на объект String со значением "Привет, мир" .

s= new String( "Guten Tag, Welt" );
// Та же ссылка типа String теперь указывает
// на другой объект String; то есть,
// одна и та же ссылка указывала на два
// разных объекта (последовательно).
// (Заметьте, что теперь у нас есть объект String
// со значением "Привет, мир" на который нет ссылок;
// теперь он подлежит удалению
// сборщиком мусора)

String t;
// t это ссылка типа String со значением null
// (не указывает ни на один объект).
// Если вы попробуете использовать t в этот момент, т.е.
// напишете int len = t.length; вы получите
// NullPointerException (лучше было бы сказать
// NullReferenceException).

t = s;
// Теперь ссылка типа String t указывает на тот же
// объект, что и String ссылка s,
// то есть объект со значением "Guten Tag, Welt".
// Таким образом, мы получили две ссылки
// на один объект (одновременно).

Массивы в Java это своеобразные объекты, хранят ли они примитивы (int, char, boolean, и т.д) или другие объекты. Это означает, что на массивы ссылаются, как на любые другие объекты с добавлением [] семантики агрегирование/разыменования. Например:

String [] sa;
// sa это ссылка null
// попытка доступа к sa.length приведет к NullPointerException.

sa = new String [2];
// sa уже не null, а указывает на определенный объект-
// массив из двух ссылок null String.
// sa.length теперь равна 2
// (sa[0] и sa[1] это две ссылки null String).

sa[0] = "Hello, World";
sa[1] = "Guten Tag, Welt";
// теперь sa указывает на массив из двух непустых ссылок типа String.

sa = new String[1];
// sa.length equals 1
// Та же ссылка sa тперь указывает на другой
// (и более короткий) массив.
// sa[0] это null ссылка типа String.
// Попытка обратится к sa[1] вызовет
// ArrayIndexOutOfBoundsException.

sa[0] = "Hello, World";
// sa[0] теперь непуста.

Вам также необходимо учитывать, что

String [] [] saa;
saa [0] [0] = "Help";

приведет к NullPointerException, так как saa это пустая ссылка -- saa не ссылается ни на один объект. Для того, чтобы присвоить значение первому элементу первого массива saa должна ссылаться на массив с ненулевой длиной и saa[0] должна ссылаться на непустой массив строк также с ненулевой длиной. Теперь мы можем написать:

String [] [] saa;
// saa это null ссылка на массив массивов, содержащих String
// Попытка вызвать saa.length сразу же приведет к NullPointerException,
// так же как и вызов saa[0].

saa = new String [1][];
// saa теперь ссылается на массив, содержащий 1 null ссылку на String[].
// saa.length равна 1.
// saa[0] пуст.

saa[0] = new String[2];
// saa теперь ссылается на массив, содержащий одну непустую ссылку
// на String[] с длиной 2.
// saa.length по-прежнему равна 1.
// saa[0].length равна 2 (но saa[0][0] и
// saa[0][1] обе null).

saa[0][0] = "Hello, World";
saa[0][1] = "Guten Tag, Welt";
// Теперь saa[0][0] и saa[0][1] обе непусты.

Заметье, что вы не можете ссылаться на saa[0][0] пока saa[0] непуст, и вы не можете сделать saa[0] непустым пока вы не сделаете saa непустым также. В принципе вам прийдется создавать сво массив массивов в возрастающем порядке.

Вот упрощенный способ для инициализации ссылок в массивах:

String [][] saa = {
{ { "Hello, World }, { "Guten Tag, Welt"} } };
// создаем объект String[][], как и ранее
// и присваиваем ему saa.
// Пробел подчеркивает, что созданный объект
// это массив из одного String[],
// содержащий две строки.

Используя такой прием, перепишем наш пример:

String [][] saa = { { { "Help" } } };

Однако saa теперь указывает на последовательный массив строк. Заметьте, что приведенный синтаксис работает только при инициализации ссылки на массив (инициализация это специальный тип присваивания во время объявления). Более общий способ создания нового массива и присваивания ему ссылки на новый или существующий массив выглядит так (в этом случае для уже существующей ссылки):

saa = new String [][] {
// заметьте пустые [][] -- компилятор сам
// установит размер (пустые [][] должны быть обязательно).
{ { "Hello" }, { "World" } }
// это saa[0]
,
// заметьте запятую, разделяющую
// saa[0] и saa[1]
{ { "Guten Tag" }, { "Welt"} }
// это is saa[1]
};
// теперь saa.length = 2, и длина saa[0] и saa[1] также 2

Об авторе

Random Walk Computing это наибольшая консалтинговая фирма в Нью Йорке, специализирующаяся на Java/CORBA решениях для предприятий. Известные своим выдающимся знанием Java, консультанты Random Walk публикуются и выступают на самых престижных форумах мира. Для связи с Random Walk используйте javaqa@javaworld.com.

Reprinted with permission from the March 2000 edition of JavaWorld magazine.
Copyright © ITworld.com, Inc., an IDG Communications company.
View the original article at: http://www.javaworld.com/javaworld/javaqa/1999-12/01-qa-array.html

Назад | Содержание | Вперед

 

Бесплатный конструктор сайтов и Landing Page

Хостинг с DDoS защитой от 2.5$ + Бесплатный SSL и Домен

SSD VPS в Нидерландах под различные задачи от 2.6$

✅ Дешевый VPS-хостинг на AMD EPYC: 1vCore, 3GB DDR4, 15GB NVMe всего за €3,50!

🔥 Anti-DDoS защита 12 Тбит/с!

VPS в 21 локации

От 104 рублей в месяц

Безлимитный трафик. Защита от ДДоС.

🔥 VPS до 5.7 ГГц под любые задачи с AntiDDoS в 7 локациях

💸 Гифткод CITFORUM (250р на баланс) и попробуйте уже сейчас!

🛒 Скидка 15% на первый платеж (в течение 24ч)

Новости мира IT:

Архив новостей

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 7861149
Пресс-релизы — pr@citforum.ru
Обратная связь
Информация для авторов
Rambler's Top100 TopList liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2019 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...