使用不区分大小写的键创建Java Map

后端 潘老师 6个月前 (10-14) 148 ℃ (0) 扫码查看

Map是Java中最广泛使用的数据结构之一。Map是一个包含键值对的集合。作为一个要求,Map的键应该是不可变的

由于它们的不可变性质,字符串通常被用作Map的键。默认情况下,Map中的字符串键是区分大小写的。本教程将展示如何创建一个具有不区分大小写键的Map。

1.区分大小写与不区分大小写的Map

首先让我们了解区分大小写和不区分大小写的Map之间的基本区别。

如前所述,默认情况下,键是区分大小写的。假设我们有一个以字符串为键和整数数字为值的Map。

caseSensitiveMap.put("A", 1);   //{A=1}

让我们向Map添加一个条目。然后再添加一个具有相同键但采用小写字母的条目。由于键是区分大小写的,它们将被视为不同的键。现在,Map的内容将是{A=1, a=2}。

//区分大小写的map
caseSensitiveMap.put("A", 1);   //{A=1}
caseSensitiveMap.put("a", 2);  //{A=1, a=2}

现在,使用一个不区分大小写的Map重复相同的操作。我们将向这个Map添加相同的条目。由于键不区分大小写,“A”和“a”将被视为相同的键。

//不区分大小写的map
caseInsensitiveMap.put("A", 1);   //{A=1}
caseInsensitiveMap.put("a", 2);   //{A=2}

2.创建不区分大小写的Map

2.1. 使用带有CASE_INSENSITIVE_ORDER比较器的TreeMap

TreeMap提供了一种有效的方式来按排序顺序存储键值对。TreeMap不允许空键。由于TreeMap按排序顺序存储键,我们可以使用一个比较器来指定排序顺序,对于我们的用例,比较器将是String.CASE_INSENSITIVE_ORDER。

String.CASE_INSENSITIVE_ORDER返回一个比较器,通过忽略大小写来比较两个字符串。由于键的大小写将被忽略,Map中只会找到一个条目。

Map<String, Integer> caseInsensitiveTreeMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);

caseInsensitiveTreeMap.put("AA", 1);    //{AA=1}
caseInsensitiveTreeMap.put("aa", 2);    //{AA=2}

我们还可以通过以不同大小写的方式删除键来验证不区分大小写的特性。删除后,Map的大小将为零。

caseInsensitiveTreeMap.remove("aA");   //删除

需要注意的是,TreeMap对于像get()和put()这样的基本操作不提供常数时间性能。对于大多数应用程序来说,这不是问题,但如果我们有一个性能关键的应用程序,值得考虑。

2.2. 使用CaseInsensitiveMap

CaseInsensitiveMap类是Apache Commons Collections的一部分。由于它是一个外部库,可以从Maven仓库添加其最新依赖。如果您使用Maven,可以按照以下方式添加依赖:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.4</version>
</dependency>

CaseInsensitiveMap将键存储为小写形式,并且还支持空键。

Map<String, Integer> caseInsensitiveMap = new CaseInsensitiveMap<>();

caseInsensitiveMap.put("A", 1);      //{A=1}
caseInsensitiveMap.put("B", 2);     //{A=1, B=2}
caseInsensitiveMap.put(null, 3);   //{A=1, B=2, null=3}

caseInsensitiveMap.put("a", 4);     //{a=4, B=2, null=3}

请注意,键“B”已转换为小写并存储在Map中作为“b”。

同样,删除操作也是不区分大小写的。

caseInsensitiveMap.remove("B");    //删除key=b的项

2.3. 使用LinkedCaseInsensitiveMap

LinkedCaseInsensitiveMap类是Spring框架的一部分。由于Spring是一个外部框架,您需要将其添加到类路径中。如果我们使用Spring或Spring Boot应用程序,它应该已经可用于类路径中。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.2.5.RELEASE</version>
</dependency>

LinkedCaseInsensitiveMap提供了一个不区分大小写的Map实现,它包装在java.util.LinkedHashMap周围。它维护元素的插入顺序,并保留插入的键的大小写,与Apache Common的CaseInsensitiveMap不同。它不允许空键。

Map<String, Integer> linkedCaseInsensitiveMap = new LinkedCaseInsensitiveMap<>();

linkedCaseInsensitiveMap.put("A", 1);   //{A=1}
linkedCaseInsensitiveMap.put("B", 2);  //{A=1, B=2}
linkedCaseInsensitiveMap.put("a", 4);   //{a=4, B=2}

请注意,键“B”保留了大小写。键“a”将覆盖“A”。由于“a”是在“B”之后插入的,元素按照那个顺序显示。

我们可以使用任何大小写来调用这个Map上的remove操作。

linkedCaseInsensitiveMap.remove("b"); 

3.结论

这个Java教程探讨了创建不区分大小写的Map的各种方法。我们学习了使用TreeMap、Spring的LinkedCaseInsensitiveMap和Apache Commons的CaseInsensitiveMap的方法。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/back/9533.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】