Java Map – Java中的Map

时间:2020-02-23 14:36:41  来源:igfitidea点击:

Java Map是集合框架的一部分。
Java Map对象用于存储键值映射。
Java Map不能包含重复的键,但是允许重复的值。

Java map

Java中有关Map的一些重要要点是:

  • Map提供了三个集合视图–键集,键-值映射集和值集合。

  • 地图不保证映射的顺序,但是取决于实现方式。
    例如,HashMap不能保证映射的顺序,但是TreeMap可以保证。

  • Map利用hashCode并在Key上使用equals方法进行获取和放置操作。
    因此,可变类不是Map键的理想选择。
    如果放置后hashCode或者等于的值发生变化,则get操作中不会获得正确的值。

  • Java中流行的Map实现类是HashMap,Hashtable,TreeMap,ConcurrentHashMap和LinkedHashMap。

  • AbstractMap类提供了Map接口的骨架实现,大多数Map具体类扩展了AbstractMap类并实现了所需的方法。

Java Map方法

让我们看一些重要的Map方法。

  • int size():返回此Map中的键值映射数。

  • boolean isEmpty():如果没有映射,则返回true,否则返回false。

  • boolean containsValue(Object value):如果至少有一个键映射到指定值,则返回true,否则返回false。

  • V get(Object key):返回映射到给定键的值,如果找不到映射,则返回null。

  • V put(K key,V value):将键值对的映射添加到映射。
    如果已经有一个映射到该键的值,则替换该值。
    此方法返回与key关联的先前值;如果没有key映射,则返回null。

  • V remove(Object key):如果存在,则从此映射中删除键的映射。
    返回此映射先前与该键相关联的值;如果该映射不包含该键的映射关系,则返回null。

  • void putAll(Map <?扩展K,?扩展V> m):将所有映射从指定映射复制到此映射。

  • void clear():从Map中删除所有映射。

  • Set <K> keySet():返回Map中所有键的Set视图。
    此密钥集由Map支持,因此对Map的任何修改都将反映到密钥集上,反之亦然。

  • Collection <V> values():返回Map中所有值的集合视图。
    此集合由Map支持,因此Map中的任何更改都将反映到该值集合,反之亦然。

  • Set <Map.Entry <K,V >> entrySet():返回Map中映射的Set视图。
    此Set由Map支持,因此Map中的任何修改都将反映在条目集中,反之亦然。

Java 8中引入的Java Map中的方法很少。

  • default V getOrDefault(Object key,V defaultValue):返回指定键所映射到的值;如果此映射不包含该键的映射关系,则返回defaultValue。

  • 默认void forEach(BiConsumer <?super K,?super V> action):对此映射中的每个条目执行给定的操作。

  • 默认void replaceAll(BiFunction <?super K,?super V,?extends V>函数):将每个条目的值替换为在该条目上调用给定函数的结果。

  • 默认V putIfAbsent(K键,V值):如果指定键尚未与值关联(或者映射为null),则将其与给定值关联并返回null,否则返回当前值。

  • default boolean remove(Object key,Object value):仅当当前映射到指定值时,才删除指定键的条目。

  • 默认布尔替换(K key,V oldValue,V newValue):仅当当前映射到指定值时,才替换指定键的条目。

  • 默认V replace(K键,V值):仅当指定键当前映射到某个值时,才替换该条目。

  • 默认的V computeIfAbsent(K键,Function <?超级K,?扩展V> mappingFunction):如果指定的键尚未与某个值关联(或者映射为null),则尝试使用给定的映射函数和除非为null,否则将其输入到此地图中。

  • 默认VcomputeIfPresent(K键,BiFunction <?super K,?super V,?extended V> remappingFunction):如果指定键的值存在且非空,则尝试计算给定键及其当前值的新映射映射值。
    如果函数返回null,则删除映射。

  • 默认V计算(K键,BiFunction <?super K,?super V,?扩展V> remappingFunction):尝试计算指定键及其当前映射值的映射(如果没有当前映射,则为null)。

  • 默认V merge(K键,V值,BiFunction <?super V,?super V,?extended V> remappingFunction):如果指定键尚未与值关联或者与null关联,则将其与给定的non关联-null值。
    否则,用给定的重映射函数的结果替换关联的值,如果结果为null,则将其删除。

您会注意到,Java 8 Map接口中添加的所有新方法都是带有实现的默认方法。
这样做是为了确保任何实现Map接口的类都不会发生编译错误。

Java Map示例

让我们看一个简单的Java Map示例程序。
我们将在示例程序中使用Map实现类HashMap。

package com.theitroad.examples;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class MapExample {

	public static void main(String[] args) {

		Map<String, String> data = new HashMap<>();

		data.put("A", "A"); //put example
		data.put("B", "B");
		data.put("C", "C");
		data.put("D", null); //null value
		data.put(null, "Z"); //null key

		String value = data.get("C"); //get example
		System.out.println("Key = C, Value = " + value);

		value = data.getOrDefault("E", "Default Value");
		System.out.println("Key = E, Value=" + value);

		boolean keyExists = data.containsKey(null);
		boolean valueExists = data.containsValue("Z");

		System.out.println("keyExists= " + keyExists + ", valueExists= " + valueExists);

		Set<Entry<String, String>> entrySet = data.entrySet();
		System.out.println(entrySet);

		System.out.println("data map size=" + data.size());

		Map<String, String> data1 = new HashMap<>();
		data1.putAll(data);
		System.out.println("data1 mappings= " + data1);

		String nullKeyValue = data1.remove(null);
		System.out.println("data1 null key value = " + nullKeyValue);
		System.out.println("data1 after removing null key = " + data1);

		Set<String> keySet = data.keySet();
		System.out.println("data map keys = " + keySet);

		Collection<String> values = data.values();
		System.out.println("data map values = " + values);

		data.clear();
		System.out.println("data map is empty =" + data.isEmpty());

	}

}

上述Map示例程序的输出为;

Key = C, Value = C
Key = E, Value=Default Value
keyExists= true, valueExists= true
[null=Z, A=A, B=B, C=C, D=null]
data map size=5
data1 mappings= {null=Z, A=A, B=B, C=C, D=null}
data1 null key value = Z
data1 after removing null key = {A=A, B=B, C=C, D=null}
data map keys = [null, A, B, C, D]
data map values = [Z, A, B, C, null]
data map is empty =true