我正在查看LinkedCaseInsensitiveMap的结构(Spring框架5.0.5.RELEASE)。我很好奇为什么LinkedCaseInsensitiveMap同时使用LinkedHashMap和HashMap,为什么不只使用LinkedHashMap这样呢?
private final LinkedHashMap<String, V> targetMap;
public V get(Object key) {
if (key instanceof String) {
return this.targetMap.get(convertKey((String) key));
}
return null;
}
答案 0 :(得分:3)
private final LinkedHashMap<String, V> targetMap;
private final HashMap<String, String> caseInsensitiveKeys;
在这种情况下,targetMap
包含到对象的大写字符串,caseInsensitiveKeys
包含将小写的密钥映射到您的大写密钥。
它允许您在进行for-each迭代时向您显示实际大小写的键,但同时也使您不区分大小写。
因此,请讲以下代码:
LinkedCaseInsensitiveMap<Object> map = new LinkedCaseInsensitiveMap<>();
map.put("MyCustomObject", new Object());
会将"MyCustomObject" -> new Object()
放在targetMap
中,将"mycustomobject" -> "MyCustomObject"
放在caseInsensitiveKeys
中。现在,如果您尝试打印map
中的所有对象,它将在您添加键时进行打印,而不更改键。没有第二张地图就无法存档。