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

时间:2019-04-17 13:31:03

标签: java spring collections

我正在查看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;
   }

1 个答案:

答案 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中的所有对象,它将在您添加键时进行打印,而不更改键。没有第二张地图就无法存档。