Gå til innhold

Maksimal lengde på en ArrayList?


Anbefalte innlegg

Har en ArrayList som dette:

ArrayList<Long> primtall = new ArrayList<Long>().

 

Hvor mange elementer kan settes i denne listen egentlig?

 

Grunnen til at jeg spør er fordi maskinen risikerer å fylle lista med rundt 30mill. elementer nå...... :whistle:

Lenke til kommentar
Videoannonse
Annonse

Størrelsen på en ArrayList er nok oppad begrenset av minnet satt av til javas virtuelle maskin. Husk at dette ikke nødvendigvis er det samme som minnet i maskinen din. Det skal finnes et argument som kan legges ved fra kommandolinjen. Skriv "java -X" så finner du nok det argumentet du trenger.

 

CPL

Lenke til kommentar

Når du instansierer en ny ArrayList vil den opprette en Object-array med plass til 10 elementer (eller det du måtte oppgi i konstruktøren). Du kan også oppgi hvilken type array du vil ha ved å skrive ArrayList<String>, da vil det opprettes en tilsvarende stor String[].

 

Når du så legger inn nye elementer vil det kontrolleres at det er plass i tabellen. Hvis tabellen er full økes kapasiteten slik:

 

int newCapacity = (oldCapacity * 3)/2 + 1;

 

Gir du startkapasitet 10 og legger til 11 elementer har du altså en tabell med plass til 16 elementer. Fyller du opp den økes tabellen til 25, og så videre. Den gamle informasjonen kopieres over.

 

Dette er egentlig ikke et svar på spørsmålet ditt, svaret er vel ganske enkelt at dette begrenses av hvor mye minne Java får lov til å bruke, men det er alltid kjekt å vite litt om klassene man bruker, selv om de er ferdiglaget!

Lenke til kommentar
  • 3 måneder senere...
Når du instansierer en ny ArrayList vil den opprette en Object-array med plass til 10 elementer.

 

Når du så legger inn nye elementer vil det kontrolleres at det er plass i tabellen. Hvis tabellen er full økes kapasiteten slik:

 

int newCapacity = (oldCapacity * 3)/2 + 1;

 

Gir du startkapasitet 10 og legger til 11 elementer har du altså en tabell med plass til 16 elementer. Fyller du opp den økes tabellen til 25, og så videre. Den gamle informasjonen kopieres over.

Har du en link til site dette forklares på? Jeg har problemer med å finne dette selv, og en referanse til en post på et forum tror jeg ikke holder som en referanse i en oppgave. Kjekk info forresten! :)

Lenke til kommentar

Hvis du skal la en ArrayList vokse selv til 30 mill vill programmet ditt sannsynligvis bli utrolig tregt når det må begynner å kopiere flere megabyte frem og tilbake hver gang den går full, og du har sannsynligvis ikke plass til så mange objekter i minnet heller (Objekter gir en del minne-overhead). Bruk en LinkedList hvis du absolutt vil bruke ferdige datastrukturer.

 

Finn ut hvor stor plass du trenger og putt dem inn i et statisk long array som er stort nok. Hvor mye minne programmet skal få bruke til heap setter du med -Xmx128m (for 128MB)

Lenke til kommentar

(2^31)-1 er nok den maksimale lengden på en ArrayList. ArrayList indekseres med "int" og dersom vi ser i Java APIen (Integer klassen) finner vi følgende:

 

MAX_VALUE,

          A constant holding the maximum value an int can have, (2^31)-1.

 

Er ikke 100% sikker på dette, bare 99%. Kan jo være mulig med et eller annet lurt triks, men siden "int" går igjen som parameter og returverdi i svært mange av metodene i ArrayList tviler jeg sterkt på at det er mulig å overstige MAX_VALUE.

Endret av mar
Lenke til kommentar
Hvis du skal la en ArrayList vokse selv til 30 mill  vill programmet ditt sannsynligvis bli utrolig tregt når det må begynner å kopiere flere megabyte frem og tilbake hver gang den går full, og du har sannsynligvis ikke plass til så mange objekter i minnet heller (Objekter gir en del minne-overhead). Bruk en LinkedList hvis du absolutt vil bruke ferdige datastrukturer.

 

Finn ut hvor stor plass du trenger og putt dem inn i et statisk long array som er stort nok. Hvor mye minne programmet skal få bruke til heap setter du med -Xmx128m (for 128MB)

Det er vel egentlig ikke strengt tatt nødvendig med noen kopiering fram og tilbake hvis du i utgangspunktet oppretter ArrayListen med en høy kapasitet :

 

ArrayList<Long> primtall = new ArrayList<Long>(30000000);

 

Ellers foregår kopieringen når du øker kapasiteten med en native metode (implementert med pekere tror jeg), så det går raskt, men det vil selvsagt bruke mye mindre minne hvis du ikke bruker wrapper-klassen.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...