具有不區分大小寫鍵的Java Map
1.概述
Map是Java中最常見的數據結構之一,而String是Map的鍵中最常見的類型之一。默認情況下,此類映射具有區分大小寫的鍵。
在這個簡短的教程中,我們將探索不同的Map實現,這些實現將**String的所有大小寫形式都接受為同一key** 。
2.使用不區分大小寫的鍵Map
讓我們更詳細地研究我們要解決的問題。
假設我們有一個*Map <String,Integer>*且只有一個條目:
讓我們添加下一個條目:
map.put("ABC", 2);
當使用區分大小寫的鍵的Map時,我們將得到兩個條目:
但是當使用不區分大小寫的鍵的Map時,內容將是:
在下一個示例中,我們將深入研究一些流行的Map實現的不區分大小寫的實現: TreeMap , HashMap和LinkedHashMap 。
3. TreeMap
TreeMap是NavigableMap的實現,這意味著它始終根據給定的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**這樣的put和get函數花費的平均時間為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保留了鍵的原始順序和原始大小寫,同時允許在任何情況下調用諸如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());
六,結論
在本教程中,我們研究了使用不區分大小寫的鍵創建Java Map的不同方法,並使用了不同的類來實現這一點。
與往常一樣,代碼可以在GitHub上獲得。