Hej! Dagens lektion om
Det bliver sværere, for i dag skal vi se under motorhjelmen
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
Det er klart nok. Hvad sker der, hvis vi indsætter i midten, altså mellem andre elementer?
Derefter indsættes vores nye element på sin plads. Det tidligere element (bugatti) er allerede blevet kopieret derfra til en ny position.
Lad os nu se på, hvordan denne proces sker, hvis der ikke er steder at indsætte nye elementer i arrayet.
Der skal naturligvis først tjekkes, om der er plads nok. Hvis der ikke er plads nok, oprettes et nyt array inde i
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.
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.
Sådan ser det ud:
Og til sidst får vi, hvad vi ønsker:
Elementet
Mens programmet kører, fjerner vi 77 elementer, så kun 11 er tilbage:
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
Nu har vi kun tildelt så meget hukommelse, som vi har brug for! :)
ArrayList
bliver både nemmere og sværere end tidligere lektioner.

ArrayList
og 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, ArrayList
har 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<>();
}

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);

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
hvis 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. 




lambo
er 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 enArrayList
med 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)
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 ArrayList
med en fuldstændig fuld intern matrix på 88 elementer: 

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. 
GO TO FULL VERSION