Estoy mirando la estructura de LinkedCaseInsensitiveMap (primavera marco 5.0.5.RELEASE). Tengo curiosidad por qué LinkedCaseInsensitiveMap utiliza tanto LinkedHashMap y HashMap, y por qué no sólo tiene que utilizar LinkedHashMap así?
private final LinkedHashMap<String, V> targetMap;
public V get(Object key) {
if (key instanceof String) {
return this.targetMap.get(convertKey((String) key));
}
return null;
}
private final LinkedHashMap<String, V> targetMap;
private final HashMap<String, String> caseInsensitiveKeys;
En este caso targetMap
contiene cadena de caso real de su objeto, y caseInsensitiveKeys
contiene la cartografía de su clave en minúsculas a su clave de los casos reales.
Permite mostrar teclas de casos reales cuando se está haciendo por-cada iteración, pero, al mismo tiempo que le permite tener mayúsculas y minúsculas.
Así que vamos a decir, siguiente código:
LinkedCaseInsensitiveMap<Object> map = new LinkedCaseInsensitiveMap<>();
map.put("MyCustomObject", new Object());
pondrá "MyCustomObject" -> new Object()
en targetMap
y "mycustomobject" -> "MyCustomObject"
en caseInsensitiveKeys
. Y ahora si intenta imprimir todos los objetos de su map
imprimirá como que ha añadido y no ha cambiado las llaves. No puede archivar sin segundo mapa.