He leído acerca de LinkedHashMap y de la descripción (aunque muy interesante) no pude entender cómo hace su trabajo bajo el capó. Como nota al margen, sé cómo funciona un HashMap
debajo en Java.
Así que reviso la fuente y todavía no puedo entender cómo funciona. Tal vez no estoy captando algo fundamental en OOP en este caso tan desnudo conmigo.
Para resumir la parte que me resulta confusa es la siguiente:
El LinkedHashMap
delega todas las llamadas a su principal HashMap
.
Internamente se anula la HashMap.Entry
para poner en práctica las diversas recordAccess
y recordRemoval
métodos que parecen poner en práctica la lógica de la LinkedHashMap
Pero el actual Entries
se encuentran dentro de la tabla de la clase base es decir, el HashMap
la que crea la instancia de una tabla de HashMap.Entry
y no de LinkedHashMap.Entry
.
Así que no puedo entender cómo se llaman realmente los diversos recordAccess
y recordRemove
, etc.
Entonces, ¿alguien puede ayudarme a entender qué está pasando aquí?
¿Tengo razón al pensar que de alguna manera el LinkedHashedMap.Entry
es el tipo de tabla creada por el HashMap
? ¿Pero cómo?De vuelta en los fundamentos de OO. ¿Cómo funciona LinkedHashMap bajo el capó? No puedo entender esto
ACTUALIZACIÓN:
Mi pregunta es ¿cómo la recordAccess
están siendo llamados. Mi experimento en esta usando una versión derivada de HashMap
no por la razón de Shengyuan Lu (1) - Mi mal no
ACTUALIZACIÓN:
Lo siguiente que probé es el mismo (creo) como lo que el LinkedHashMap
está haciendo:
package delete;
public class Base<T> {
Entry<T>[] table;
int idx = 0;
@SuppressWarnings("unchecked")
public Base(){
System.out.println("In base");
table = new Entry[10];
}
public void add(T x){
table[idx] = new Entry(x);
table[idx].doSomething();
}
static class Entry<T>{
T value;
Entry(T x){
this.value = x;
System.out.println("Entry::Base");
}
void doSomething(){
System.out.println("In Entry base, doing something");
}
}
}
public class Derived<T> extends Base<T> {
static class Entry<T> extends Base.Entry<T>{
Entry(T x) {
super(x);
System.out.println("In Entry derived");
}
int val;
@Override
void doSomething() {
System.out.println("In Entry derived doing something really smart!");
}
}
/**
* @param args
*/
public static void main(String[] args) {
Base<String> b = new Derived<String>();
b.add("Test string");
}
}
pero se imprime:
In base
Entry::Base
In Entry base, doing something
Así que la derivada es Entry
nev er llamado.
¿Es mi ejemplo diferente de alguna manera? No puedo entender cómo esto funciona para LinkedHashMap
¿Protegido o paquete privado? – assylias
@assylias: OP – Cratylus
actualizado para _¿Por qué LinkedHashMap se define como extiende HashMap implementa Map_ read [this] (http://stackoverflow.com/q/2165204/1393766) – Pshemo