ConcurrentNavigableMap接口是一個成員Java集合框架。它延伸自NavigableMap Interface接口和ConcurrentMap接口。 ConcurrentNavigableMap 提供對Map元素的線程安全訪問,並提供方便的導航方法。它屬於java.util.concurrent包。
聲明:
public interface ConcurrentNavigableMap<K,V> extends ConcurrentMap<K,V>, NavigableMap<K,V>
這裏,K 是鍵對象類型,V 是值對象類型。
ConcurrentNavigableMap的層次結構
它實現了ConcurrentMap,Map,NavigableMap Interface,SortedMap Interface接口。ConcurrentSkipListMap實現 ConcurrentNavigableMap。
例子:
Java
// Java Program to demonstrate the
// ConcurrentNavigableMap Interface
import java.util.concurrent.ConcurrentNavigableMap;
import java.util.concurrent.ConcurrentSkipListMap;
public class GFG {
public static void main(String[] args)
{
// Instantiate an object
// Since ConcurrentNavigableMap
// is an interface so We use
// ConcurrentSkipListMap
ConcurrentNavigableMap<Integer, String> cnmap
= new ConcurrentSkipListMap<Integer, String>();
// Add elements using put() method
cnmap.put(1, "First");
cnmap.put(2, "Second");
cnmap.put(3, "Third");
cnmap.put(4, "Fourth");
// Print the contents on the console
System.out.println(
"Mappings of ConcurrentNavigableMap : "
+ cnmap);
System.out.println("HeadMap(3): "
+ cnmap.headMap(3));
System.out.println("TailMap(3): "
+ cnmap.tailMap(3));
System.out.println("SubMap(1, 3): "
+ cnmap.subMap(1, 3));
}
}
輸出:
Mappings of ConcurrentNavigableMap : {1=First, 2=Second, 3=Third, 4=Fourth} HeadMap(3): {1=First, 2=Second} TailMap(3): {3=Third, 4=Fourth} SubMap(1, 3): {1=First, 2=Second}
實現類
ConcurrentNavigableMap 有一個實現類,它是ConcurrentSkipListMap 類。 ConcurrentSkipListMap 是 ConcurrentNavigableMap 接口的可擴展實現。 ConcurrentSkipListMap 中的鍵按自然順序或使用Comparator Interface在構建對象時。 ConcurrentSkipListMap 的預期時間成本為日誌(n)用於插入、刪除和搜索操作。它是一個線程安全的類,因此,所有基本操作都可以並發完成。
用法:
ConcurrentSkipListMap< ? , ? > objectName = new ConcurrentSkipListMap< ? , ? >();
示例:在下麵給出的代碼中,我們簡單地實例化了一個名為 cslmap 的 ConcurrentSkipListMap 類的對象。 put()方法用於添加元素,remove()用於刪除元素。對於 remove() 方法,語法為objectname.remove(對象鍵)。 keySet() 顯示映射中的所有鍵(上麵給出的方法表中的說明)。
Java
// Java Program to demonstrate the ConcurrentSkipListMap
import java.util.concurrent.*;
public class ConcurrentSkipListMapExample {
public static void main(String[] args)
{
// Instantiate an object of
// ConcurrentSkipListMap named cslmap
ConcurrentSkipListMap<Integer, String> cslmap
= new ConcurrentSkipListMap<Integer, String>();
// Add elements using put()
cslmap.put(1, "Geeks");
cslmap.put(2, "For");
cslmap.put(3, "Geeks");
// Print the contents on the console
System.out.println(
"The ConcurrentSkipListMap contains: "
+ cslmap);
// Print the key set using keySet()
System.out.println(
"\nThe ConcurrentSkipListMap key set: "
+ cslmap.keySet());
// Remove elements using remove()
cslmap.remove(3);
// Print the contents on the console
System.out.println(
"\nThe ConcurrentSkipListMap contains: "
+ cslmap);
}
}
輸出:
The ConcurrentSkipListMap contains: {1=Geeks, 2=For, 3=Geeks} The ConcurrentSkipListMap key set: [1, 2, 3] The ConcurrentSkipListMap contains: {1=Geeks, 2=For}
ConcurrentNavigableMap 的基本操作
1. 添加元素
要將元素添加到 ConcurrentNavigableMap,我們可以使用 Map 接口的任何方法。下麵的代碼展示了如何使用它們。您可以在代碼中觀察到,當構建時未提供 Comparator 時,將遵循自然順序。
Java
// Java Program for adding elements to a
// ConcurrentNavigableMap
import java.util.concurrent.*;
public class AddingElementsExample {
public static void main(String[] args)
{
// Instantiate an object
// Since ConcurrentNavigableMap is an interface
// We use ConcurrentSkipListMap
ConcurrentNavigableMap<Integer, String> cnmap
= new ConcurrentSkipListMap<Integer, String>();
// Add elements using put()
cnmap.put(8, "Third");
cnmap.put(6, "Second");
cnmap.put(3, "First");
// Print the contents on the console
System.out.println(
"Mappings of ConcurrentNavigableMap : "
+ cnmap);
}
}
輸出:
Mappings of ConcurrentNavigableMap : {3=First, 6=Second, 8=Third}
2. 刪除元素
為了刪除元素,我們還使用 Map 接口的方法,因為 ConcurrentNavigableMap 是 Map 的後代。
Java
// Java Program for deleting
// elements from ConcurrentNavigableMap
import java.util.concurrent.*;
public class RemovingElementsExample {
public static void main(String[] args)
{
// Instantiate an object
// Since ConcurrentNavigableMap
// is an interface
// We use ConcurrentSkipListMap
ConcurrentNavigableMap<Integer, String> cnmap
= new ConcurrentSkipListMap<Integer, String>();
// Add elements using put()
cnmap.put(8, "Third");
cnmap.put(6, "Second");
cnmap.put(3, "First");
cnmap.put(11, "Fourth");
// Print the contents on the console
System.out.println(
"Mappings of ConcurrentNavigableMap : "
+ cnmap);
// Remove elements using remove()
cnmap.remove(6);
cnmap.remove(8);
// Print the contents on the console
System.out.println(
"\nConcurrentNavigableMap, after remove operation : "
+ cnmap);
// Clear the entire map using clear()
cnmap.clear();
System.out.println(
"\nConcurrentNavigableMap, after clear operation : "
+ cnmap);
}
}
輸出:
Mappings of ConcurrentNavigableMap : {3=First, 6=Second, 8=Third, 11=Fourth} ConcurrentNavigableMap, after remove operation : {3=First, 11=Fourth} ConcurrentNavigableMap, after clear operation : {}
3. 訪問元素
我們可以使用get()方法訪問ConcurrentNavigableMap的元素,下麵給出了示例。
Java
// Java Program for accessing
// elements in a ConcurrentNavigableMap
import java.util.concurrent.*;
public class AccessingElementsExample {
public static void main(String[] args)
{
// Instantiate an object
// Since ConcurrentNavigableMap is an interface
// We use ConcurrentSkipListMap
ConcurrentNavigableMap<Integer, String> cnmap
= new ConcurrentSkipListMap<Integer, String>();
// Add elements using put()
cnmap.put(8, "Third");
cnmap.put(6, "Second");
cnmap.put(3, "First");
cnmap.put(11, "Fourth");
// Accessing the elements using get()
// with key as a parameter
System.out.println(cnmap.get(3));
System.out.println(cnmap.get(6));
System.out.println(cnmap.get(8));
System.out.println(cnmap.get(11));
// Display the set of keys using keySet()
System.out.println(
"\nThe ConcurrentNavigableMap key set: "
+ cnmap.keySet());
}
}
輸出:
First Second Third Fourth The ConcurrentNavigableMap key set: [3, 6, 8, 11]
4. 遍曆
我們可以使用 Iterator 接口來遍曆 Collection Framework 的任何結構。由於迭代器使用一種類型的數據,因此我們使用 .Entry< ? , ? > 將兩種不同的類型解析為兼容的格式。然後使用 next() 方法打印 ConcurrentNavigableMap 的元素。
Java
// Java Program for traversing a ConcurrentNavigableMap
import java.util.concurrent.*;
import java.util.*;
public class TraversalExample {
public static void main(String[] args)
{
// Instantiate an object
// Since ConcurrentNavigableMap is an interface
// We use ConcurrentSkipListMap
ConcurrentNavigableMap<Integer, String> cnmap
= new ConcurrentSkipListMap<Integer, String>();
// Add elements using put()
cnmap.put(8, "Third");
cnmap.put(6, "Second");
cnmap.put(3, "First");
cnmap.put(11, "Fourth");
// Create an Iterator over the
// ConcurrentNavigableMap
Iterator<ConcurrentNavigableMap
.Entry<Integer, String> > itr
= cnmap.entrySet().iterator();
// The hasNext() method is used to check if there is
// a next element The next() method is used to
// retrieve the next element
while (itr.hasNext()) {
ConcurrentNavigableMap
.Entry<Integer, String> entry
= itr.next();
System.out.println("Key = " + entry.getKey()
+ ", Value = "
+ entry.getValue());
}
}
}
輸出:
Key = 3, Value = First Key = 6, Value = Second Key = 8, Value = Third Key = 11, Value = Fourth
注意:每次我們說“ConcurrentNavigableMap 的元素”時,都必須注意這些元素實際上存儲在 ConcurrentNavigableMap 的實現類的對象中,在本例中為 ConcurrentSkipListMap。
ConcurrentNavigableMap的方法
ConcurrentNavigableMap繼承了Map 接口、SortedMap 接口、ConcurrentMap 接口、NavigableMap 接口的方法。添加元素、刪除元素和遍曆的基本方法由父接口給出。下表給出了ConcurrentNavigableMap的方法。這裏,
- K- Map中按鍵的類型。
- V- 映射中映射的值的類型。
Method |
Description |
---|---|
descendingKeySet() | 返回映射中包含的鍵的逆序 NavigableSet 視圖。 |
descendingMap() | 返回Map中映射的逆序視圖。 |
headMap(K toKey) | 返回映射中鍵小於 toKey 的部分的視圖。 |
headMap(K toKey, boolean inclusive) | 返回映射部分的視圖,其中鍵小於 toKey,並且如果包含為 true 則等於 toKey。 |
keySet() | 返回此映射中包含的鍵的 NavigableSet 視圖。 |
navigableKeySet() | 返回此映射中包含的鍵的 NavigableSet 視圖。 |
subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) | 返回Map部分的視圖,鍵範圍從 fromKey 到 toKey。 |
subMap(K fromKey, K toKey) | 返回映射部分的視圖,鍵範圍從 fromKey(包含)到 toKey(不包含)。 |
tailMap(K fromKey) | 返回Map的視圖,其中鍵大於 fromKey。 |
tailMap(K fromKey, boolean inclusive) | 返回映射的視圖,其中鍵大於 fromKey,並且如果包含為 true 則等於。 |
接口 java.util.concurrent.ConcurrentMap 中聲明的方法
METHOD |
DESCRIPTION |
---|---|
計算(K key, BiFunction<? super K, ?超V,?擴展 V> 重映射函數) |
嘗試計算指定鍵及其當前映射值的映射(如果沒有當前映射,則為 null)。 |
computeIfAbsent(K key, Function<? super K, ?擴展 V> 映射函數) |
如果指定的鍵尚未與值關聯(或映射為 null),則嘗試計算其值 使用給定的映射函數並將其輸入到此映射中,除非為空。 |
computeIfPresent(K key, BiFunction<? 超級 K,? 超V,?擴展 V> 重映射函數) |
如果指定鍵的值存在且非空,則嘗試在給定鍵及其當前映射值的情況下計算新映射。 |
forEach(BiConsumer<?超級 K,?超級 V> 操作) | 對此映射中的每個條目執行給定的操作,直到處理完所有條目或該操作引發異常。 |
getOrDefault(Object key, V defaultValue) | 返回指定鍵映射到的值,如果此映射不包含該鍵的映射,則返回 defaultValue。 |
merge(K 鍵, V 值, BiFunction<? super V ,?超V,?擴展 V> 重映射函數) |
如果指定的鍵尚未與值關聯或與 null 關聯,則將其與給定的非 null 值關聯。 |
putIfAbsent(K key, V value) | 如果指定的鍵尚未與值關聯,則將其與給定值關聯。 |
remove(Object key, Object value) | 僅當當前映射到給定值時才刪除鍵的條目。 |
replace(K key, V value) | 僅當當前映射到某個值時才替換鍵的條目。 |
replace(K key, V oldValue, V newValue) | 僅當當前映射到給定值時才替換鍵的條目。 |
ReplaceAll(BiFunction<? 超級 K,? 超級 V ,?擴展 V> 函數) |
將每個條目的值替換為在該條目上調用給定函數的結果,直到處理完所有條目或函數引發異常。 |
接口 java.util.Map 中聲明的方法
METHOD |
DESCRIPTION |
---|---|
Map clear() | 從此映射中刪除所有映射(可選操作)。 |
containsKey(Object key) | 如果此映射包含指定鍵的映射,則返回 true。 |
Map containsValue() | 如果此映射將一個或多個鍵映射到指定值,則返回 true。 |
Map equals() | 比較指定對象與此映射是否相等。 |
get(Object key) | 返回指定鍵映射到的值,如果此映射不包含該鍵的映射,則返回 null。 |
Map hashCode() | 返回此映射的哈希代碼值。 |
Map isEmpty() | 如果此映射不包含鍵值映射,則返回 true。 |
Map put() | 將指定值與此映射中的指定鍵相關聯(可選操作)。 |
Map putAll() | 將指定映射中的所有映射複製到此映射(可選操作)。 |
Map remove() | 從此映射中刪除鍵的映射(如果存在)(可選操作)。 |
size() | 返回此映射中鍵值映射的數量。 |
接口 java.util.NavigableMap 中聲明的方法
METHOD |
DESCRIPTION |
---|---|
NavigableMap ceilingEntry() | 返回與大於或等於給定鍵的最小鍵關聯的鍵值映射,如果不存在這樣的鍵,則返回 null。 |
NavigableMap ceilingKey() | 返回大於或等於給定鍵的最小鍵,如果沒有這樣的鍵,則返回 null。 |
NavigableMap firstEntry() | 返回與此映射中最小鍵關聯的鍵值映射,如果映射為空,則返回 null。 |
NavigableMap floorEntry() | 返回與小於或等於給定鍵的最大鍵關聯的鍵值映射,如果不存在這樣的鍵,則返回 null。 |
NavigableMap floorKey() | 返回小於或等於給定鍵的最大鍵,如果沒有這樣的鍵,則返回 null。 |
NavigableMap higherEntry() | 返回與嚴格大於給定鍵的最小鍵關聯的鍵值映射,如果不存在這樣的鍵,則返回 null。 |
NavigableMap higherKey() | 返回嚴格大於給定鍵的最小鍵,如果不存在這樣的鍵,則返回 null。 |
NavigableMap lastEntry() | 返回與此映射中最大鍵關聯的鍵值映射,如果映射為空,則返回 null。 |
NavigableMap lowerEntry() | 返回與嚴格小於給定鍵的最大鍵關聯的鍵值映射,如果不存在這樣的鍵,則返回 null。 |
NavigableMap lowerKey() | 返回嚴格小於給定鍵的最大鍵,如果不存在這樣的鍵,則返回 null。 |
NavigableMap pollFirstEntry() | 刪除並返回與此映射中最小鍵關聯的鍵值映射,如果映射為空,則返回 null。 |
NavigableMap pollLastEntry() | 刪除並返回與此映射中最大鍵關聯的鍵值映射,如果映射為空,則返回 null。 |
接口 java.util.SortedMap 中聲明的方法
METHOD |
DESCRIPTION |
---|---|
SortedMap comparator() | 返回用於對該映射中的鍵進行排序的比較器,如果該映射使用其鍵的自然順序,則返回 null。 |
SortedMap entrySet() | 返回此映射中包含的映射的集合視圖。 |
SortedMap firstKey() | 返回當前此映射中的第一個(最低)鍵。 |
SortedMap lastKey() | 返回當前此映射中的最後一個(最高)鍵。 |
SortedMap values() | 返回此映射中包含的值的集合視圖。 |
相關用法
- Java ConcurrentHashMap computeIfPresent()用法及代碼示例
- Java ConcurrentHashMap equals()用法及代碼示例
- Java ConcurrentHashMap forEach()用法及代碼示例
- Java ConcurrentHashMap getOrDefault()用法及代碼示例
- Java ConcurrentHashMap hashcode()用法及代碼示例
- Java ConcurrentHashMap mappingCount()用法及代碼示例
- Java ConcurrentHashMap merge()用法及代碼示例
- Java ConcurrentHashMap newKeySet()用法及代碼示例
- Java ConcurrentHashMap replace()用法及代碼示例
- Java ConcurrentHashMap toString()用法及代碼示例
- Java ConcurrentLinkedQueue forEach()用法及代碼示例
- Java ConcurrentLinkedQueue removeAll()用法及代碼示例
- Java ConcurrentLinkedQueue removeIf()用法及代碼示例
- Java ConcurrentLinkedQueue retainAll()用法及代碼示例
- Java ConcurrentHashMap contains()用法及代碼示例
- Java ConcurrentHashMap containsKey()用法及代碼示例
- Java ConcurrentHashMap containsValue()用法及代碼示例
- Java ConcurrentHashMap elements()用法及代碼示例
- Java ConcurrentHashMap entrySet()用法及代碼示例
- Java ConcurrentHashMap get()用法及代碼示例
- Java ConcurrentHashMap isEmpty()用法及代碼示例
- Java ConcurrentHashMap keys()用法及代碼示例
- Java ConcurrentHashMap keySet()用法及代碼示例
- Java ConcurrentHashMap put()用法及代碼示例
- Java ConcurrentHashMap putAll()用法及代碼示例
注:本文由純淨天空篩選整理自ManasiKirloskar大神的英文原創作品 ConcurrentNavigableMap Interface in Java。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。