¿Cómo puede HashMap.keySet () devolverá una vista de las teclas?

Bonsaisteak:

Esta es la función de conjunto de claves () dentro de la clase java.util.HasMap:

public Set<K> keySet() {
    Set<K> ks = keySet;
    if (ks == null) {
        ks = new KeySet();
        keySet = ks;
    }
    return ks;
}

En el comentario, se dice que esta función

Devuelve un conjunto {} @link vista de las claves contenidas en este mapa. El conjunto está respaldado por el mapa, por lo que los cambios en el mapa se reflejan en el conjunto, y viceversa.

Por lo tanto, esperaba que el objeto de tipo de conjunto de claves, que esta función devuelve contendrían una referencia a la "vista de las teclas". Sin embargo, cuando miro el código, la clase de conjunto de claves no contiene ningún campo en absoluto, y todas sus clases súper bien.

final class KeySet extends AbstractSet<K> {
    public final int size()                 { return size; }
    public final void clear()               { HashMap.this.clear(); }
    public final Iterator<K> iterator()     { return new KeyIterator(); }
    public final boolean contains(Object o) { return containsKey(o); }
    public final boolean remove(Object key) {
        return removeNode(hash(key), key, null, false, true) != null;
    }
    public final Spliterator<K> spliterator() {
        return new KeySpliterator<>(HashMap.this, 0, -1, 0, 0);
    }
    public final void forEach(Consumer<? super K> action) {
        Node<K,V>[] tab;
        if (action == null)
            throw new NullPointerException();
        if (size > 0 && (tab = table) != null) {
            int mc = modCount;
            for (int i = 0; i < tab.length; ++i) {
                for (Node<K,V> e = tab[i]; e != null; e = e.next)
                    action.accept(e.key);
            }
            if (modCount != mc)
                throw new ConcurrentModificationException();
        }
    }
}

Podría alguien explicar por favor

  1. ¿Qué significa "una visión de las teclas" significa? ¿Qué tipo de datos es "una visión"?
  2. ¿Cómo puede la HashMap.keySet () devuelve una visión de las teclas mediante el uso de objetos de conjunto de claves, que no contiene ninguna referencia a nada en absoluto?

Para hacerlo más claro:

Aquí es un ejemplo de código para imprimir el valor conjunto de claves. Aunque el objeto de conjunto de claves contiene la referencia a los datos de los mapas que contienen, ¿cómo puede esto exactamente salida de los datos clave pero no otros datos del mapa (no datos de valor o cualquier otra cosa). ¿Qué es lo que le dice a este objeto de conjunto de claves para sostener sólo MapKeys? No puedo ver esa instrucción en su código.

package com.tutorialspoint;
import java.util.*;

public class HashMapDemo {
   public static void main(String args[]) {

     // create hash map
     HashMap newmap = new HashMap();

     // populate hash map
     newmap.put(1, "tutorials");
     newmap.put(2, "point");
     newmap.put(3, "is best");

     // get keyset value from map
     Set keyset = newmap.keySet();

     // check key set values
     System.out.println("Key set values are: " + keyset);
   }    
}

ouput:

valores de ajuste clave son: [1, 2, 3]

dimo414:
  1. A " vista " es un tipo de objeto cuyos datos está respaldado por un objeto diferente, pero se proporciona de una manera diferente. En este caso, se proporciona una "visión" de la Mapllaves 's como una Set. Esto tiene una serie de beneficios, tanto para los usuarios como para el rendimiento.

    En particular, ya que comparte sus datos con la clase de apoyo que hay muy poca sobrecarga de memoria - que no necesita copiar todas las llaves en toda una nueva Set. Además, los usuarios no tienen que preocuparse por la vista saliendo de sincronía con la estructura de soporte - adiciones y eliminaciones serán visibles a través de la vista de inmediato.

  2. Debido a que KeySetes una clase interna que tiene acceso a los campos de una instancia de su clase que contiene ( HashMap). Note la HashMap.thisanotación en el fragmento de código.

    • size()'s return size;es una referencia a HashMap' s sizecampo
    • clear()'s HashMap.this.clear();llamadas HashMap' s clear()método (que tiene que utilizar HashMap.thispara hacer referencia del mapa clear()método en lugar de su propia)
    • contains()delegados HashMap's containsKey()método - esto no requerir HashMap.thisporque KeySetno tiene una chocar containsKey()método
    • remove()de manera similar a los delegados HashMap'sremoveNode()

    Si en cambio se declara como final static class KeySetque sería una clase anidada estática, que no está ligada a una instancia de la clase que contiene (es sólo una forma de organizar las clases relacionadas). En ese caso, KeySetsería necesario un compromiso explícito HashMapde campo, y tendría que ser pasado al constructor el mapa en cuestión. Las clases internas hacen que esta implícita (que es concisa, pero ciertamente a veces confuso).

  3. ¿Qué es lo que le dice a este objeto de conjunto de claves para sostener sólo MapKeys?

    Para que quede claro, no hay tal instrucción. Un KeySetejemplo transitivamente tiene acceso a todos los campos y métodos de la correlación de respaldo. Sin embargo, su ejemplo ( System.out.println("Key set values are: " + keyset);) se llama de forma implícita keyset.toString(), que es (intencionalmente) no se han aplicado para devolver valores del mapa. Debido a que KeySetse extiende AbstractSet(que a su vez se extiende AbstractCollection) su .toString()confía en la KeySet's iterator()aplicación, que proporciona un iterador sobre las teclas del mapa, no sus valores.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=185090&siteId=1
Recomendado
Clasificación