Когда инициализируется поле счета Java Hashtable? - PullRequest
0 голосов
/ 29 ноября 2018

При чтении исходного кода Java Hashtable я заметил, что поле count Hashtable не инициализируется при объявлении. Я вижу, что в методе readObject есть этот код:

count = 0;

Когда инициализируется поле счета?

1 Ответ

0 голосов
/ 29 ноября 2018

readObject также вызывает reconstitutionPut(table, key, value) для каждой пары ключ-значение, и этот метод увеличивает count.

Вот соответствующий код с соответствующими строками, помеченными:

private void readObject(java.io.ObjectInputStream s)
     throws IOException, ClassNotFoundException
{
    ...
    count = 0;

    // Read the number of elements and then all the key/value objects
    for (; elements > 0; elements--) {
        @SuppressWarnings("unchecked")
            K key = (K)s.readObject();
        @SuppressWarnings("unchecked")
            V value = (V)s.readObject();
        // synch could be eliminated for performance
        reconstitutionPut(table, key, value); // <---------------
    }
}

private void reconstitutionPut(Entry<?,?>[] tab, K key, V value)
    throws StreamCorruptedException
{
    if (value == null) {
        throw new java.io.StreamCorruptedException();
    }
    // Makes sure the key is not already in the hashtable.
    // This should not happen in deserialized version.
    int hash = key.hashCode();
    int index = (hash & 0x7FFFFFFF) % tab.length;
    for (Entry<?,?> e = tab[index] ; e != null ; e = e.next) {
        if ((e.hash == hash) && e.key.equals(key)) {
            throw new java.io.StreamCorruptedException();
        }
    }
    // Creates the new entry.
    @SuppressWarnings("unchecked")
        Entry<K,V> e = (Entry<K,V>)tab[index];
    tab[index] = new Entry<>(hash, key, value, e);
    count++;  // <---------------
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...