[JAVA] Vous pouvez ne pas vouloir utiliser la méthode remove sur ArrayList très souvent

Je me suis écrasé aujourd'hui alors je vais le laisser comme une note

Code source qui plante


fun releaseGroupItem(uri: Uri){

        var i = 0
        selectImageList.forEach {
            if (it.imageUri == uri){
                selectImageList.removeAt(i)
            }
            i++
        }

        val adapter = SelectImageFragmentAdapter(supportFragmentManager, selectImageList)
        select_image_pager.adapter = adapter
        indicator_default.setViewPager(select_image_pager)
}

Cela provoquera un crash avec java.util.ConcurrentModificationException lorsque cette méthode est appelée successivement.

C'est une histoire bien connue en Java, et j'y suis généralement accro lorsque je commence à peine à programmer. (J'ai déjà écrit du code qui provoque ce phénomène après 2 ans d'Android ...)

~~ Si la cause est ArrayList # remove, elle ne sera pas supprimée compte tenu de l'ordre de la liste. Il est bien résumé ci-dessous. ~~ (ajouté ci-dessous) http://programming-study.com/technology/java-list-remove/

Code qui ne plante pas


fun releaseGroupItem(uri: Uri){

        val iterator = selectImageList.iterator()
        while (iterator.hasNext()){
            val removeUri = iterator.next()
            if (removeUri.imageUri == uri) {
                iterator.remove()
            }
        }

        val adapter = SelectImageFragmentAdapter(supportFragmentManager, selectImageList)
        select_image_pager.adapter = adapter
        indicator_default.setViewPager(select_image_pager)
    }

Utilisez ʻiterator. Il semble que celui-ci a de meilleures performances, donc en gros vous pouvez utiliser ʻiterator sauf que l'élément à supprimer est simple et appelé une seule fois.

C'est un article vide, mais je vais le laisser comme une note personnelle.

* Une addition

Je vous l'ai dit dans la section commentaires!

https://docs.oracle.com/javase/jp/8/docs/api/java/util/ArrayList.html

Il semble que l'itérateur vous permet simplement d'ajouter et de supprimer des éléments dans la liste dans l'instruction for, mais ArrayList lève une exception lorsque vous le faites.

Merci d'avoir enseigné!

Recommended Posts

Vous pouvez ne pas vouloir utiliser la méthode remove sur ArrayList très souvent
Lorsque vous souhaitez utiliser la méthode à l'extérieur
Si vous souhaitez simuler une méthode dans RSpec, vous devez utiliser la méthode allow pour mock et la méthode singleton.
[RSpec] Lorsque vous souhaitez utiliser la variable d'instance du contrôleur dans le test [attribuer n'est pas recommandé]
Comment utiliser la méthode getter / setter (en orientation objet)
Je souhaite utiliser la méthode de désinfection autre que View.
Utilisez JLine lorsque vous souhaitez gérer les frappes sur la console caractère par caractère en Java
Comment utiliser la méthode link_to
Comment utiliser la méthode include?
Comment utiliser la méthode form_with
Si vous souhaitez inclure la classe parente dans @builder de Lombok
Je veux supprimer la marge supérieure dans UITableView de Grouped (swift)
Que faire lorsque vous souhaitez connaître la position source où la méthode est définie dans binding.pry
[Rails] Comment utiliser la méthode de la carte
[Java] Comment utiliser la méthode toString ()
Je veux utiliser @Autowired dans Servlet
À vous à qui on a dit "Ne pas utiliser Stream API" dans le champ
Je veux que vous utilisiez Enum # name () pour la clé de SharedPreference
Si vous souhaitez satisfaire la couverture de test des méthodes privées dans JUnit
Je veux que vous utilisiez Scala comme meilleur Java pour le moment
Lorsque vous souhaitez lier InputStream dans JDBI3
Sortie de la façon d'utiliser la méthode slice
[Swift] Utilisez nonzeroBitCount lorsque vous voulez popcnt dans Swift
Comment utiliser la méthode replace () (Java Silver)
Je veux obtenir la valeur en Ruby
[Introduction à Ruby] Comment utiliser la méthode slice
Pour ceux qui souhaitent utiliser MySQL pour la base de données dans la construction de l'environnement de Rails6 ~.
Code à utiliser lorsque vous souhaitez traiter Json en Java avec uniquement des bibliothèques standard
Je souhaite également utiliser Combine dans UIKit.
Je souhaite utiliser les fonctions pratiques de Clojure dans Kotlin
Je veux intégrer n'importe quel TraceId dans le journal
Je veux aussi utiliser des coquillages à Laradock! !!
Si hash [: a] [: b] [: c] = 0 dans Ruby, je veux que vous étendiez récursivement même si la clé n'existe pas
Je veux aussi utiliser ES2015 avec Java! → (´ ・ ω ・ `)
Je veux utiliser une petite icône dans Rails
Si vous souhaitez utiliser Mockito avec Kotlin, utilisez mockito-kotlin
Je veux appeler la méthode principale en utilisant la réflexion
Lorsque vous souhaitez remplacer dynamiquement l'annotation dans Java 8
[Commentaire approximatif] Je veux épouser la méthode du pluck
Mémo qui passe à l'écran de connexion si vous n'êtes pas connecté avec l'appareil
Lorsque vous souhaitez refléter les informations de la branche principale dans la branche actuelle sur laquelle vous travaillez actuellement
Comment obtenir le nom d'une classe / méthode exécutée en Java
[Débutant] Je souhaite modifier le fichier de migration-Comment utiliser la restauration-
Utilisez collection_select pour extraire les données stockées dans Active_Hash
Que faire lorsque la méthode n'est pas trouvée dans f: ajax
[Android, Java] Méthode pratique pour calculer la différence en jours
Comment créer une partie d'espace réservé à utiliser dans la clause IN
Je veux appeler une méthode et compter le nombre
Ce que vous utilisez souvent lorsque vous faites du développement Web avec Java
Je souhaite utiliser l'API Java 8 DateTime lentement (maintenant)
Créer une méthode pour renvoyer le taux de taxe en Java
Je souhaite passer au même écran dans l'état enregistré
Delicate est pratique à utiliser lorsque vous souhaitez réutiliser des pièces