Pourquoi Java Vector n'est pas utilisé

introduction

En C ++, std :: vector est utilisé pour les tableaux de longueur variable, mais en Java, java.util.ArrayList est généralement utilisé, et java.util.Vector, qui semble avoir des fonctions similaires, est utilisé. ne pas.

――Il semble lent car il se synchronise --Si vous voulez une liste synchronisée, vous devez utiliser java.util.Collections.synchronizedList ()

Je m'en fichais jusqu'à présent parce que je pensais avoir entendu une telle histoire il y a longtemps, mais je me suis soudainement intéressé, alors j'ai jeté un coup d'œil à la source d'OpenJDK.

Méthode vectorielle

Chaque méthode a certainement une clause synchronisée. Vous devez absolument utiliser ʻArrayList` lorsque vous n'avez pas besoin de synchronisation.

Vector.java


...
    public synchronized E get(int index) {
        if (index >= elementCount)
            throw new ArrayIndexOutOfBoundsException(index);

        return elementData(index);
    }
...
    public synchronized boolean add(E e) {
        modCount++;
        add(e, elementData, elementCount);
        return true;
    }
...

Différences par rapport aux collections.SynchronizedList

Alors, quelle est la différence entre Vector et Collections.SynchronizedList (new ArrayList <> ()) encapsulé avec ʻArrayList? Ce qui est différent à première vue, c'est le comportement d'Iterator. Dans Vector`, la méthode Iterator acquiert également le verrou comme les autres méthodes.

Vector.java


    private class Itr implements Iterator<E> {
...
        public E next() {
            synchronized (Vector.this) {
                checkForComodification();
                int i = cursor;
                if (i >= elementCount)
                    throw new NoSuchElementException();
                cursor = i + 1;
                return elementData(lastRet = i);
            }
        }
...

Pour SynchronizedCollections héritées par SyncronizedList, Iterator () renvoie le type d'encapsulation tel quel.

Collections.java


    static class SynchronizedCollection<E> implements Collection<E>, Serializable {
        private static final long serialVersionUID = 3053995032091335093L;

        final Collection<E> c;  // Backing Collection
        final Object mutex;     // Object on which to synchronize
...
        public Iterator<E> iterator() {
            return c.iterator(); // Must be manually synched by user!
        }

Si vous souhaitez parcourir une liste, obtenir le verrou uniquement dans une seule méthode ne suffit pas, et vous devrez éventuellement verrouiller vous-même tout le processus itératif ("doit être synchronisé manuellement"). par l'utilisateur! ") Peut-être que cela signifie.

Résumé

--Vector s'est synchronisé pour chaque méthode

Recommended Posts

Pourquoi Java Vector n'est pas utilisé
Le calendrier Java n'est pas un singleton.
Qu'est-ce que Java <>?
Qu'est-ce que 'java
Eclipse ne démarre pas après l'installation de Java 11
Pourquoi la comparaison de classe de type chaîne Java (==) ne peut pas être utilisée
[Java] Calculer le jour à partir de la date (ne pas utiliser la classe Calendar)
Génériques Java fréquemment utilisés
Qu'est-ce que l'encapsulation Java?
[Java] Quand var doit être utilisé et quand il ne doit pas être utilisé
Qu'est-ce que la technologie Java?
Qu'est-ce que Java API-java
Pourquoi preventDefault est nécessaire
[Java] Qu'est-ce que ArrayList?
[Java] com.sun.glass.WindowEvent est importé et la fenêtre ne se ferme pas
Sérialisation d'objets Java pourquoi et quand
Qu'est-ce que l'assertion Java? Résumé.
DateFormat n'est pas thread-safe
"tx" n'est pas une erreur liée
java ArrayList, Vector, comparaison LinkedList
Livres utilisés pour apprendre Java
Qu'est-ce qu'une collection Java?
[Windows] Le code Java est déformé
Pourquoi Kotlin est si pratique
[Ruby] À quoi sert «!!»?
[Java] Qu'est-ce que jaee j2ee?
[Java] Qu'est-ce que l'héritage de classe?
fields_for est utilisé comme ceci
[Rails] fields_for n'est pas affiché
[Notions de base Java] Qu'est-ce que la classe?
Qu'est-ce que l'analyse Java Escape?
5ème jour de Java
Project facet Java version 13 n'est pas pris en charge. Comment faire avec