ArrayList - ajouter "mêmes" objets (même = & gt; equals, hashCode), Threads
Ive a obtenu une question. Ce qui se passe lorsque j'essaie d'ajouter le "même" objet deux fois à une liste de tableaux. Avec "le même", je veux dire un objet d'une classe individuelle, qui est identifié comme étant le même avec equals() et hashCode(). Il a des valeurs différentes pour la plupart des variables de membre et a été créé à partir peut-être des threads différents, mais pour equals() et hashCode() de sa le "même".
Le deuxième objet, puis remplacer le premier objet?
Aussi, ce qui se passe si deux threads tentent d'ajouter ces objets exactement au même moment à la liste de tableaux? Est-ce même possible? Si oui, ce qui se passe?
Merci! 🙂
[EDIT] Merci pour toutes ces réponses! Dois-je utiliser synchronizedList alors plutôt à l'aide de "synchroniser(liste){}"? --> j'ai lu les docs, même avec synchronizedList, pour réitérer synchroniser(liste) doit être utilisé
[EDIT2]
Peut un synchronizedList être déclarée comme une variable de membre? J'ai essayé, mais ça n'a pas fonctionné.
source d'informationauteur nano7
Vous devez vous connecter pour publier un commentaire.
Non,
ArrayList
ne pas essayer de détecter les doublons à tous - vous pouvez avoir unArrayList
avec exactement la même référence apparaissant plusieurs fois. Si vous voulez une collection d'éviter les doublons, vous avez besoin d'unSet
mise en œuvre - et si vous aussi veulent préserver un ordre d'insertion, vous voulez probablementLinkedHashSet
.Noter, cependant, que sans verrouillage
ArrayList
devrait pas être muté à partir de plusieurs threads en premier lieu - il n'est tout simplement pas destiné à être un "thread-safe" de la collection de cette manière. Plusieurs threads peuvent lire à partir d'unArrayList
sans synchronisation, mais pas pour les transformer. À partir de la documentation:Si vous souhaitez muter une collection à partir de plusieurs threads sans verrouillage, je vous suggère de regarder les collections de
java.util.simultanées
.Non, la plupart des développeurs ne explicites vérifie
Oui, c'est possible. Si plusieurs threads écrire/lire à partir de la même
ArrayList
puis utilisez lesynchronized
mot-clé à chaque fois que vous accédez à cette listeMODIFIER
Comme quelqu'un l'a souligné, je suppose que de vérifier si oui ou non le
ArrayList
contient l'objet à ajouter est assez cher. Si vous voulez vous assurer que l'objet est seulement ajouté une fois, j'aimerais suivre la recommandation ci-dessous de l'aide d'un LinkedHashSet. Selon l'API, lors de la tentative de ajouter à cette structure de données, ilIl permettra d'ajouter simplement. La liste n'a rien à voir avec
hashCode()
equals()
tout en introduction, il ne se soucie pas de doublons.ArrayList
n'est pas thread-safe, donc vous risquez de ne pas obtenir le résultat désiré. vous pouvez avoirsynchronizedList
deCollections
classeUn
ArrayList
peut contenir plusieurs références pour le même objet (l'identité de l'équivalence). Elle ne vérifie pasequals()
ouhashCode()
lors de l'ajout d'objets.Vous finirez juste avec deux références dans votre liste de tableaux.
ArrayList
n'est PAS "thread-safe" ...de sorte que le comportement si vous essayez d'avoir les deux fils à ajouter en même temps n'est pas défini. Peut-être essayer d'utiliser unSynchronizedList
si vous voulez faire quelque chose comme ça.Si vous essayez d'ajouter le même objet deux fois, il va travailler, ou si vous essayez d'ajouter 2 objets avec tout de même, il faudra encore travailler. Il n'est pas le plus pratique de le faire parce que plus difficile à jour de la liste.
globale: vous ne devriez pas le faire