CodeGym/Java-blogg/Tilfeldig/ArrayList i bilder
John Squirrels
NivÄ
San Francisco

ArrayList i bilder

Publisert i gruppen
Hei! Dagens leksjon om ArrayListvil vÊre bÄde enklere og vanskeligere enn tidligere leksjoner.
ArrayList i bilder - 1
Det blir vanskeligere fordi vi i dag skal se under panseret ArrayListog studere hva som skjer under ulike operasjoner. PÄ den annen side vil denne leksjonen nesten ikke ha noen kode. Det er mest bilder og forklaringer. Vel, la oss gÄ:) Som du allerede vet, ArrayListhar en vanlig array inni, som fungerer som et datalager. I de fleste tilfeller spesifiserer vi ikke den nÞyaktige stÞrrelsen pÄ listen. Men den interne matrisen mÄ ha en viss stÞrrelse! Og det gjÞr det. StandardstÞrrelsen er 10 .
public static void main(String[] args) {
   ArrayList<Car> cars = new ArrayList<>();
}
ArrayList i bilder - 2 La oss fÞrst se hvordan det ser ut Ä legge til nye elementer. Den fÞrste oppgaven er Ä sjekke om den interne matrisen har nok plass i den interne matrisen og om ett element til vil passe. Hvis det er plass, legges det nye elementet til pÄ slutten av listen. NÄr vi sier "til slutten", mener vi ikke den siste posisjonen i matrisen (det ville vÊrt rart). Vi mener posisjonen etter det siste gjeldende elementet. Indeksen vil vÊre cars.size(). Listen vÄr er for Þyeblikket tom ( cars.size() == 0). FÞlgelig vil det nye elementet bli lagt til i posisjon 0.
ArrayList<Car> cars = new ArrayList<>();
Car ferrari = new Car("Ferrari 360 Spider");
cars.add(ferrari);
ArrayList i bilder - 3 Det er tydelig nok. Hva skjer hvis vi setter inn i midten, altsÄ mellom andre elementer?
public static void main(String[] args) {
   ArrayList<Car> cars = new ArrayList<>();
   Car ferrari = new Car("Ferrari 360 Spider");
   Car bugatti = new Car("Bugatti Veyron");
   Car lambo = new Car("Lamborghini Diablo");
   Car ford = new Car("Ford Modneo");

   cars.add(ferrari);
   cars.add(bugatti);
   cars.add(lambo);

   cars.add(1, ford);// add ford to cell 1, which is already occupied
}
Igjen, fĂžrst er det en sjekk om det er nok plass i arrayet. Hvis det er nok plass, flyttes elementene til hĂžyre , og starter med posisjonen der vi setter inn det nye elementet. Vi setter inn ved posisjon 1. Med andre ord, elementet fra posisjon 3 kopieres til posisjon 4, element 2 til posisjon 3, og element 1 til posisjon 2. ArrayList i bilder - 4 Deretter settes vĂ„rt nye element inn pĂ„ plass. Det forrige elementet (bugatti) er allerede kopiert derfra til en ny posisjon. ArrayList i bilder - 5 La oss nĂ„ se pĂ„ hvordan denne prosessen skjer hvis det ikke er noen steder Ă„ sette inn nye elementer i matrisen. ArrayList i bilder - 6 Naturligvis er det fĂžrst en sjekk for Ă„ se om det er nok plass. Hvis det ikke er nok plass, opprettes en ny matrise inne iArrayListhvis stĂžrrelse er stĂžrrelsen pĂ„ den gamle matrisen ganger 1,5 pluss 1 I vĂ„rt tilfelle vil den nye matrisens stĂžrrelse vĂŠre 16. Alle de gjeldende elementene vil bli kopiert dit umiddelbart. ArrayList i bilder - 7 Den gamle matrisen vil bli slettet av sĂžppelsamleren, og bare den nye, utvidede matrisen vil vĂŠre igjen. NĂ„ er det plass til et nytt element. Vi setter den inn i posisjon 3, som er opptatt. NĂ„ starter den kjente prosedyren. Alle elementene, som starter med indeks 3, flyttes en posisjon til hĂžyre, og det nye elementet legges stille til. ArrayList i bilder - 8 Og innsettingen er ferdig! Og vi er ferdige med innsetting. La oss nĂ„ snakke om Ă„ fjerne elementer . Du vil huske at vi fikk et problem nĂ„r vi jobbet med matriser: fjerning av elementer lager "hull" i en matrise.med hver fjerning, og vi mĂ„tte skrive vĂ„r egen kode hver gang for Ă„ utfĂžre dette skiftet. ArrayList fĂžlger samme prinsipp, men den implementerer allerede denne mekanismen. ArrayList i bilder - 9 Slik ser det ut: ArrayList i bilder - 10 Og til slutt fĂ„r vi det vi vil ha: ArrayList i bilder - 11 Elementet lamboer fjernet. Her fjernet vi et element fra midten. Det er klart at det gĂ„r raskere Ă„ fjerne et element fra slutten av listen, siden elementet ganske enkelt fjernes uten Ă„ mĂ„tte flytte alle de andre. La oss snakke igjen et Ăžyeblikk om dimensjonene til den interne matrisen og hvordan den er ordnet i minnet. Å utvide en matrise krever noen ressurser. FĂžlgelig, ikke lag enArrayListmed standardstĂžrrelsen hvis du er sikker pĂ„ at den vil ha minst 100 elementer. Den interne matrisen mĂ„ utvides 6 ganger nĂ„r du satte inn det 100. elementet, og alle elementene mĂ„tte forskyves hver gang.
  • fra 10 elementer til 16
  • fra 16 elementer til 25
  • fra 25 til 38
  • fra 38 til 58
  • fra 58 til 88
  • fra 88 til 133 (dvs. stĂžrrelsen pĂ„ den gamle matrisen ganger 1,5 pluss 1)
Som du kan forestille deg er dette ganske ressurskrevende. SĂ„ hvis du allerede vet (til og med omtrentlig) det nĂždvendige antallet elementer, er det bedre Ă„ lage en liste med en rekke av en bestemt stĂžrrelse:
ArrayList<Car> cars = new ArrayList<>(100);
NÄ vil minnet for en matrise pÄ 100 elementer bli allokert pÄ en gang, noe som gjÞr matrisen mer effektiv (det trenger ikke Ä utvides). Denne strategien har ogsÄ en bakside. NÄr du fjerner objekter fra en ArrayList, reduseres ikke stÞrrelsen pÄ den interne matrisen automatisk. Anta at vi har en ArrayListmed en helt full intern matrise pÄ 88 elementer: ArrayList i bilder - 12 Mens programmet kjÞrer, fjerner vi 77 elementer, sÄ bare 11 gjenstÄr: ArrayList i bilder - 13 Har du allerede gjettet hva problemet er? Du skjÞnner, ineffektiv bruk av minne! Vi bruker bare 11 posisjoner her, men vi har allokert minne for 88 elementer. Det er 8 ganger mer enn vi trenger! I dette tilfellet kan vi optimere minnebruken vÄr med en av ArrayListklassens spesialmetoder:trimToSize(). Denne metoden "trimmer" lengden pÄ den interne matrisen ned til antall elementer som for Þyeblikket er lagret i den. ArrayList i bilder - 14 NÄ har vi bare tildelt sÄ mye minne som vi trenger! :)
Kommentarer
  • PopulĂŠr
  • Ny
  • Gammel
Du mÄ vÊre pÄlogget for Ä legge igjen en kommentar
Denne siden har ingen kommentarer ennÄ