Array di array

D: Come si usa un array di array?

UN:

String s = new String ("Hello, World"); // s è un riferimento String, che fa riferimento a un // oggetto String con valore "Hello, World". s = nuova stringa ("Guten Tag, Welt"); // Lo stesso riferimento String ora si riferisce // a un oggetto String diverso; ovvero, // un singolo riferimento si è riferito a due // oggetti diversi (consecutivamente). // (Notare che ora abbiamo un oggetto String // con valore "Hello, World", che non ha // riferimenti; quindi questo oggetto è idoneo // per essere garbage collection) String t; // t è un riferimento String con un valore nullo // (non si riferisce ad alcun oggetto). // Se provi a usare t a questo punto, ad esempio // dicendo int len ​​= t.length; otterrai una // NullPointerException (dovrebbe essere chiamata // NullReferenceException). t = s;// Il riferimento String t ora si riferisce allo stesso // oggetto a cui fa riferimento il riferimento String s, // vale a dire un oggetto String con il valore "Guten Tag, Welt". // Quindi qui abbiamo due // riferimenti a un singolo oggetto (contemporaneamente).

Gli array in Java sono oggetti a sé stanti, indipendentemente dal fatto che contengono primitive ( ints, chars, se booleancosì via) o contengono altri oggetti. Ciò significa che gli array vengono indicati come qualsiasi altro oggetto, con l'aggiunta della []semantica di aggregazione / dereferenziazione. Ecco un esempio:

String [] sa; // sa è un riferimento nullo // il tentativo di accedere a sa.length provoca un'eccezione NullPointerException. sa = nuova stringa [2]; // sa non è più un riferimento null, si riferisce a un oggetto // specifico che è un array di due riferimenti String null. // sa.length è ora uguale a 2 // (sa [0] e sa [1] sono i due riferimenti String null). sa [0] = "Hello, World"; sa [1] = "Guten Tag, Welt"; // Ora sa si riferisce a un array di due riferimenti String non nulli. sa = nuova stringa [1]; // sa.length è uguale a 1 // Lo stesso riferimento sa ora si riferisce a un // diverso (e più breve) array. // sa [0] è un riferimento String nullo // il tentativo di accedere a sa [1] provoca un'eccezione // ArrayIndexOutOfBoundsException. sa [0] = "Hello, World"; // sa [0] ora non è nullo.

La tua domanda sugli array può essere risolta considerando questo

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

causerà un NullPointerException, perché saaè un riferimento nullo, cioè saanon fa riferimento a nessun oggetto. Per assegnare un valore al primo elemento del primo array, saadeve fare riferimento a un array di con una lunghezza maggiore di zero, e saa[0]deve fare riferimento a un array di stringhe non null la cui lunghezza è anche maggiore di zero. Quindi, si potrebbe iniziare dicendo:

String [] [] saa; // saa è un riferimento nullo a un array di array di stringhe // Il tentativo di saa.length causa già una NullPointerException, // come il tentativo di saa [0] fa. saa = nuova stringa [1] []; // saa ora fa riferimento a un array di 1 riferimento nullo a una stringa []. // saa.length è uguale a 1. // saa [0] è nullo. saa [0] = nuova stringa [2]; // saa ora si riferisce a un array di 1 riferimento non nullo // a una stringa [] di lunghezza 2. // saa.length è ancora uguale a 1. // saa [0] .length è uguale a 2 (ma saa [0] [0] e // saa [0] [1] sono entrambi nulli). saa [0] [0] = "Hello, World"; saa [0] [1] = "Guten Tag, Welt"; // Ora saa [0] [0] e saa [0] [1] sono entrambi non nulli.

Notare che non è possibile fare riferimento a saa[0][0]until saa[0]è nonnull e non è possibile creare saa[0]nonnull finché non si rende saanonnull. Fondamentalmente, devi costruire il tuo array di array in modo incrementale.

Esiste una scorciatoia di facile utilizzo per inizializzare i riferimenti agli array:

String [] [] saa = {{{"Hello, World}, {" Guten Tag, Welt "}}}; // crea un oggetto String [] [] come quello creato // sopra e assegna saa a fare riferimento a quell'oggetto. // Lo spazio vuoto ha lo scopo di enfatizzare che // l'oggetto creato è un array di una stringa [] che // contiene due stringhe. 

Usando questa scorciatoia, il nostro esempio potrebbe essere scritto correttamente come:

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

Tuttavia, questo fa saariferimento a un array di stringhe uno per uno. Si noti che la sintassi precedente funziona solo quando si inizializza un riferimento a un array (l'inizializzazione è il caso speciale di assegnazione al momento della dichiarazione). Il modo più generale per creare un nuovo array e assegnarlo a un riferimento di array nuovo o esistente è simile al seguente (nel caso di un riferimento esistente):

saa = new String [] [] {// nota il vuoto [] [] - il compilatore calcola la // dimensione (è richiesto il vuoto [] []). {{"Hello"}, {"World"}} // questo è saa [0], // nota la virgola che separa saa [0] e saa [1] {{"Guten Tag"}, {"Welt"} } // questo è saa [1]}; // ora saa.length = 2, e anche saa [0] e saa [1] hanno lunghezza 2
Random Walk Computing è la più grande boutique di consulenza Java / CORBA a New York, concentrandosi su soluzioni per l'impresa finanziaria. Conosciuti per la loro esperienza Java all'avanguardia, i consulenti Random Walk pubblicano e parlano di Java in alcuni dei forum più rispettati al mondo.

Questa storia, "Array of arrays" è stata originariamente pubblicata da JavaWorld.