为什么 LinkedCaseInsensitiveMap 同时使用 LinkedHashMap 和 HashMap?

3

我正在查看LinkedCaseInsensitiveMap的结构(spring framework 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;
   }
1个回答

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());

它将在 targetMap 中放置 "MyCustomObject" -> new Object(),并在 caseInsensitiveKeys 中放置 "mycustomobject" -> "MyCustomObject"。现在,如果您尝试从 map 打印所有对象,它将按照您添加和未更改的键打印。 没有第二个映射,您无法实现它。


1
您可以使用单个映射来实现此目的,例如通过将键包装为具有不区分大小写相等性的对象,并在迭代器中取消包装它们,但最终,您必须决定采用特定的实现策略。 - Holger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接