Warum Java Vector nicht verwendet wird

Einführung

In C ++ wird "std :: vector" für Arrays variabler Länge verwendet, in Java wird jedoch normalerweise "java.util.ArrayList" verwendet, und "java.util.Vector", das ähnliche Funktionen zu haben scheint, wird verwendet. nicht.

――Es scheint langsam zu sein, weil es synchronisiert

Bis jetzt war mir das egal, weil ich dachte, ich hätte eine solche Geschichte schon vor langer Zeit gehört, aber plötzlich wurde ich interessiert, also schaute ich mir die Quelle von OpenJDK an.

Vektormethode

Sicherlich hat jede Methode eine synchronisierte Klausel. Sie sollten auf jeden Fall "ArrayList" verwenden, wenn Sie keine Synchronisation benötigen.

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

Unterschiede zu Collections.SynchronizedList

Was ist also der Unterschied zwischen Vector und Collections.SynchronizedList (new ArrayList <> ()) umwickelt mit ArrayList? Was auf den ersten Blick anders ist, ist das Verhalten von Iterator. In Vector erhält die Iterator-Methode wie andere Methoden auch die Sperre.

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

Für von SyncronizedList geerbte SynchronizedCollections gibt Iterator () den Wrapping-Typ unverändert zurück.

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!
        }

Wenn Sie eine Liste durchlaufen, reicht es nicht aus, die Sperre nur innerhalb einer einzigen Methode zu erhalten. Schließlich müssen Sie den gesamten iterativen Prozess selbst sperren ("Muss manuell synchronisiert werden"). vom Benutzer! ") Vielleicht bedeutet das.

Zusammenfassung

--Vector wurde für jede Methode synchronisiert

Recommended Posts

Warum Java Vector nicht verwendet wird
Java Calendar ist kein Singleton.
Was ist Java <>?
Was ist java
Eclipse wird nach der Installation von Java 11 nicht gestartet
Warum der Klassenvergleich vom Typ Java String (==) nicht verwendet werden kann
[Java] Tag ab Datum berechnen (Kalenderklasse nicht verwenden)
Häufig verwendete Java-Generika
Was ist Java-Kapselung?
[Java] Wann var verwendet werden soll und wann nicht
Was ist Java-Technologie?
Was ist Java API-Java?
Warum PreventDefault benötigt wird
[Java] Was ist ArrayList?
[Java] com.sun.glass.WindowEvent wird importiert und das Fenster wird nicht geschlossen
Java Object Serialization warum und wann
Was ist Java Assertion? Zusammenfassung.
DateFormat ist nicht threadsicher
"tx" ist kein gebundener Fehler
Java ArrayList, Vector, LinkedList Vergleich
Bücher zum Erlernen von Java
Was ist eine Java-Sammlung?
[Windows] Java-Code ist verstümmelt
Warum Kotlin so bequem ist
[Ruby] Wofür wird `!!` verwendet?
[Java] Was ist jaee j2ee?
[Java] Was ist Klassenvererbung?
fields_for wird so verwendet
[Rails] fields_for wird nicht angezeigt
[Java-Grundlagen] Was ist Klasse?
Was ist Java-Fluchtanalyse?
5. Tag von Java
Projektfacette Java Version 13 wird nicht unterstützt. Wie man damit umgeht