Niz nizova

P: Kako da koristim niz nizova?

O:

String s = novi String ("Zdravo, svijete"); // s je String referenca koja se odnosi na // String objekt s vrijednošću "Hello, World." s = novi niz ("Guten Tag, Welt"); // Iste reference Stringa sada se odnose // na drugi String objekt; to jest, // jedna referenca odnosila se na // // različita objekta (uzastopno). // (Primijetite da sada imamo objekt String // s vrijednošću "Hello, World", koji nema // reference; stoga ovaj objekt ispunjava uvjete // za sakupljanje smeća) String t; // t je String referenca s null vrijednošću // (koja se ne odnosi na bilo koji objekt). // Ako u ovom trenutku pokušate upotrijebiti t, npr. // izgovaranjem int len ​​= t.length; dobit ćete // NullPointerException (trebao bi se zvati // NullReferenceException). t = s;// String referenca t sada se odnosi na isti // objekt na koji se pozivaju referenca String, // naime objekt String s vrijednošću "Guten Tag, Welt". // Dakle, ovdje imamo dvije // reference na jedan objekt (istovremeno).

Nizovi u Javi su sami po sebi objekti, bez obzira sadrže li primitive ( ints, chars, booleans, i tako dalje) ili sadrže druge objekte. To znači da se na nizove poziva kao na bilo koji drugi objekt, uz dodatak []semantike agregacije / dereferenciranja. Evo primjera:

Niz [] sa; // sa je nula referenca // pokušaj pristupa sa.length uzrokuje NullPointerException. sa = novi niz [2]; // sa više nije null referenca, već se odnosi na određeni // objekt koji je niz od dvije null string reference. // sa.length je sada jednako 2 // (sa [0] i sa [1] su dvije null reference niza). sa [0] = "Zdravo, Svijete"; sa [1] = "Guten Tag, Welt"; // Sada se sa odnosi na niz od dvije ne-null reference niza. sa = novi niz [1]; // sa.length je jednako 1 // Ista referenca sa sada se odnosi na drugi // (i kraći) niz. // sa [0] je nulta referenca na niz // pokušaj pristupa sa [1] uzrokuje // ArrayIndexOutOfBoundsException. sa [0] = "Zdravo, Svijete"; // sa [0] sada nije null.

Uzimajući to u obzir može se odgovoriti na vaše pitanje o nizovima

Niz [] [] saa; saa [0] [0] = "Pomoć";

će uzrokovati a NullPointerException, jer saaje nula referenca - to jest, saane odnosi se na bilo koji objekt. Da bi se prvom elementu prvog polja dodijelila vrijednost, saamora se odnositi na niz čija je duljina veća od nule i saa[0]mora se odnositi na nenulirani niz niza čija je duljina također veća od nule. Dakle, moglo bi se početi rekavši:

Niz [] [] saa; // saa je nula referenca na niz String nizova // Pokušaj saa.length već uzrokuje NullPointerException, // kao što to pokušava pokušaj saa [0]. saa = novi niz [1] []; // saa se sada odnosi na niz od 1 null reference na String []. // saa.length je jednak 1. // saa [0] je null. saa [0] = novi niz [2]; // saa se sada odnosi na niz od 1 ne-null reference // na niz [] duljine 2. // saa.length je i dalje jednak 1. // saa [0] .length je jednak 2 (ali saa [0] [0] i // saa [0] [1] su null). saa [0] [0] = "Zdravo, svijetu"; saa [0] [1] = "Oznaka Guten, Welt"; // Sada saa [0] [0] i saa [0] [1] nisu nula.

Primijetite da se na nju ne možete pozivati saa[0][0]dok ne saa[0]postane nula i ne možete je saa[0]poništiti dok ne napravite saanenulu. U osnovi, svoj niz nizova morate postupno graditi.

Postoji jednostavna skraćenica za inicijalizaciju referenci niza:

String [] [] saa = {{{"Hello, World}, {" Guten Tag, Welt "}}}; // ovo stvara String [] [] objekt poput onog stvorenog // gore i dodjeljuje saa odnose se na taj objekt. // Razmak je namijenjen naglašavanju da je // stvoreni objekt niz jednog Stringa [] koji // sadrži dva stringa. 

Koristeći ovu skraćenicu, naš se primjer može ispravno napisati kao:

Niz [] [] saa = {{{"" Pomoć "}}}; 

Međutim, ovo saaupućuje na jedan po jedan niz nizova. Imajte na umu da gornja sintaksa djeluje samo kada se inicijalizira referenca na niz (inicijalizacija je poseban slučaj dodjele u trenutku deklaracije). Općenitiji način za stvaranje novog niza i dodjeljivanje novom ili postojećem referenci niza izgleda ovako (u slučaju postojeće reference):

saa = new String [] [] {// zabilježite prazno [] [] - kompajler izračunava // veličinu (potreban je prazan [] []). {{"Hello"}, {"World"}} // ovo je saa [0], // zabilježite zarez koji razdvaja saa [0] i saa [1] {{"Guten Tag"}, {"Welt"} } // ovo je saa [1]}; // sada saa.length = 2, a saa [0] i saa [1] također imaju duljinu 2
Random Walk Computing najveći je konzultantski butik Java / CORBA u New Yorku, usredotočen na rješenja za financijsko poduzeće. Poznati po svojoj vrhunskoj stručnosti za Java, savjetnici za Random Walk objavljuju i govore o Javi na nekim od najcjenjenijih foruma na svijetu.

Ovu priču, "Niz nizova" izvorno je objavio JavaWorld.