Y a-t-il vraiment une si grande différence entre la performance de Vector
y ArrayList
? Est-ce une bonne pratique d'utiliser les ArrayLists à tout moment lorsque la sécurité des threads n'est pas un problème ?
Réponses
Trop de publicités?Vector date de l'époque précédant l'API de collecte et a été modifié depuis pour en faire partie. D'après ce que j'ai lu, la raison pour laquelle il n'est pas déprécié est que l'API de base en dépend.
ArrayList a été écrit à partir de zéro en tant que partie de l'API Collections et, en tant que tel, devrait être utilisé à moins que vous ne deviez prendre en charge les versions de Java jusqu'à 1.2.
Si vous avez besoin d'une ArrayList à sécurité thread, vous pouvez utiliser la méthode de fabrique statique Collections.synchronizedList(new ArrayList<type>);
pour générer votre liste.
Si la sécurité du fil n'est pas un problème, ArrayList
sera plus rapide car il n'aura pas à se synchroniser. Bien que vous deviez toujours déclarer votre variable en tant que List
afin que l'implémentation puisse être modifiée ultérieurement si nécessaire.
Je préfère gérer ma synchronisation de manière explicite car beaucoup d'opérations nécessitent des appels multiples. Par exemple :
if (!myList.isEmpty()) {
myList.get(0);
}
devrait être :
synchronized (myList) {
if (!myList.isEmpty()) {
myList.get(0);
}
}
Si la sécurité du fil n'est pas un problème, vous devriez toujours utiliser ArrayList
. Le vecteur a la surcharge de la synchronisation et il a été démontré que les différences de performance entre le vecteur et le vecteur sont minimes. ArrayList
y Vector
sont abyssales. Vous pouvez chercher sur Google de nombreux benchmarks de performance.
En voici une Timing et performance .
Sans tenir compte de la synchronisation, la principale différence entre Vector
y ArrayList
c'est que Vector
est un tableau redimensionnable (similaire à un Vecteur STL C++) et ArrayList
est une liste qui se trouve être soutenue par un tableau.
La différence se manifeste dans le setSize() méthode. Il n'existe pas de méthode équivalente dans ArrayList
. Certains ex-développeurs Java-C++ s'accrochent à ce sujet. Il existe un certain nombre de facile des moyens de contourner ce problème, qui ne devrait donc pas poser de problème.
Mais ne commettez pas l'erreur de dire à un développeur C++ qu'un fichier ArrayList
est l'équivalent d'un std::vector
. Vous n'en entendrez jamais la fin.
Liste de tableaux et vecteurs
1. Synchronisation et thread-safety
La première et principale différence entre Vector et ArrayList est que Vector est synchronisé et ArrayList ne l'est pas, ce qui signifie que toutes les méthodes qui modifient structurellement Vector, par ex. add ()
o remove ()
sont synchronisées, ce qui les rend thread-safe et leur permet d'être utilisées en toute sécurité dans un environnement multithread et concurrent. En revanche, les méthodes de ArrayList ne sont pas synchronisées et ne peuvent donc pas être utilisées dans un environnement multithread.
2. Vitesse et performance
ArrayList est bien plus rapide que Vector. Comme Vector est synchronisé et thread-safe, il paie le prix de la synchronisation, ce qui le rend un peu lent. D'autre part, ArrayList n'est pas synchronisé et rapide, ce qui en fait un choix évident dans un environnement d'accès monofilaire.
3. Capacité
Chaque fois que le vecteur franchit le seuil spécifié, il s'accroît de la valeur spécifiée dans le champ capacityIncrement, tandis que vous pouvez augmenter la taille de ArrayList en appelant ensureCapacity()
méthode.
4. Enumération et Iterator
Le vecteur peut retourner une énumération des éléments qu'il contient en appelant elements()
qui n'est pas rapide contrairement aux méthodes Iterator et ListIterator
retourné par ArrayList
.
5. Héritage
Un autre point à retenir est que Vector est l'une des classes livrées avec le JDK 1.0 et qui, à l'origine, ne faisait pas partie du cadre de collecte, mais dans les versions ultérieures, elle a été remaniée pour implémenter l'interface List afin de pouvoir faire partie du cadre de collecte.