具有不區分大小寫鍵的Java Map

1.概述

Map是Java中最常見的數據結構之一,而String是Map的鍵中最常見的類型之一。默認情況下,此類映射具有區分大小寫的鍵。

在這個簡短的教程中,我們將探索不同的Map實現,這些實現將**String的所有大小寫形式都接受為同一key** 。

2.使用不區分大小寫的鍵Map

讓我們更詳細地研究我們要解決的問題。

假設我們有一個*Map <String,Integer>*且只有一個條目:

具有不區分大小寫鍵的Java Map

讓我們添加下一個條目:

map.put("ABC", 2);

當使用區分大小寫的鍵的Map時,我們將得到兩個條目:

具有不區分大小寫鍵的Java Map

但是當使用不區分大小寫的鍵的Map時,內容將是:

具有不區分大小寫鍵的Java Map

在下一個示例中,我們將深入研究一些流行的Map實現的不區分大小寫的實現: TreeMapHashMapLinkedHashMap

3. TreeMap

TreeMapNavigableMap的實現,這意味著它始終根據給定的Comparator對條目進行排序。此外, TreeMap使用比較器來查找插入的鍵是重複鍵還是新鍵。

因此,如果提供不區分大小寫的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的大小是一個:

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

我們應該記住,與提供O(1)插入和查找的HashMap相比,像TreeMap**這樣的putget函數花費的平均時間為O(log n)** 。

還值得注意的是TreeMap不允許鍵。

4. Apache的CaseInsensitiveMap

Apache的Commons-Collections是一個非常流行的Java庫,其中提供了大量有用的類,其中包括CaseInsensitiveMap

CaseInsensitiveMap是基於哈希的Map ,可在添加或檢索鍵之前將鍵轉換為小寫。TreeMap不同, CaseInsensitiveMap允許插入鍵。

首先,我們需要添加公地collections4依賴性

<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 Framework模塊,還提供實用程序類,包括LinkedCaseInsensitiveMap

LinkedCaseInsensitiveMap包裝一個LinkedHashMap ,它是一個基於哈希表和鏈接列表的Map 。與LinkedHashMap不同,它不允許插入鍵。 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());

六,結論

在本教程中,我們研究了使用不區分大小寫的鍵創建Java Map的不同方法,並使用了不同的類來實現這一點。

與往常一樣,代碼可以在GitHub上獲得