具有不区分大小写的键的Java Map

评论 0 浏览 0 2020-04-13

1.概述

Map 是 Java 中最常见的数据结构之一,String 是Map键最常见的类型之一。默认情况下,此类映射具有区分大小写的键。

在这个简短的教程中,我们将探索接受String的所有大小写作为相同键的不同Map 实现,

2.细看Map与大小写敏感键的关系

让我们更详细地研究一下我们要解决的问题。

假设我们有一个Map<String, Integer> ,其中有一个条目。

firstEntry

让我们添加下一个条目吧。

map.put("ABC", 2);

当使用带有大小写敏感键的Map时,我们最终会有两个条目。

sensetiveKey-1

但是,当使用不区分大小写的键的Map时,内容将是。

insensetiveKey-1

在接下来的例子中,我们将深入研究一些流行的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 保留键的原始顺序和原始大小写,同时允许在任何情况下调用 getremove 等函数。

首先,让我们添加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上查看。

最后更新2023-03-11
0 个评论
标签