Eh bien, vous pouvez également créer des vecteurs en java - Vector v = new Vector(3, 2);
sgsi
Ne jamais utiliser Vector, utiliser ArrayListou LinkedListouArrayDeque
Réponses:
365
Différences
Les vecteurs sont synchronisés, les ArrayLists ne le sont pas.
Méthodes de croissance des données
Utilisez ArrayLists s'il n'y a aucune exigence spécifique pour utiliser les vecteurs.
Synchronisation
Si plusieurs threads accèdent simultanément à une ArrayList, nous devons synchroniser en externe le bloc de code qui modifie la liste soit structurellement, soit simplement un élément. La modification structurelle signifie l'ajout ou la suppression d'élément (s) de la liste. La définition de la valeur d'un élément existant n'est pas une modification structurelle.
Collections.synchronizedList est normalement utilisé au moment de la création de la liste pour éviter tout accès accidentel non synchronisé à la liste.
En interne, ArrayList et Vector conservent leur contenu à l'aide d'un tableau. Lorsqu'un élément est inséré dans une liste de tableaux ou un vecteur, l'objet devra étendre son tableau interne s'il manque de place. Par défaut, un vecteur double la taille de son tableau, tandis que ArrayList augmente sa taille de tableau de 50%.
Qu'en est-il de la lecture à partir d'une liste de tableaux de manière multithread? Est-ce que c'est thread-safe?
Xunie
@Xunie La lecture depuis ArrayList ou d'autres classes de collection ne sera jamais un problème. Le problème se produit lorsque vous ajoutez, supprimez ou modifiez des valeurs existantes à ArrayList ou à la collection.
sainath reddy
85
Comme l'indique la documentation, a Vectoret an ArrayListsont presque équivalents. La différence est que l'accès à un Vectorest synchronisé, alors que l'accès à un ArrayListne l'est pas. Cela signifie qu'un seul thread peut appeler des méthodes Vectorà la fois, et qu'il y a un léger surcoût dans l'acquisition du verrou; si vous utilisez un ArrayList, ce n'est pas le cas. En règle générale, vous voudrez utiliser un ArrayList; dans le cas à filetage unique, c'est un meilleur choix, et dans le cas à filetage multiple, vous obtenez un meilleur contrôle sur le verrouillage. Vous souhaitez autoriser les lectures simultanées? Bien. Vous souhaitez effectuer une synchronisation pour un lot de dix écritures? Aussi très bien. Cela nécessite un peu plus de soin de votre côté, mais c'est probablement ce que vous voulez. Notez également que si vous avez une ArrayList, vous pouvez utiliser leCollections.synchronizedListpour créer une liste synchronisée, vous obtenant ainsi l'équivalent d'un Vector.
Vectorest une brisée classe qui est pas threadsafe, bien qu'il soit « synchronisé » et est uniquement utilisé par les étudiants et les autres programmeurs inexpérimentés.
ArrayList est l'implémentation de la liste de référence utilisée par les professionnels et les programmeurs expérimentés.
Les professionnels souhaitant une implémentation de la liste threadsafe utilisent a CopyOnWriteArrayList.
synchronisé mais pas threadsafe? Qu'est-ce que ça veut dire? [Je suis débutant]
Dineshkumar
13
@Dineshkumar Vectorétait censé être threadsafe, mais a un défaut de conception qui le rend * pas en fait threadsafe, il s'agit essentiellement d'une classe déconseillée. Pour une raison quelconque, les universités, etc. n'ont pas entendu parler de cette nouvelle et préconisent toujours son utilisation.
Pouvez-vous soutenir la réclamation en témoignant 20-30% faster?
utilisateur
5
@user À l'époque, c'était juste une expérience personnelle de claquements d'énormes tableaux. Plus de trois ans maintenant, je ne peux pas vous indiquer exactement de quoi je parlais, mais il y a beaucoup de repères là-bas. Il faut attendre que vous voyiez les plus gros sauts, mais en voici un: javacodegeeks.com/2010/08/…
Oli
Les 20-30% ne correspondent que si vous lisez ET écrivez dans le Vector / Arraylist, car la fonction de croissance aura le plus grand impact. Si vous avez un benchmark qui n'écrit qu'une seule fois et effectue ensuite des lectures uniquement, le résultat sera différent
Tobi
2
Veuillez fournir une preuve de vos données
wiredmark
Étant donné que le vecteur est synchronisé et que l'arraylist n'est pas synchronisé, cela peut être une raison, l'arraylist est plus rapide que le vecteur.
DEMANDER le
23
Il existe 2 différences majeures entre Vector et ArrayList.
Le vecteur est synchronisé par défaut, et ArrayList ne l'est pas. Remarque: vous pouvez également synchroniser ArrayList en passant un objet arraylist à la méthode Collections.synchronizedList (). Synchronisé signifie: il peut être utilisé avec plusieurs threads sans aucun effet secondaire.
Les listes de tableaux augmentent de 50% par rapport à la taille précédente lorsque l'espace n'est pas suffisant pour le nouvel élément, alors que Vector augmente de 100% par rapport à la taille précédente lorsqu'il n'y a pas d'espace pour le nouvel élément entrant.
En dehors de cela, il existe des différences pratiques entre eux, en termes d'effort de programmation:
Pour obtenir l'élément à un emplacement particulier de Vector, nous utilisons la fonction elementAt (int index). Ce nom de fonction est très long. Au lieu de cela dans ArrayList, nous avons get (int index) qui est très facile à mémoriser et à utiliser.
De même, pour remplacer un élément existant par un nouvel élément dans Vector, nous utilisons la méthode setElementAt (), qui est encore très longue et peut irriter le programmeur à l'utiliser à plusieurs reprises. A la place de cette ArrayList a une méthode add (int index, object) qui est facile à utiliser et à mémoriser. Comme cela, ils ont des noms de fonctions plus conviviaux et faciles à utiliser dans ArrayList.
Quand utiliser lequel?
Essayez d'éviter d'utiliser complètement les vecteurs. Les ArrayLists peuvent faire tout ce qu'un vecteur peut faire. Plus sur ArrayLists ne sont pas synchronisés par défaut. Si vous le souhaitez, vous pouvez le synchroniser quand vous en avez besoin en utilisant la classe util Collections.
ArrayList a des noms de fonction faciles à mémoriser et à utiliser.
Remarque : même si l'arraylist augmente de 100%, vous pouvez éviter cela en utilisant la méthode ensurecapacity () pour vous assurer que vous allouez suffisamment de mémoire aux étapes initiales.
Je ne comprends pas comment le nom de la méthode peut être un critère pour utiliser ou ne pas utiliser cette méthode.
Surender Kherwa
14
ArrayListet les Vectordeux implémentent l'interface List et maintiennent l'ordre d'insertion. Mais il existe de nombreuses différences entre les classes ArrayListet Vector...
Vector incréments de 100% signifie que la taille du tableau est doublée si le nombre total d'éléments dépasse sa capacité.
Vector est une classe héritée.
Vector est lent car il est synchronisé, c'est-à-dire dans un environnement multithreading, il maintiendra les autres threads dans un état exécutable ou non exécutable jusqu'à ce que le thread actuel libère le verrou de l'objet.
Vectorutilise l'interface d'énumération pour parcourir les éléments. Mais il peut également utiliser Iterator.
Fondamentalement, ArrayList et Vector utilisent tous deux un tableau d'objets interne.
ArrayList: la classe ArrayList étend AbstractList et implémente l'interface List et RandomAccess (interface marqueur). ArrayList prend en charge les tableaux dynamiques qui peuvent évoluer selon les besoins. Cela nous donne une première itération sur les éléments. ArrayList utilise un tableau d'objets interne; ils sont créés avec une taille initiale par défaut de 10. Lorsque cette taille est dépassée, la collection augmente automatiquement jusqu'à la moitié de la taille par défaut qui est 15.
Vecteur: Le vecteur est similaire à ArrayList mais les différences sont, il est synchronisé et sa taille initiale par défaut est 10 et lorsque la taille dépasse sa taille augmente au double de la taille d'origine, ce qui signifie que la nouvelle taille sera 20. Le vecteur est la seule classe autre qu'ArrayList pour implémenter RandomAccess. Vector a quatre constructeurs sur lesquels on prend deux paramètres Vector (int initialCapacity, int capacityIncrement) capacityIncrement est la quantité par laquelle la capacité est augmentée lorsque le vecteur déborde, donc il a plus de contrôle sur le facteur de charge.
Pourquoi ajouter un objet au début et à la fin dans LinkedList est lent? Cela ne devrait-il pas être plus rapide que les DEUX arrayList et vector?
CHANist
@CHANist Je suis d'accord aussi. L'ajout d'un objet au début et à la fin devrait être plus rapide que l'ajout d'un objet au milieu.
Rahul Rastogi
1
Le langage utilisé dans la colonne LinkedList de ce tableau est contradictoire. L'ajout et l'ajout à une LinkedList sont plus rapides que l'ajout d'éléments au milieu, mais plus lents que l'ajout ou l'ajout aux ArrayLists ou aux vecteurs. En effet, chaque insertion nécessite une allocation de mémoire avec des références non locales, ce qui augmente les risques de manquements au cache. Même si la recherche dans une LinkedList est linéaire avec le nombre d'éléments et qu'un pointeur vers la fin n'est pas stocké, l'ajout est toujours plus rapide que le pré-ajout car la mémoire n'est réallouée que pour un élément.
Vector v = new Vector(3, 2);
Vector
, utiliserArrayList
ouLinkedList
ouArrayDeque
Réponses:
Différences
Utilisez ArrayLists s'il n'y a aucune exigence spécifique pour utiliser les vecteurs.
Synchronisation
Si plusieurs threads accèdent simultanément à une ArrayList, nous devons synchroniser en externe le bloc de code qui modifie la liste soit structurellement, soit simplement un élément. La modification structurelle signifie l'ajout ou la suppression d'élément (s) de la liste. La définition de la valeur d'un élément existant n'est pas une modification structurelle.
Collections.synchronizedList
est normalement utilisé au moment de la création de la liste pour éviter tout accès accidentel non synchronisé à la liste.Référence
Croissance des données
En interne, ArrayList et Vector conservent leur contenu à l'aide d'un tableau. Lorsqu'un élément est inséré dans une liste de tableaux ou un vecteur, l'objet devra étendre son tableau interne s'il manque de place. Par défaut, un vecteur double la taille de son tableau, tandis que ArrayList augmente sa taille de tableau de 50%.
Référence
la source
Comme l'indique la documentation, a
Vector
et anArrayList
sont presque équivalents. La différence est que l'accès à unVector
est synchronisé, alors que l'accès à unArrayList
ne l'est pas. Cela signifie qu'un seul thread peut appeler des méthodesVector
à la fois, et qu'il y a un léger surcoût dans l'acquisition du verrou; si vous utilisez unArrayList
, ce n'est pas le cas. En règle générale, vous voudrez utiliser unArrayList
; dans le cas à filetage unique, c'est un meilleur choix, et dans le cas à filetage multiple, vous obtenez un meilleur contrôle sur le verrouillage. Vous souhaitez autoriser les lectures simultanées? Bien. Vous souhaitez effectuer une synchronisation pour un lot de dix écritures? Aussi très bien. Cela nécessite un peu plus de soin de votre côté, mais c'est probablement ce que vous voulez. Notez également que si vous avez une ArrayList, vous pouvez utiliser leCollections.synchronizedList
pour créer une liste synchronisée, vous obtenant ainsi l'équivalent d'unVector
.la source
Vector
est une brisée classe qui est pas threadsafe, bien qu'il soit « synchronisé » et est uniquement utilisé par les étudiants et les autres programmeurs inexpérimentés.ArrayList
est l'implémentation de la liste de référence utilisée par les professionnels et les programmeurs expérimentés.Les professionnels souhaitant une implémentation de la liste threadsafe utilisent a
CopyOnWriteArrayList
.la source
Vector
était censé être threadsafe, mais a un défaut de conception qui le rend * pas en fait threadsafe, il s'agit essentiellement d'une classe déconseillée. Pour une raison quelconque, les universités, etc. n'ont pas entendu parler de cette nouvelle et préconisent toujours son utilisation.ArrayList
est plus récent et 20-30% plus rapide.Si vous n'avez pas besoin de quelque chose qui soit explicite
Vector
, utilisezArrayList
la source
20-30% faster
?Il existe 2 différences majeures entre Vector et ArrayList.
Le vecteur est synchronisé par défaut, et ArrayList ne l'est pas. Remarque: vous pouvez également synchroniser ArrayList en passant un objet arraylist à la méthode Collections.synchronizedList (). Synchronisé signifie: il peut être utilisé avec plusieurs threads sans aucun effet secondaire.
Les listes de tableaux augmentent de 50% par rapport à la taille précédente lorsque l'espace n'est pas suffisant pour le nouvel élément, alors que Vector augmente de 100% par rapport à la taille précédente lorsqu'il n'y a pas d'espace pour le nouvel élément entrant.
En dehors de cela, il existe des différences pratiques entre eux, en termes d'effort de programmation:
Quand utiliser lequel?
Remarque : même si l'arraylist augmente de 100%, vous pouvez éviter cela en utilisant la méthode ensurecapacity () pour vous assurer que vous allouez suffisamment de mémoire aux étapes initiales.
J'espère que cela aide.
la source
ArrayList
et lesVector
deux implémentent l'interface List et maintiennent l'ordre d'insertion. Mais il existe de nombreuses différences entre les classesArrayList
etVector
...ArrayList -
ArrayList
n'est pas synchronisé.ArrayList
incrémente 50% de la taille actuelle du tableau si le nombre d'éléments dépasse de sa capacité.ArrayList
n'est pas une classe héritée, elle est introduite dans JDK 1.2.ArrayList
est rapide car non synchronisé.ArrayList
utilise l'interface Iterator pour parcourir les éléments.Vecteur -
Vector
est synchronisé.Vector
incréments de 100% signifie que la taille du tableau est doublée si le nombre total d'éléments dépasse sa capacité.Vector
est une classe héritée.Vector
est lent car il est synchronisé, c'est-à-dire dans un environnement multithreading, il maintiendra les autres threads dans un état exécutable ou non exécutable jusqu'à ce que le thread actuel libère le verrou de l'objet.Vector
utilise l'interface d'énumération pour parcourir les éléments. Mais il peut également utiliser Iterator.Voir aussi: https://www.javatpoint.com/difference-between-arraylist-and-vector
la source
Fondamentalement, ArrayList et Vector utilisent tous deux un tableau d'objets interne.
ArrayList: la classe ArrayList étend AbstractList et implémente l'interface List et RandomAccess (interface marqueur). ArrayList prend en charge les tableaux dynamiques qui peuvent évoluer selon les besoins. Cela nous donne une première itération sur les éléments. ArrayList utilise un tableau d'objets interne; ils sont créés avec une taille initiale par défaut de 10. Lorsque cette taille est dépassée, la collection augmente automatiquement jusqu'à la moitié de la taille par défaut qui est 15.
Vecteur: Le vecteur est similaire à ArrayList mais les différences sont, il est synchronisé et sa taille initiale par défaut est 10 et lorsque la taille dépasse sa taille augmente au double de la taille d'origine, ce qui signifie que la nouvelle taille sera 20. Le vecteur est la seule classe autre qu'ArrayList pour implémenter RandomAccess. Vector a quatre constructeurs sur lesquels on prend deux paramètres Vector (int initialCapacity, int capacityIncrement) capacityIncrement est la quantité par laquelle la capacité est augmentée lorsque le vecteur déborde, donc il a plus de contrôle sur le facteur de charge.
Quelques autres différences sont:
la source