Масив от масиви

В: Как да използвам масив от масиви?

A:

String s = new String ("Hello, World"); // s е String референция, която се отнася до // String обект със стойност "Hello, World." s = нов низ ("Guten Tag, Welt"); // Същата референция на String вече се отнася // към различен String обект; тоест // единична препратка се позовава на два // различни обекта (последователно). // (Забележете, че сега имаме String обект // със стойност "Hello, World", който няма // препратки; следователно този обект е допустим // да бъде събран боклук) String t; // t е String референция с нулева стойност // (без препратка към никакъв обект). // Ако се опитате да използвате t в този момент, например като // кажете int len ​​= t.length; ще получите // NullPointerException (трябва да се нарича // NullReferenceException). t = s;// String reference t сега се отнася до същия // обект, посочен от String reference s, // а именно String обект със стойността "Guten Tag, Welt". // Така че тук имаме две // препратки към един обект (едновременно).

Масивите в Java са обекти сами по себе си, независимо дали съдържат примитиви ( ints, chars, booleans и т.н.) или съдържат други обекти. Това означава, че масивите са посочени като всеки друг обект, с добавянето на []семантиката за обобщаване / дереференция. Ето пример:

String [] sa; // sa е нулева препратка // опитът за достъп до sa.length причинява NullPointerException. sa = нов низ [2]; // sa вече не е нулева препратка, тя се отнася до конкретен // обект, който е масив от две нулеви низови препратки. // sa.length вече е равна на 2 // (sa [0] и sa [1] са двете нулеви препратки към String). sa [0] = "Здравей, Свят"; sa [1] = "Guten Tag, Welt"; // Сега sa се отнася до масив от две ненулеви референции на String. sa = нов низ [1]; // sa.length е равно на 1 // Същата препратка sa сега се отнася до различен // (и по-кратък) масив. // sa [0] е нулева референция на низ // опит за достъп до sa [1] причинява // ArrayIndexOutOfBoundsException. sa [0] = "Здравей, Свят"; // sa [0] вече не е нула.

Въпросът ви относно масивите може да се отговори, като се вземе предвид това

Низ [] [] saa; saa [0] [0] = "Помощ";

ще причини a NullPointerException, защото saaе нулева препратка - тоест saaне се отнася до нито един обект. За да присвоите стойност на първия елемент от първия масив, saaтрябва да се отнася до масив с дължина, по-голяма от нула, и saa[0]трябва да се отнася до ненулен масив от низове, чиято дължина също е по-голяма от нула. И така, може да се започне с това:

String [] [] saa; // saa е нулева препратка към масив от масиви от низове // Опитът на saa.length вече причинява NullPointerException, // както се опитва saa [0]. saa = нов низ [1] []; // saa сега се отнася до масив от 1 нулева препратка към String []. // saa.length е равна на 1. // saa [0] е нула. saa [0] = нов низ [2]; // saa сега се отнася до масив от 1 ненулева препратка // към низ [] с дължина 2. // saa.length все още е равен на 1. // saa [0] .length е равен на 2 (но saa [0] [0] и // saa [0] [1] са нула). saa [0] [0] = "Здравей, Свят"; 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 [], който // съдържа два низа. 

Използвайки този стенопис, нашият пример може правилно да бъде написан като:

Низ [] [] saa = {{{"" Помощ "}}}; 

Това обаче се saaотнася до един по един низ масив. Имайте предвид, че горният синтаксис работи само при инициализиране на референция към масив (инициализацията е специалният случай на присвояване по време на декларацията). По-общият начин за създаване на нов масив и присвояването му на нов или съществуващ референтен масив изглежда по следния начин (в случай на съществуваща препратка):

saa = new String [] [] {// обърнете внимание на празното [] [] - компилаторът изчислява // размера (изисква се празен [] []). {{"Hello"}, {"World"}} // това е saa [0], // отбележете запетаята, разделяща saa [0] и saa [1] {{"Guten Tag"}, {"Welt"} } // това е saa [1]}; // сега saa.length = 2 и saa [0] и saa [1] също имат дължина 2
Random Walk Computing е най-големият консултантски бутик Java / CORBA в Ню Йорк, фокусиран върху решения за финансовото предприятие. Известни със своите водещи познания по Java, консултантите на Random Walk публикуват и говорят за Java в някои от най-уважаваните форуми в света.

Тази история „Масив от масиви“ първоначално е публикувана от JavaWorld.