Avatar billede shadowdance Nybegynder
07. september 2004 - 17:48 Der er 10 kommentarer og
1 løsning

Arrays i Java

Hvordan er det lige arrays fungerer i Java?

Jeg er gammel VB-nørd, og derfor er det oplagt at stille flg. spørgsmål:

- hvordan kreerer man et dynamisk array (er der overhovedet et statisk...)?
- hvordan redimensionerer man et array senere?
- Hvordan får man returneret et arrays dimensioner, dvs antallet af elementer i array´et?
Avatar billede arne_v Ekspert
07. september 2004 - 17:53 #1
int[] a = new int[123];

laver et int array med 123 elementer (index 0..122)

nej man kan ikke lave et statisk

man kan ikke lave redim i Java - det er lave et nyt og kopiere data

a.length

indeholder størrelsen af a
Avatar billede shadowdance Nybegynder
07. september 2004 - 18:00 #2
Ok. Tak. Et ekstra spørgsmål så: Hvis jeg har fulgt dit eksempel ovenfor, og har array a med 123 elementer, som jeg så kopierer til array b med 124 elementer...
kan jeg så sætte a=b, og dermed overskrive det gamle array a?

Spørgsmålet har to sider: 1) kan man destruere et objekt ved bare at sætte det til at være noget andet, og 2) kan man kopiere et array uden at kopiere det enkelte element?
Avatar billede arne_v Ekspert
07. september 2004 - 18:12 #3
Nej.

Arrays er objekter og

a=b;

vil få a til at pege på samme array som b og gøre det array som a pegede på
før klar til garbage collection.

Du vil hente data over enten med en for løkke eller med System.arraycopy
Avatar billede arne_v Ekspert
07. september 2004 - 18:13 #4
Man destruerer ikke som sådan i Java.

Når der ikke længere er en reference til et objekt (herunder et array) så
vil Java runtime garbage collecte det på et tidspunkt når Java runtime
synes at der er tid for det (f.eks. den skal have frigivet noget memory).
Avatar billede shadowdance Nybegynder
07. september 2004 - 18:35 #5
Arne, du er min redning idag. Du siger, at a=b vil få a til at pege på samme objekt. Hvorfor har jeg så brug for arraycopy, elementerne burde jo være de samme?

lad os sige at jeg har a med 123 elementer. Operationen går ud på, at jeg skal indsætte en ny værdi på den 124. plads. Altså skal array´et udvides.

Jeg laver array b med 124 pladser, kopierer de enkelte elementer med FOR (kan jeg bruge arraycopy her?).

Hvad gør jeg nu? Sætter jeg a=b, eller er jeg nødt til at kopiere manuelt tilbage?
Avatar billede shadowdance Nybegynder
07. september 2004 - 18:36 #6
(Ydermere: hvis jeg ønsker at destruere en reference, kan man så gøre det med a=null, eller hvordan...?)
Avatar billede arne_v Ekspert
07. september 2004 - 18:40 #7
int[] a = new int[123]; // referencen a peger på et int array med 123 elementer

int[] b = new int[124]; // referencen b peger på et int array med 124 elementer

a = b; // både a og b peger på arrayet med 123 elementer - arrayet med 124 elementer klar til GC

System.arraycopy(a, 0, b, 0, a.length); // kopierer 123 elementer fra a til b - a og b peger på det samme som hidtil
a = null; // arrayet med 123 elementer klar til GC
Avatar billede arne_v Ekspert
07. september 2004 - 18:41 #8
Jeg antager at den sidste lyder mere rigtigt end den forrige.
Avatar billede arne_v Ekspert
07. september 2004 - 18:42 #9
Hov.

b = a; // både a og b peger på arrayet med 123 elementer - arrayet med 124 elementer klar til GC

a = b; // a peger på arrayet med 124 elementer - arrayet med 123 elementer klar til GC (og vi har ikke gemt data !!)
Avatar billede arne_v Ekspert
07. september 2004 - 18:43 #10
a = null;

sætter bare referencen til null

hvis der ikke er andre referencer som peger på det som a pegede på før så
er det klart til GC
Avatar billede arne_v Ekspert
19. september 2004 - 19:20 #11
OK ?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester