具有不区分大小写的键的Java Map
1.概述
Map 是 Java 中最常见的数据结构之一,String 是Map键最常见的类型之一。默认情况下,此类映射具有区分大小写的键。
在这个简短的教程中,我们将探索接受String的所有大小写作为相同键的不同Map 实现,。
2.细看Map与大小写敏感键的关系
让我们更详细地研究一下我们要解决的问题。
假设我们有一个Map<String, Integer> ,其中有一个条目。
让我们添加下一个条目吧。
map.put("ABC", 2);
当使用带有大小写敏感键的Map时,我们最终会有两个条目。
但是,当使用不区分大小写的键的Map时,内容将是。
在接下来的例子中,我们将深入研究一些流行的Map实现的不区分大小写的方法。TreeMap, HashMap, 和 LinkedHashMap。
3. TreeMap
TreeMap 是NavigableMap的一个实现,这意味着它在插入后总是根据给定的Comparator对条目进行排序。此外,TreeMap 使用Comparator来查找插入的键是重复的还是新的。
因此,如果我们提供一个不区分大小写的String Comparator,我们会得到一个不区分大小写的TreeMap。
幸运的是,String 已经提供了这个静态的Comparator。
public static final Comparator <String> CASE_INSENSITIVE_ORDER
我们可以在构造函数中提供它。
Map<String, Integer> treeMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
treeMap.put("abc", 1);
treeMap.put("ABC", 2);
而现在,当我们运行测试时,我们可以看到,Map的大小是1。
assertEquals(1, treeMap.size());
并将该值更新为2。
assertEquals(2, treeMap.get("aBc").intValue());
assertEquals(2, treeMap.get("ABc").intValue());
现在让我们删除这个条目,使用同样的String,但有另一种情况。
treeMap.remove("aBC");
assertEquals(0, treeMap.size());
我们应该记住,对于 TreeMap 与提供 O(1) 插入和查找的 HashMap 相比。
同样值得注意的是,TreeMap 不允许null键的存在。
4.Apache的CaseInsensitiveMap
Apache的Commons-Collections是一个非常流行的Java库,提供了大量有用的类,CaseInsensitiveMap就在其中。
CaseInsensitiveMap 是一个基于哈希的Map,它在添加或检索键之前将其转换为小写。与TreeMap不同,CaseInsensitiveMap 允许null键插入。
首先,我们需要添加的commons-collections4 dependency。
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
</dependency>
现在,我们可以使用CaseInsensitiveMap,并添加两个条目。
Map<String, Integer> commonsHashMap = new CaseInsensitiveMap<>();
commonsHashMap.put("abc", 1);
commonsHashMap.put("ABC", 2);
当我们测试它时,我们期待的结果与我们之前看到的一样。
assertEquals(1, commonsHashMap.size());
assertEquals(2, commonsHashMap.get("aBc").intValue());
assertEquals(2, commonsHashMap.get("ABc").intValue());
commonsHashMap.remove("aBC");
assertEquals(0, commonsHashMap.size());
5.Spring的LinkedCaseInsensitiveMap
Spring Core是Spring框架的一个模块,它也提供了一些实用的类,包括LinkedCaseInsensitiveMap。
LinkedCaseInsensitiveMap包裹了一个LinkedHashMap,这是一个基于哈希表和链表的Map。与LinkedHashMap 不同,它不允许null 键插入。 LinkedCaseInsensitiveMap 保留键的原始顺序和原始大小写,同时允许在任何情况下调用 get 和 remove 等函数。
首先,让我们添加的spring-core依赖性:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
现在,我们可以初始化一个新的LinkedCaseInsensitiveMap了。
Map<String, Integer> linkedHashMap = new LinkedCaseInsensitiveMap<>();
linkedHashMap.put("abc", 1);
linkedHashMap.put("ABC", 2);
添加测试它。
assertEquals(1, linkedHashMap.size());
assertEquals(2, linkedHashMap.get("aBc").intValue());
assertEquals(2, linkedHashMap.get("ABc").intValue());
linkedHashMap.remove("aBC");
assertEquals(0, linkedHashMap.size());
6.结论
在本教程中,我们研究了创建具有不区分大小写的键的Java Map的不同方法,并使用不同的类来获得这种效果。
像往常一样,代码可以在GitHub上查看。