-
public interface Map<K,V>
将键映射到值的对象。地图不能包含重复的键;每个键可以映射到最多一个值。
这个接口取代了
Dictionary
类,它是一个完全抽象的类而不是接口。Map
界面提供了三个集合视图 ,允许将映射内容视为一组键,值集合或键值映射集合。 地图的顺序被定义为其中在地图上的集合视图迭代返回元素的顺序。 一些地图实现,如TreeMap
课程,对他们的订单做出了具体的保证; 其他人,像HashMap
班,不要。注意:如果使用可变对象作为地图键,必须非常小心。 如果对象的值以影响
equals
比较的方式更改,而对象是地图中的键,则不会指定地图的行为。 这个禁令的一个特殊情况是,地图不允许将自己包含在内。 虽然地图可以将其本身作为一个值,但建议您非常小心:equals
和hashCode
方法在这样的地图上已经不太明确。所有通用映射实现类应提供两个“标准”构造函数:一个创建空映射的void(无参数)构造函数,以及一个具有类型为
Map
的单个参数的构造函数
,它创建一个具有相同键值的新映射映射作为参数。 实际上,后一个构造函数允许用户复制任何地图,产生所需类的等效地图。 没有办法强制执行此建议(因为接口不能包含构造函数),而JDK中的所有通用映射实现都符合要求。包含在该界面中的“破坏性”的方法,即,修改其操作地图的方法,被指定抛出
UnsupportedOperationException
如果此映射不支持该操作。 如果是这种情况,如果调用对地图没有影响,这些方法可能会但不是必须抛出UnsupportedOperationException
。 例如,如果映射映射为“叠加”的地图为空,则可以在不可修改的映射上调用putAll(Map)
方法,但不是必须抛出异常。一些地图实现对它们可能包含的键和值有限制。 例如,一些实现禁止空键和值,有些对键的类型有限制。 尝试插入不合格的键或值会抛出未经检查的异常,通常为
NullPointerException
或ClassCastException
。 尝试查询不合格键或值的存在可能会引发异常,或者可能只是返回false; 一些实现将展现出前者的行为,一些实现将展现出后者。 更一般来说,尝试对不符合条件的密钥或值的操作,其完成不会导致将不合格元素插入到地图中可能会导致异常或可能成功执行该选项。 此异常在此接口的规范中标记为“可选”。Collections Framework接口中的许多方法都是按照
equals
方法定义的。 例如,对于在本说明书containsKey(Object key)
方法表示:“返回true
当且仅当此映射包含一个键k
使得(key==null ? k==null : key.equals(k))
的映射。” 该规范不应该被解释为意味着具有非空参数调用key
Map.containsKey
会导致key.equals(k)
被调用的任意键k。
实现可以实现优化,从而避免equals的
调用,例如,首先比较两个密钥的哈希码。 (Object.hashCode()
规范保证具有不等的哈希码的两个对象不能相等。)更一般地,各种Collections Framework接口的实现可以随意使用底层Object
方法的指定行为,无论执行者认为适当。执行递归遍历地图的一些地图操作可能会失败,并且地图直接或间接包含自身的自引用实例有异常。 这包括
clone()
,equals()
,hashCode()
和toString()
方法。 实现可以可选地处理自引用场景,然而大多数当前实现不这样做。常用方法已标黑
-
-
void
clear()
从该地图中删除所有的映射(可选操作)。default V
compute(K key, BiFunction remappingFunction)
尝试计算指定键的映射及其当前映射的值(如果没有当前映射,null
)。default V
computeIfAbsent(K key, Function mappingFunction)
如果指定的键尚未与值相关联(或映射到null
),则尝试使用给定的映射函数计算其值,并将其输入到此映射中,除非null
。default V
computeIfPresent(K key, BiFunction remappingFunction)
如果指定的密钥的值存在且非空,则尝试计算给定密钥及其当前映射值的新映射。boolean
containsKey(Object key)
如果此映射包含指定键的映射,则返回true
。boolean
containsValue(Object value)
如果此地图将一个或多个键映射到指定的值,则返回true
。Set>
entrySet()
返回此地图中包含的映射的Set
视图。boolean
equals(Object o)
将指定的对象与此映射进行比较以获得相等性。default void
forEach(BiConsumer action)
对此映射中的每个条目执行给定的操作,直到所有条目都被处理或操作引发异常。V
get(Object key)
返回到指定键所映射的值,或null
如果此映射包含该键的映射。default V
getOrDefault(Object key, V defaultValue)
返回到指定键所映射的值,或defaultValue
如果此映射包含该键的映射。int
hashCode()
返回此地图的哈希码值。boolean
isEmpty()
如果此地图不包含键值映射,则返回true
。Set
keySet()
返回此地图中包含的键的Set
视图。default V
merge(K key, V value, BiFunction remappingFunction)
如果指定的键尚未与值相关联或与null相关联,则将其与给定的非空值相关联。V
put(K key, V value)
将指定的值与该映射中的指定键相关联(可选操作)。void
putAll(Map m)
将指定地图的所有映射复制到此映射(可选操作)。default V
putIfAbsent(K key, V value)
如果指定的键尚未与某个值相关联(或映射到null
)将其与给定值相关联并返回null
,否则返回当前值。V
remove(Object key)
如果存在(从可选的操作),从该地图中删除一个键的映射。default boolean
remove(Object key, Object value)
仅当指定的密钥当前映射到指定的值时删除该条目。default V
replace(K key, V value)
只有当目标映射到某个值时,才能替换指定键的条目。default boolean
replace(K key, V oldValue, V newValue)
仅当当前映射到指定的值时,才能替换指定键的条目。default void
replaceAll(BiFunction function)
将每个条目的值替换为对该条目调用给定函数的结果,直到所有条目都被处理或该函数抛出异常。int
size()
返回此地图中键值映射的数量。Collection
values()
返回此地图中包含的值的Collection
视图。
-
public class MyMap {
public static void main(String[] args) {
//多态
Map<String, String> map = new HashMap<>();
String a = map.put("111", "a");//返回的是被替换的值
String b = map.put("111", "b");
System.out.println(b);//a
map.put("222","c");
map.put("333","d");
map.put("444","e");
System.out.println(map);//{111=b, 222=c, 333=d, 444=e}
boolean b1 = map.containsKey("222");
boolean b2 = map.containsKey("88");
System.out.println(b1+","+b2);//true,false
boolean e = map.containsValue("e");
System.out.println(e);//true
String s = map.get("444");
System.out.println(s);//e
map.remove("111");
System.out.println(map);//{222=c, 333=d, 444=e}
Set<String> strings = map.keySet();
System.out.println(strings);//[222, 333, 444]
for (String string : strings) {
System.out.println(map.get(string));
}
System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@");
Iterator<String> it = strings.iterator();
while (it.hasNext()){
System.out.println(map.get(it.next()));
}
System.out.println("########################");
Set<Map.Entry<String, String>> entrySet = map.entrySet();
for (Map.Entry<String, String> entry : entrySet) {
System.out.println(entry.getKey()+"-->"+entry.getValue());
}
Iterator<Map.Entry<String, String>> iterator = entrySet.iterator();
while (iterator.hasNext()){
Map.Entry<String, String> entry = iterator.next();
System.out.println(entry.getKey()+">>"+entry.getValue());
}
}
}
-
public class HashMap<K,V>
extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable基于哈希表的实现的
Map
接口。 此实现提供了所有可选的地图操作,并允许null的
值和null
键。 (HashMap
类大致相当于Hashtable
,除了它是不同步的,并允许null)。这个类不能保证地图的顺序; 特别是,它不能保证订单在一段时间内保持不变。
map集合保证key是唯一的:
作为key的元素,必须重写hashcode和equal方法。
LinkedHashMap
-
public class LinkedHashMap<K,V>
extends HashMap<K,V>
implements Map<K,V>哈希表和链表实现的
Map
接口,具有可预测的迭代次序。 这种实现不同于HashMap,
它维持于所有条目的运行双向链表。 此链接列表定义迭代排序,通常是将键插入到地图(插入顺序 )中的顺序 。 请注意,如果将键重新插入到地图中,则插入顺序不受影响。 (A键k
被重新插入到地图m
如果当m.containsKey(k)
将返回true
之前立即调用m.put(k, v)
被调用。)此实现可以让客户从提供的指定,通常杂乱无章的排序
HashMap
(及Hashtable
),而不会导致与其相关的成本增加TreeMap
。 无论原始地图的实现如何,它都可用于生成与原始地图相同顺序的地图副本:void foo(Map m) {
Map copy = new LinkedHashMap(m);
...
} -