Gids voor de Java ArrayList

1. Overzicht

In dit artikel gaan we het bekijken ArrayList class uit het Java Collections Framework. We bespreken de eigenschappen, algemene gebruiksscenario's en de voor- en nadelen ervan.

ArrayList bevindt zich in Java Core Libraries, dus u hebt geen extra bibliotheken nodig. Om het te gebruiken, voegt u gewoon de volgende importverklaring toe:

importeer java.util.ArrayList;

Lijst vertegenwoordigt een geordende reeks waarden waarbij een bepaalde waarde meer dan één keer kan voorkomen.

ArrayList is een van de Lijst implementaties die bovenop een array zijn gebouwd, die dynamisch kunnen groeien en krimpen als u elementen toevoegt / verwijdert. Elementen waren gemakkelijk toegankelijk via hun indexen, beginnend bij nul. Deze implementatie heeft de volgende eigenschappen:

  • Willekeurige toegang duurt O (1) tijd
  • Het toevoegen van een element kost een geamortiseerde constante tijd O (1)
  • Invoegen / verwijderen opnames Aan) tijd
  • Zoeken duurt Aan) tijd voor ongesorteerde array en O (logboek n) voor een gesorteerde

2. Maak een ArrayList

ArrayList heeft verschillende constructeurs en we zullen ze allemaal in deze sectie presenteren.

Merk eerst dat op ArrayList is een generieke klasse, dus u kunt het parametriseren met elk type dat u wilt en de compiler zorgt ervoor dat u bijvoorbeeld geen Geheel getal waarden binnen een verzameling van Snaren. U hoeft ook geen elementen te casten wanneer u ze uit een verzameling ophaalt.

Ten tweede is het een goede gewoonte om een ​​generieke interface te gebruiken Lijst als een variabel type, omdat het het loskoppelt van een bepaalde implementatie.

2.1. Standaard No-Arg Constructor

Lijstlijst = nieuwe ArrayList (); assertTrue (list.isEmpty ());

We creëren gewoon een leegte ArrayList voorbeeld.

2.2. Constructor accepteert initiële capaciteit

Lijstlijst = nieuwe ArrayList (20);

Hier specificeert u de initiële lengte van een onderliggende array. Dit kan u helpen voorkomen dat u onnodig de grootte wijzigt terwijl u nieuwe items toevoegt.

2.3. Constructor Accepteert Verzameling

Verzamelingsnummer = IntStream.range (0, 10) .boxed (). Collect (toSet ()); Lijstlijst = nieuwe ArrayList (cijfers); assertEquals (10, list.size ()); assertTrue (numbers.containsAll (lijst));

Merk op dat dat element van de Verzameling instantie worden gebruikt voor het vullen van de onderliggende array.

3. Voeg elementen toe aan het ArrayList

U kunt een element aan het einde of op de specifieke positie invoegen:

Lijstlijst = nieuwe ArrayList (); lijst.add (1L); lijst.add (2L); lijst.add (1, 3L); assertThat (Arrays.asList (1L, 3L, 2L), equalTo (lijst));

U kunt ook een verzameling of meerdere elementen tegelijk invoegen:

Lijstlijst = nieuwe ArrayList (Arrays.asList (1L, 2L, 3L)); LongStream.range (4, 10) .boxed () .collect (collectionAndThen (toCollection (ArrayList :: new), ys -> list.addAll (0, ys))); assertThat (Arrays.asList (4L, 5L, 6L, 7L, 8L, 9L, 1L, 2L, 3L), equalTo (lijst));

4. Herhaal de ArrayList

Er zijn twee soorten iterators beschikbaar: Iterator en ListIterator.

Terwijl de eerste u de mogelijkheid geeft om de lijst in één richting te doorlopen, stelt de laatste u in staat deze in beide richtingen te doorlopen.

Hier laten we u alleen de ListIterator:

Lijstlijst = nieuwe ArrayList (IntStream.range (0, 10) .boxed (). Collect (toCollection (ArrayList :: new))); ListIterator it = list.listIterator (list.size ()); Lijstresultaat = nieuwe ArrayList (list.size ()); while (it.hasPrevious ()) {resultaat.add (it.previous ()); } Collections.reverse (lijst); assertThat (resultaat, gelijk aan (lijst));

U kunt ook elementen zoeken, toevoegen of verwijderen met iterators.

5. Zoek het ArrayList

We laten zien hoe zoeken werkt met een verzameling:

Lijstlijst = LongStream.range (0, 16) .boxed () .map (Long :: toHexString) .collect (toCollection (ArrayList :: nieuw)); List stringsToSearch = nieuwe ArrayList (lijst); stringsToSearch.addAll (lijst);

5.1. Zoeken in een ongesorteerde lijst

Om een ​​element te vinden dat u kunt gebruiken index van() of lastIndexOf () methoden. Ze accepteren allebei een object en keren terug int waarde:

assertEquals (10, stringsToSearch.indexOf ("a")); assertEquals (26, stringsToSearch.lastIndexOf ("a"));

Als je alle elementen wilt vinden die aan een predikaat voldoen, kun je verzameling filteren met Java 8 Stream API (lees er hier meer over) met Predikaat soortgelijk:

Set matchingStrings = nieuwe HashSet (Arrays.asList ("a", "c", "9")); Lijstresultaat = stringsToSearch .stream () .filter (matchingStrings :: bevat) .collect (toCollection (ArrayList :: nieuw)); assertEquals (6, result.size ());

Het is ook mogelijk om een voor loop of een iterator:

Iterator it = stringsToSearch.iterator (); Set matchingStrings = nieuwe HashSet (Arrays.asList ("a", "c", "9")); Lijstresultaat = nieuwe ArrayList (); while (it.hasNext ()) {String s = it.next (); if (matchingStrings.contains (s)) {result.add (s); }}

5.2. Zoeken in een gesorteerde lijst

Als u een gesorteerde array heeft, kunt u een binair zoekalgoritme gebruiken dat sneller werkt dan lineair zoeken:

List copy = nieuwe ArrayList (stringsToSearch); Collections.sort (kopiëren); int index = Collections.binarySearch (kopie, "f"); assertThat (index, niet (gelijk aan (-1)));

Merk op dat als een element niet wordt gevonden, -1 wordt geretourneerd.

6. Elementen verwijderen uit het ArrayList

Om een ​​element te verwijderen, moet u de index ervan vinden en pas daarna de verwijdering uitvoeren via verwijderen() methode. Een overbelaste versie van deze methode, die een object accepteert, ernaar zoekt en de eerste keer dat een gelijk element voorkomt, verwijdert:

List list = nieuwe ArrayList (IntStream.range (0, 10) .boxed (). Collect (toCollection (ArrayList :: new))); Collections.reverse (lijst); list.remove (0); assertThat (list.get (0), equalTo (8)); list.remove (Integer.valueOf (0)); assertFalse (lijst. bevat (0));

Maar wees voorzichtig bij het werken met boxed types zoals Geheel getal. Om een ​​bepaald element te verwijderen, moet u eerst box int waarde of anderszins, een element wordt verwijderd door zijn index.

U kunt net zo goed het bovengenoemde gebruiken Stream API voor het verwijderen van verschillende items, maar we laten het hier niet zien. Hiervoor gebruiken we een iterator:

Set matchingStrings = HashSet (Arrays.asList ("a", "b", "c", "d", "e", "f")); Iterator it = stringsToSearch.iterator (); while (it.hasNext ()) {if (matchingStrings.contains (it.next ())) {it.remove (); }}

7. Samenvatting

In dit korte artikel hebben we de ArrayList in Java bekeken.

We hebben laten zien hoe je een ArrayList bijvoorbeeld hoe u elementen op verschillende manieren kunt toevoegen, zoeken of verwijderen.

Zoals gewoonlijk kun je alle codevoorbeelden vinden op GitHub.