ArrayList contre les Vecteurs en Java si la sécurité des threads n'est pas une préoccupation
Est-il vraiment beaucoup de différence entre la performance de Vector
et ArrayList
? Il est de bonne pratique d'utiliser ArrayLists en tout temps lorsque le thread de sécurité n'est pas un problème?
Vous devez vous connecter pour publier un commentaire.
Vecteur est issu de retour à partir de la pré-Collections de l'API jours, et ont été modifiés depuis être une partie de cela. De ce que j'ai lu, la raison pour laquelle il n'est pas obsolète est parce que l'API de base en dépend.
Liste de tableaux a été écrit à partir de zéro, comme une partie des Collections de l'API et, comme telle, doit être utilisé que si vous avez besoin de soutien versions de Java à 1.2.
Si vous avez besoin d'un thread-safe liste de tableaux, vous pouvez utiliser la statique de la méthode de fabrique
Collections.synchronizedList(new ArrayList<type>);
pour générer votre liste.Si la sécurité des threads n'est pas un problème,
ArrayList
sera plus rapide car il n'a pas à se synchroniser. Bien, vous devez toujours déclarer votre variable comme unList
de sorte que la mise en œuvre peut être changé plus tard en tant que de besoin.Je préfère gérer mon synchronisation explicitement, car beaucoup d'opérations nécessitent de multiples appels. Par exemple:
devrait être:
Si la sécurité des threads n'est pas un problème, vous devez toujours utiliser
ArrayList
. Vector a la surcharge de synchronisation et il a été démontré que les différences de performances entreArrayList
etVector
sont épouvantables. Vous pouvez google pour un grand nombre de critères de performance.Voici un Calendrier & Performance.
Ignorant la synchronisation, la principale différence entre
Vector
etArrayList
est queVector
est un tableau redimensionnable (similaire à un C++ STL Vecteur) etArrayList
est une Liste qui se trouve être soutenu par un tableau.La différence se manifeste dans la setSize() méthode. Il n'existe pas de méthode équivalente dans
ArrayList
. Certains ex-C++ Java développeurs sont accrochés sur ce. Il y a un certain nombre de facile façons de travailler autour d'elle, ce qui ne devrait pas être un problème.Il suffit de ne pas faire l'erreur de dire à un développeur C++ qu'un
ArrayList
est l'équivalent d'unstd::vector
. Vous n'entendrez jamais la fin.ArrayList contre les Vecteurs
1. La synchronisation et le fil de sécurité
D'abord et avant tout de la différence entre le Vecteur et ArrayList est que le Vecteur est synchronisé et ArrayList n'est pas, ce que cela signifie, c'est que toute la méthode qui modifie structurellement Vecteur par exemple
add ()
ouremove ()
sont synchronisés qui rend thread-safe et lui permet d'être utilisé en toute sécurité dans un environnement multi-thread et simultanées de l'environnement. D'autre part ArrayList méthodes ne sont pas synchronisés donc pas adapté pour une utilisation en environnement multi-thread.2. La vitesse et les Performances
ArrayList est beaucoup plus rapide que Vecteur. Depuis Vector est synchronisé et thread-safe, il paie le prix de la synchronisation, ce qui le rend peu lent. D'autre part ArrayList n'est pas synchronisé et rapide ce qui rend évident le choix dans un seul thread d'accès de l'environnement.
3. Capacité
Chaque fois que Vecteur franchi le seuil spécifié, il augmente de lui-même par la valeur spécifiée dans capacityIncrement champ, tandis que vous pouvez augmenter la taille de la liste de tableaux en appelant
ensureCapacity()
méthode.4. L'énumération et l'Itérateur
Vecteur peut retourner énumération d'éléments à tenir en appelant
elements()
méthode qui n'est pas de l'échec rapide, par opposition à d'Itérateur etListIterator
retourné parArrayList
.5. Héritage
Un autre point intéressant de se rappeler est le Vecteur est l'une de ces classes, qui est livré avec le JDK 1.0 et initialement pas partie du cadre de Collecte mais en version ultérieure, il a été re-factorisé pour mettre en œuvre la Liste de l'interface de sorte qu'il pourrait devenir une partie de la collection de cadre