CodeGym /Java blog /Tilfældig /ArrayList i billeder
John Squirrels
Niveau
San Francisco

ArrayList i billeder

Udgivet i gruppen
Hej! Dagens lektion om ArrayListbliver både nemmere og sværere end tidligere lektioner.
ArrayList i billeder - 1
Det bliver sværere, for i dag skal vi se under motorhjelmen ArrayListog studere, hvad der sker under forskellige operationer. På den anden side vil denne lektion næsten ikke have nogen kode. Det er mest billeder og forklaringer. Nå, lad os gå :) Som du allerede ved, ArrayListhar et almindeligt array indeni, som fungerer som et datalager. I de fleste tilfælde angiver vi ikke den nøjagtige størrelse på listen. Men det interne array skal have en vis størrelse! Og det gør det. Dens standardstørrelse er 10 .

public static void main(String[] args) {
   ArrayList<Car> cars = new ArrayList<>();
}
ArrayList i billeder - 2 Lad os først se, hvordan tilføjelse af nye elementer ser ud. Den første opgave er at kontrollere, om det interne array har nok plads i det interne array , og om et element mere vil passe. Hvis der er plads, tilføjes det nye element til slutningen af ​​listen. Når vi siger "til slutningen", mener vi ikke den sidste position i arrayet (det ville være mærkeligt). Vi mener positionen efter det sidste aktuelle element. Dens indeks vil være cars.size(). Vores liste er i øjeblikket tom ( cars.size() == 0). Følgelig vil det nye element blive tilføjet ved position 0.

ArrayList<Car> cars = new ArrayList<>();
Car ferrari = new Car("Ferrari 360 Spider");
cars.add(ferrari);
ArrayList i billeder - 3 Det er klart nok. Hvad sker der, hvis vi indsætter i midten, altså mellem 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
}
Igen er der først en kontrol af, om der er plads nok i arrayet. Hvis der er plads nok, flyttes elementerne til højre , begyndende med den position, hvor vi indsætter det nye element. Vi indsætter ved position 1. Med andre ord, elementet fra position 3 kopieres til position 4, element 2 til position 3 og element 1 til position 2. ArrayList i billeder - 4 Derefter indsættes vores nye element på sin plads. Det tidligere element (bugatti) er allerede blevet kopieret derfra til en ny position. ArrayList i billeder - 5 Lad os nu se på, hvordan denne proces sker, hvis der ikke er steder at indsætte nye elementer i arrayet. ArrayList i billeder - 6 Der skal naturligvis først tjekkes, om der er plads nok. Hvis der ikke er plads nok, oprettes et nyt array inde iArrayListhvis størrelse er størrelsen af ​​det gamle array gange 1,5 plus 1 I vores tilfælde vil det nye arrays størrelse være 16. Alle de nuværende elementer vil blive kopieret dertil med det samme. ArrayList i billeder - 7 Det gamle array vil blive slettet af garbage collector, og kun det nye, udvidede array forbliver. Nu er der plads til et nyt element. Vi indsætter den på position 3, som er optaget. Nu begynder den velkendte procedure. Alle elementerne, startende med indeks 3, flyttes en position til højre, og det nye element tilføjes stille og roligt. ArrayList i billeder - 8 Og indsættelsen er færdig! Og vi er færdige med indsættelse. Lad os nu tale om at fjerne elementer . Du vil huske, at vi stødte på et problem, da vi arbejdede med arrays: fjernelse af elementer giver "huller" i et array.med hver fjernelse, og vi var nødt til at skrive vores egen kode hver gang for at udføre dette skift. ArrayList følger samme princip, men den implementerer allerede denne mekanisme. ArrayList i billeder - 9 Sådan ser det ud: ArrayList i billeder - 10 Og til sidst får vi, hvad vi ønsker: ArrayList i billeder - 11 Elementet lamboer fjernet. Her fjernede vi et element fra midten. Det er klart, at det er hurtigere at fjerne et element fra slutningen af ​​listen, da elementet simpelthen fjernes uden at skulle flytte alle de andre. Lad os tale igen et øjeblik om dimensionerne af det interne array, og hvordan det er arrangeret i hukommelsen. Udvidelse af et array kræver nogle ressourcer. Derfor skal du ikke oprette enArrayListmed standardstørrelsen, hvis du er sikker på, at den vil have mindst 100 elementer. Det interne array skulle udvides 6 gange , når du indsatte det 100. element, og alle elementerne skulle flyttes 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 af ​​det gamle array gange 1,5 plus 1)
Som du kan forestille dig, er dette ret ressourcekrævende. Så hvis du allerede kender (endda cirka) det nødvendige antal elementer, er det bedre at oprette en liste med en række af en bestemt størrelse:

ArrayList<Car> cars = new ArrayList<>(100);
Nu vil hukommelsen for et array på 100 elementer blive allokeret på én gang, hvilket gør arrayet mere effektivt (det behøver ikke at blive udvidet). Denne strategi har også en bagside. Når du fjerner objekter fra en ArrayList, formindskes den interne matrixs størrelse ikke automatisk. Antag, at vi har en ArrayListmed en fuldstændig fuld intern matrix på 88 elementer: ArrayList i billeder - 12 Mens programmet kører, fjerner vi 77 elementer, så kun 11 er tilbage: ArrayList i billeder - 13 Har du allerede gættet, hvad problemet er? Du forstår det, ineffektiv brug af hukommelsen! Vi bruger kun 11 positioner her, men vi har allokeret hukommelse til 88 elementer. Det er 8 gange mere, end vi har brug for! I dette tilfælde kan vi optimere vores hukommelsesbrug med en af ArrayList​​klassens specielle metoder:trimToSize(). Denne metode "trimmer" længden af ​​det interne array ned til antallet af elementer, der i øjeblikket er gemt i det. ArrayList i billeder - 14 Nu har vi kun tildelt så meget hukommelse, som vi har brug for! :)
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION