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
- ¿Qué significa "una visión de las teclas" significa? ¿Qué tipo de datos es "una visión"?
- ¿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]
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
Map
llaves 's como unaSet
. 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.Debido a que
KeySet
es una clase interna que tiene acceso a los campos de una instancia de su clase que contiene (HashMap
). Note laHashMap.this
anotación en el fragmento de código.size()
'sreturn size;
es una referencia aHashMap
' ssize
campoclear()
'sHashMap.this.clear();
llamadasHashMap
' sclear()
método (que tiene que utilizarHashMap.this
para hacer referencia del mapaclear()
método en lugar de su propia)contains()
delegadosHashMap
'scontainsKey()
método - esto no requerirHashMap.this
porqueKeySet
no tiene una chocarcontainsKey()
métodoremove()
de manera similar a los delegadosHashMap
'sremoveNode()
Si en cambio se declara como
final static class KeySet
que 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,KeySet
sería necesario un compromiso explícitoHashMap
de 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).-
¿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
KeySet
ejemplo 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ícitakeyset.toString()
, que es (intencionalmente) no se han aplicado para devolver valores del mapa. Debido a queKeySet
se extiendeAbstractSet
(que a su vez se extiendeAbstractCollection
) su.toString()
confía en laKeySet
'siterator()
aplicación, que proporciona un iterador sobre las teclas del mapa, no sus valores.