1. Matriser i minnet

I de forrige eksemplene var illustrasjonene litt unøyaktige.

Når du oppretter matriser (som når du oppretter strenger), tildeles to separate minneblokker: en for å lagre selve matrisen (beholderen) og en andre blokk for variabelen som lagrer adressen . Bildet nedenfor representerer denne avklaringen:

Arrays i minnet

Minnet som er tildelt for arrayen av 10 intelementer og int[]variabelen som lagrer adressen til intarrayet, vises i grønt.

Til sammenligning vises en ordinær intvariabel som lagrer verdien i blått.199

Dette minner litt om å lagre strenger i minnet, synes du ikke?

Det stemmer, strenger. Og akkurat som når du arbeider med strenger, kan du tilordne matrisevariabler til hverandre:

Kode Forklaring
int[] a = new int[10];
a[2] = 4;
a[7] = 9;
int[] b = a;

a[9] = b[2] + a[7];
Lag en rekke 10 intelementer.
Tilordne verdien 4til cellen med indeks 2.
Tilordne verdien 9til cellen med indeks 7.
I bvariabelen lagrer du adressen som er lagret i avariabelen.
aog bpek på det samme array-objektet i minnet.
I matriseobjektets celle med indeks 9skriver du summen av verdiene som er lagret i celler 2(som lagrer verdien 4) og 7(som lagrer verdien 9).

Matriseobjektet forblir akkurat der det var, og avariablene og blagrer den samme adressen (referansen) til det samme objektet. Se på bildet:

Arrays i minnet 2

2. Flere detaljer om arbeid med matriser

Du kan lage en rekke elementer av absolutt hvilken som helst type. For å gjøre dette, skriv ganske enkelt hakeparenteser etter typenavnet. Generelt ser det slik ut å lage en matrise:

type[] name = new type[number];

Der type er typen av elementene vi vil lagre i matrisen. Navn er navnet på variabelen vi skal bruke for å referere til matrisen, og tall er antall celler i matrisen.

Eksemplet ovenfor er den kanoniske formen for å lage en matrisevariabel og et matriseobjekt. I virkeligheten er dette to separate enheter.

Du kan opprette en matrisevariabel separat fra et matriseobjekt:

type[] name;
name = new type[number];

Og ett poeng til som ikke er uvesentlig:

Du kan bruke variabler eller til og med hele uttrykk som indeksmatrise og antall matriseelementer .

Eksempler:

Kode Forklaring
int n = 100;
int[] a = new int[n];
Lag en rekke nelementer
int n = 100;
int[] a = new int[n * 2 + 3];
Lag en matrise med 203elementer
int n = 100;
int[] a = new int[n];
a[n-1] = 2;
a[n-2] = 3;
a[n/5] = a[n-1] + a[n-2]


// a[99] = 2;
// a[98] = 3;
// a[20] = a[99] + a[98];
Viktig:
Forresten, du bør være klar over at hvis du prøver å få tilgang til en matrisecelle ved å bruke en indeks som ikke eksisterer for matrisen (i vårt eksempel betyr det et hvilket som helst heltall som ikke er i området ), så vil programmet krasje med 0..99en ArrayIndexOfBoundException, som betyr at indeksen var utenfor arrayens grenser.

3. Matriselengde

Som du så i forrige eksempel, kan du lage en matrisevariabel for seg selv og deretter tilordne en verdi (en referanse til et matriseobjekt) til den et sted i koden. Du kan til og med gjøre dette:

Kode Forklaring
int[] array;
if (a < 10)
   array = new int[10];
else
   array = new int[20];
Opprett en matrisevariabel hvis type er int[]
Hvis avariabelen er mindre enn 10,
så opprett en matrise med 10elementer.
Ellers
lag en rekke 20elementer

Og hva annet kan du gjøre med en slik matrise? Hvordan vet du hvor mange elementer som er i den?

For å hjelpe med dette har arrays en spesiell egenskap (variabel) kalt length. Du kan finne lengden på en matrise ved å bruke dette uttrykket:

array.length;

Her arrayer array-variabelens navn og lengther navnet på array-egenskapen. Verdien av lengthegenskapen kan ikke endres: lengthegenskapen i seg selv kan tilordnes til andre variabler, men ingenting kan tilordnes den (hvis du prøver å gjøre dette, vil programmet ganske enkelt ikke kompilere).

Vi kan fortsette med forrige eksempel slik:

Kode Forklaring
int[] array;
if (a < 10)
   array = new int[10];
else
   array = new int[20];
for (int i = 0; i < array.length; i++)
{
   System.out.println(array[i]);
}
Opprett en matrisevariabel hvis type er int[]
Hvis avariabelen er mindre enn 10,
så opprett en matrise med 10elementer.
Ellers
lag en matrise med 20elementer
Loop over alle elementene i matrisen: fra 0til lengdearray.length - 1

4. Oppsummering av fakta om arrays i Java

La oss oppsummere hva vi vet om matriser:

Fakta 1. En matrise består av mange celler.

Fakta 2. Du får tilgang til en bestemt celle ved å bruke dens nummer (indeks).

Fakta 3. Alle celler er av samme type.

Fakta 4. Startverdien til alle cellene er 0 (hvis cellene lagrer tall), null(hvis cellene lagrer objektreferanser), eller false(hvis cellene lagrer booleanverdier). Du vil lære mer om standardverdier i dette kapittelet .

Fakta 5. String[] list er bare deklarasjonen av en variabel. Dette oppretter ikke selve beholderen (array-objektet). For å bruke variabelen må du først opprette en matrise (beholder) og tilordne den til variabelen. Se eksempelet nedenfor.

Fakta 6. Når vi lager et array-objekt (container), må vi angi hvor stort det er, altså hvor mange celler det inneholder. Dette gjøres med en uttalelse som: new TypeName[n];

Fakta 7. Lengden på en matrise kan bli funnet ved å bruke .lengthegenskapen.

Fakta 8. Etter å ha opprettet en matrise, kan du ikke endre typen av elementene eller antall elementer den lagrer.

Kode Forklaring
String s;
String[] list;
ser null
listernull
list = new String[10];
int n = list.length;
Variabelen listlagrer en referanse til et objekt: en strengmatrise som består av 10elementer.
ner10
list = new String[0];

Refererer nå listtil en rekke 0elementer. Matrisen eksisterer, men den kan ikke lagre noen elementer.

list = null;
System.out.println(list[1]);
Et unntak (programfeil) vil bli kastet, dvs. programmet vil krasje. listlagrer en referanse tilnull
list = new String[10];
System.out.println(list[10]);
Et array-out-of-bounds-unntak (programfeil) vil bli generert.
Hvis a listlagrer 10elementer/celler, er de gyldige indeksene: 0 1 2 3 4 5 6 7 8 910elementer.