Интерфейс ConcurrentNavigableMap в Java

Опубликовано: 4 Февраля, 2022

Интерфейс ConcurrentNavigableMap является членом Java Collection Framework. Он расширяется от NavigableMapinterface и ConcurrentMapinterface. ConcurrentNavigableMap обеспечивает поточно-безопасный доступ к элементам карты, а также предоставляет удобные методы навигации. Он принадлежит пакету java.util.concurrent.

Декларация:

 открытый интерфейс ConcurrentNavigableMap <K, V> расширяет ConcurrentMap <K, V>, NavigableMap <K, V>

Здесь K - ключевой тип объекта, а V - значение типа объекта.

Иерархия ConcurrentNavigableMap

Он реализует интерфейсы ConcurrentMap <K, V>, Map <K, V>, NavigableMap <K, V>, SortedMap <K, V>. ConcurrentSkipListMap реализует ConcurrentNavigableMap.

Пример:


Выход:

 Сопоставления ConcurrentNavigableMap: {1 = Первая, 2 = Вторая, 3 = Третья, 4 = Четвертая}
HeadMap (3): {1 = Первый, 2 = Второй}
TailMap (3): {3 = Третий, 4 = Четвертый}
Дополнительная карта (1, 3): {1 = Первая, 2 = Вторая}

Реализация классов

ConcurrentNavigableMap имеет один реализующий класс, который является классом ConcurrentSkipListMap . ConcurrentSkipListMap - это масштабируемая реализация интерфейса ConcurrentNavigableMap. Ключи в ConcurrentSkipListMap сортируются в естественном порядке или с использованием компаратора по времени создания объекта. ConcurrentSkipListMap имеет ожидаемые временные затраты журнала (n) для операций вставки, удаления и поиска. Это поточно-ориентированный класс, поэтому все основные операции могут выполняться одновременно.

Синтаксис:

 ConcurrentSkipListMap <? ,? > objectName = new ConcurrentSkipListMap <? ,? > ();

Example: In the code given below, we simply instantiate an object of the ConcurrentSkipListMap class named cslmap. The put() method is used to add elements and remove() to delete elements. For the remove() method the syntax is objectname.remove(Object key). The keySet() shows all the keys in the map (description in the method table given above).

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(
            " The ConcurrentSkipListMap key set: "
            + cslmap.keySet());
 
        // Remove elements using remove()
        cslmap.remove(3);
 
        // Print the contents on the console
        System.out.println(
            " The ConcurrentSkipListMap contains: "
            + cslmap);
    }
}

Выход:

 ConcurrentSkipListMap содержит: {1 = гиков, 2 = для, 3 = гиков}

Набор ключей ConcurrentSkipListMap: [1, 2, 3]

ConcurrentSkipListMap содержит: {1 = Компьютерщиков, 2 = Для}

Основные операции с ConcurrentNavigableMap

1. Добавление элементов

To add elements to a ConcurrentNavigableMap we can use any methods of the Map interface. The code below shows how to use them. You can observe in the code that when no Comparator is provided at the time of construction, the natural order is followed.

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


Выход:

 Сопоставления ConcurrentNavigableMap: {3 = Первая, 6 = Вторая, 8 = Третья}

2. Удаление элементов

Чтобы удалить элементы, мы также используем методы интерфейса Map, поскольку ConcurrentNavigableMap является потомком Map.


Выход:

 Сопоставления ConcurrentNavigableMap: {3 = Первая, 6 = Вторая, 8 = Третья, 11 = Четвертая}

ConcurrentNavigableMap, после операции удаления: {3 = Первая, 11 = Четвертая}

ConcurrentNavigableMap, после операции очистки: {}

3. Доступ к элементам

We can access the elements of a ConcurrentNavigableMap using get() method, the example of this is given below.

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(
            " The ConcurrentNavigableMap key set: "
            + cnmap.keySet());
    }
}


Выход:

 Первый
Второй
В третьих
Четвертый

Набор ключей ConcurrentNavigableMap: [3, 6, 8, 11]

4. Перемещение

We can use the Iterator interface to traverse over any structure of the Collection Framework. Since Iterators work with one type of data we use .Entry< ? , ? > to resolve the two separate types into a compatible format. Then using the next() method we prin the elements of the 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());
        }
    }
}


Выход:

 Ключ = 3, значение = первое
Ключ = 6, значение = секунда
Ключ = 8, Значение = Третье
Ключ = 11, Значение = Четвертое

Примечание. Каждый раз, когда мы говорим «элементы ConcurrentNavigableMap», необходимо отметить, что элементы фактически хранятся в объекте реализующего класса ConcurrentNavigableMap в данном случае ConcurrentSkipListMap.

Методы ConcurrentNavigableMap

ConcurrentNavigableMap наследует методы от Mapinterface, SortedMapinterface, ConcurrentMapinterface, NavigableMapinterface. Базовые методы добавления элементов, удаления элементов и обхода предоставляются родительскими интерфейсами. Методы ConcurrentNavigableMap приведены в следующей таблице. Здесь,

  • K - Тип ключей на карте.
  • V - Тип значений, отображаемых на карте.

Метод

Описание

спускающийсяKeySet () Возвращает в обратном порядке представление NavigableSet для ключей, содержащихся на карте.
нисходящая карта () Возвращает отображение сопоставлений на карте в обратном порядке.
headMap (K toKey) Возвращает вид части карты, в которой ключи меньше toKey.
headMap (K toKey, включая логическое значение) Возвращает представление части карты, в которой ключи меньше toKey и равны toKey, если значение inclusive истинно.
keySet () Возвращает представление NavigableSet ключей, содержащихся на этой карте.
navigableKeySet () Возвращает представление NavigableSet ключей, содержащихся на этой карте.
subMap (K fromKey, логическое fromInclusive, K toKey, логическое toInclusive) Возвращает представление части карты, ключи варьируются от fromKey до toKey.
subMap (K fromKey, K toKey) Возвращает представление части карты, ключи варьируются от fromKey, включительно, до toKey, исключая.
tailMap (K от ключа) Возвращает представление карты, в котором ключи больше, чем fromKey.
tailMap (K fromKey, включая логическое значение) Возвращает представление карты, в котором ключи больше, чем fromKey, и равны, если включительно истинно.

Методы, объявленные в интерфейсе java.util.concurrent.ConcurrentMap

МЕТОД

ОПИСАНИЕ

вычислить (ключ K, BiFunction <? super K,

? супер V,? расширяет V> remappingFunction)

Пытается вычислить сопоставление для указанного ключа и его текущего сопоставленного значения (или null, если текущего сопоставления нет).

computeIfAbsent (клавиша K, функция <? super K,

? расширяет V> mappingFunction)

Если указанный ключ еще не связан со значением (или сопоставлен с нулевым значением), пытается вычислить его значение.

используя заданную функцию сопоставления и вводит ее в эту карту, если не указано значение null.

computeIfPresent (ключ K, BiFunction <? super K,?

супер V,? расширяет V> remappingFunction)

Если значение для указанного ключа присутствует и не равно нулю, пытается вычислить новое сопоставление с учетом ключа и его текущего сопоставленного значения.
forEach (действие BiConsumer <? super K,? super V>) Выполняет указанное действие для каждой записи в этой карте, пока все записи не будут обработаны или действие не вызовет исключение.
getOrDefault (ключ объекта, V defaultValue) Возвращает значение, которому сопоставлен указанный ключ, или defaultValue, если эта карта не содержит сопоставления для ключа.

слияние (ключ K, значение V, BiFunction <? super V

,? супер V,? расширяет V> remappingFunction)

Если указанный ключ еще не связан со значением или связан с нулевым значением, связывает его с заданным ненулевым значением.
putIfAbsent (ключ K, значение V) Если указанный ключ еще не связан со значением, связывает его с заданным значением.
удалить (ключ объекта, значение объекта) Удаляет запись для ключа, только если в настоящее время сопоставлено с заданным значением.
заменить (ключ K, значение V) Заменяет запись для ключа, только если в настоящее время сопоставлено с некоторым значением.
replace (клавиша K, V oldValue, V newValue) Заменяет запись для ключа, только если в настоящее время сопоставлено с заданным значением.

replaceAll (BiFunction <? super K,? super V

,? расширяет функцию V>)

Заменяет значение каждой записи результатом вызова данной функции для этой записи до тех пор, пока все записи не будут обработаны или функция не вызовет исключение.

Методы, объявленные в интерфейсе java.util.Map

МЕТОД

ОПИСАНИЕ

Чисто() Удаляет все сопоставления с этой карты (дополнительная операция).
containsKey (ключ объекта) Возвращает истину, если эта карта содержит отображение для указанного ключа.
containsValue (значение объекта) Возвращает истину, если эта карта сопоставляет один или несколько ключей с указанным значением.
равно (Объект o) Сравнивает указанный объект с этой картой на равенство.
get (ключ объекта) Возвращает значение, которому сопоставлен указанный ключ, или null, если эта карта не содержит сопоставления для ключа.
хэш-код() Возвращает значение хэш-кода для этой карты.
пустой() Возвращает истину, если эта карта не содержит сопоставлений "ключ-значение".
положить (клавиша K, значение V) Связывает указанное значение с указанным ключом на этой карте (необязательная операция).
putAll (Map <? расширяет K,? расширяет V> m) Копирует все сопоставления с указанной карты на эту карту (необязательная операция).
удалить (ключ объекта) Удаляет сопоставление для ключа с этой карты, если оно присутствует (необязательная операция).
размер() Возвращает количество сопоставлений "ключ-значение" на этой карте.

Методы, объявленные в интерфейсе java.util.NavigableMap

МЕТОД

ОПИСАНИЕ

потолокEntry (клавиша K) Возвращает сопоставление "ключ-значение", связанное с наименьшим ключом, большим или равным данному ключу, или null, если такого ключа нет.
потолокKey (клавиша K) Возвращает наименьший ключ, больший или равный данному ключу, или null, если такого ключа нет.
firstEntry () Возвращает сопоставление "ключ-значение", связанное с наименьшим ключом в этой карте, или null, если карта пуста.
floorEntry (клавиша K) Возвращает сопоставление "ключ-значение", связанное с наибольшим ключом, меньшим или равным данному ключу, или null, если такого ключа нет.
floorKey (клавиша K) Возвращает наибольший ключ, меньший или равный данному ключу, или null, если такого ключа нет.
upperEntry (клавиша K) Возвращает сопоставление "ключ-значение", связанное с наименьшим ключом, строго большим, чем данный ключ, или null, если такого ключа нет.
upperKey (клавиша K) Возвращает наименьший ключ, строго превышающий данный ключ, или null, если такого ключа нет.
lastEntry () Возвращает сопоставление "ключ-значение", связанное с наибольшим ключом в этой карте, или null, если карта пуста.
lowerEntry (клавиша K) Возвращает сопоставление "ключ-значение", связанное с наибольшим ключом, строго меньшим, чем данный ключ, или null, если такого ключа нет.
lowerKey (клавиша K) Возвращает наибольший ключ, который строго меньше заданного, или null, если такого ключа нет.
pollFirstEntry () Удаляет и возвращает сопоставление "ключ-значение", связанное с наименьшим ключом в этой карте, или null, если карта пуста.
pollLastEntry () Удаляет и возвращает сопоставление "ключ-значение", связанное с наибольшим ключом в этой карте, или null, если карта пуста.

Методы, объявленные в интерфейсе java.util.SortedMap

МЕТОД

ОПИСАНИЕ

компаратор () Возвращает компаратор, используемый для упорядочивания ключей в этой карте, или null, если эта карта использует естественный порядок своих ключей.
entrySet () Возвращает набор отображений, содержащихся на этой карте.
firstKey () Возвращает первый (самый нижний) ключ, находящийся в данный момент на этой карте.
lastKey () Возвращает последний (самый высокий) ключ в данный момент на этой карте.
ценности() Возвращает представление коллекции значений, содержащихся в этой карте.

Вниманию читателя! Не переставай учиться сейчас. Ознакомьтесь со всеми важными концепциями Java Foundation и коллекций с помощью курса "Основы Java и Java Collections" по доступной для студентов цене и будьте готовы к работе в отрасли. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .