Er zijn twee manieren om objecten uit ArrayList in Java te verwijderen, ten eerste door de methode remove() te gebruiken, en ten tweede door Iterator te gebruiken. ArrayList biedt overloaded remove () methode, een accepteren index van het object te verwijderen dwz verwijderen(int index), en andere accepteren object te verwijderen, dwz verwijderen(Object obj). Vuistregel is, als je de index van het object kent, gebruik dan de eerste methode, anders gebruik de tweede methode. Trouwens, je moet onthouden om ArrayList remove methoden te gebruiken, alleen als je niet aan het itereren bent over ArrayList als je aan het itereren bent gebruik dan Iterator.remove () methode, niet te doen kan resulteren in ConcurrentModificationException in Java. Een andere gotcha kan zijn opgetreden als gevolg van autoboxing. Als je goed kijkt dat twee remove methoden, remove (int index) en remove(Object obj) niet te onderscheiden zijn als je probeert te verwijderen uit een ArrayList van gehele getallen.stel dat je drie objecten in ArrayList hebt, dat wil zeggen dat je het tweede object wilt verwijderen, dat is 2. U kunt remove(2) aanroepen, wat eigenlijk een aanroep is om te verwijderen(Object) als u autoboxing overweegt, maar zal worden geïnterpreteerd als een aanroep om 3e element te verwijderen, door te interpreteren als remove(index).
Ik heb dit probleem eerder besproken in mijn artikel over best practices om te volgen tijdens het overbelasting van methoden in Java. Vanwege minder bekende verbreding regel en autoboxing, slecht overbelaste methode kan veel ambiguïteit te creëren.
codevoorbeeld om elementen uit ArrayList
te verwijderen laten we bovenstaande theorie testen met een eenvoudig codevoorbeeld van ArrayList met gehele getallen. Het volgende programma heeft een ArrayList van gehele getallen die 1, 2 en 3 bevatten, d.w.z. dit komt precies overeen met de index.
package test; java importeren.util.ArrayList; java importeren.util.List;/** * * @author http://java67.blogspot.com */public class JavaTutorial{ /** * @param args the command line arguments */ public static void main(String args) { List<Integer> numbers = new ArrayList<integer>(); getallen.add(1); nummers.toevoegen(2); getallen.add(3); systeem.uit.println ("ArrayList bevat:" + nummers); / / bellen verwijderen (index) nummers.remove(1); //object verwijderen bij index 1 dat wil zeggen 2e Object, dat is 2 //het aanroepen van (object) nummers verwijderen.remove (3); }}Output:ArrayList bevat : uitzondering in thread "main" java.lang.Indexoutofboundsexceptie: Index: 3, Grootte: 2 op java.util.ArrayList.rangeCheck (ArrayList.java: 635) op java.util.ArrayList.verwijderen (ArrayList.java: 474) tijdens de test.Test.main (Test.java: 33) Java resultaat: 1
U kunt zien dat tweede aanroep ook wordt behandeld als verwijderen (index). De beste manier om dubbelzinnigheid te verwijderen is om autoboxing uit te schakelen en een daadwerkelijk object te leveren, zoals hieronder wordt getoond.
systeem.uit.println ("ArrayList Before:" + nummers); / / aanroepen verwijder (index)nummers.remove(1); //object verwijderen bij index 1 dat wil zeggen 2e Object, dat is 2 //het aanroepen van (object)nummers verwijderen.remove(new Integer (3));System.uit.println ("ArrayList After:" + numbers); Output :ArrayList Before : ArrayList After :
Deze keer werkt het, maar ik ben bang voor luie ontwikkelaars zoals ik, die autoboxing toegestaan. Laten we nu eens kijken naar het verwijderen van het object uit ArrayList terwijl we er over itereren. U moet bekend zijn met Iterator in Java, voordat u verder gaat.
Object uit ArrayList verwijderen met Iterator
dit is eigenlijk een subtiel detail van Java programmeren, niet duidelijk voor beginners, omdat de compiler niet zal klagen, zelfs niet als je de methode remove() uit java gebruikt.util.ArrayList, tijdens het gebruik van Iterator. U zult alleen uw fout te realiseren, wanneer u Concurrentmodificationexceptie, die zelf misleidend is en u kunt talloze uren besteden aan het vinden van een andere draad, die is het wijzigen van die ArrayList, als gevolg van gelijktijdige woord. Laat een voorbeeld zien.
public static void main(String args) { List<Integer> numbers = new ArrayList<Integer>(); nummers.toevoegen(101); getallen.Tel(200); getallen.add(301); nummers.add (400); systeem.uit.println ("ArrayList Before:" + nummers); Iterator<Integer> itr = numbers.iterator(); // remove all even numbers while (itr.hasNext()) { Integer number = itr.next(); if (number % 2 == 0) { numbers.remove(number); } } System.out.println("ArrayList After : " + numbers); }Output :ArrayList Before : Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859) at java.util.ArrayList$Itr.next(ArrayList.java:831) at Testing.main(Testing.java:28)
U kunt Modificatieuitzondering, als gevolg van call to remove() methode uit ArrayList. Dit is eenvoudig in eenvoudige voorbeelden als deze, maar in een echt project, het kan echt moeilijk zijn. Nu, om deze uitzondering op te lossen, vervang gewoon de aanroep van nummers.remove () to itr.remove (), dit zal het huidige object verwijderen dat u aan het herhalen bent, zoals hieronder getoond :
systeem.uit.println ("ArrayList Before:" + numbers); Iterator<Integer> itr = numbers.iterator (); / / verwijder alle even numberswhile (itr.hasNext ()) {Integer number = itr.volgend(); if (nummer % 2 = = 0) { itr.remove ();}} systeem.uit.println ("ArrayList After:" + numbers); OutputArrayList Before : ArrayList After :
dat is alles op dit bericht over het verwijderen van objecten uit ArrayList in Java. We hebben twee manieren geleerd om een object of element uit de ArrayList te verwijderen. Trouwens, je moet altijd remove(index) gebruiken om object te verwijderen, als je niet aan het herhalen bent, gebruik anders altijd iterator ‘ s remove() methode voor het verwijderen van object uit ArrayList. Door de manier waarop bovenstaande tips zal werken met een index gebaseerde lijst implementatie.
Verder leren
Java In-Depth: Word een complete Java Engineer
Java Fundamentals: collecties
Data Structures and Algorithms: Deep Dive Using Java
Algorithms and Data Structures-Part 1 and 2
Data Structures in Java 9 by Heinz Kabutz