27 votes

ArrayList vs. Vecteurs en Java si la sécurité des threads n'est pas un problème

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 ?

39voto

Christian P. Points 2268

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.

15voto

Aaron Points 5589

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);
   }
}

9voto

bruno conde Points 28120

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 .

5voto

James Schek Points 11070

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.

2voto

Sumit Singh Points 8601

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X