类简介
Map
是一个保存“键值对”的对象。所以:
- “键”也就是
key
不能重复 - 一个“键”对应一个值
Map
接口提供了三种进行遍历的方法:
获得一个
key
的Iterator
获得一个
value
的Collection
获得一个关于
Entry
的Iterator
,其中Entry
是Map
的内部类当然,如果
Map
中的元素是有顺序的,返回的结果也会有顺序。
Map
的key
不能引自己,但是value
可以。还有,
Map
尽量不要把容易改变的对象作为key
。
和
Iterator
,Collection
一样,要提供两个构造方法,后面的不再详述。
改变结构的方法,比如增删改,可能会抛
UnsupportedOperationException
异常。
添加或者修改的数据如果非法可能会抛异常。
Map
中的很多和查找有关的方法都是依赖key
或者value
的equals()
方法,所以记得根据自己的需求重写Object
的equals()
。
类源码简介
Map<K,V>
中K
表示key
,V
表示value
。
方法
int size();
boolean isEmpty();
boolean containsKey(Object key);
boolean containsValue(Object value);
V get(Object key);
V put(K key, V value);
put
和http请求的那个put差不多,是修改的意思,返回的是老的value
,如果返回空表示
- 修改失败
- map支持null且原来的值是null
V remove(Object key);
void putAll(Map<? extends K, ? extends V> m);
void clear();
Set<K> keySet();
返回一个以集合中所有的key
作为元素的Set
注意:
Map
中对key
的修改会影响到这个Set
。举个栗子:
我先得到了一个
Set A
,然后遍历Set A
时,有人对Map
做了增删(总之是一切能影响到key
的操作),这样在遍历Set A
时会出现失败或者其他的情况。(Collection
在遍历时不允许修改元素)
Collection<V> values();
- 见名知意
- 该注意的和上边的一样
Set<Map.Entry<K, V>> entrySet();
- 同上一个接口
- 关于
Entry
的介绍看下边
boolean equals(Object o);
int hashCode();
default V getOrDefault(Object key, V defaultValue)
对get()
方法做了一个包装,get()
发现key
不存在时返回null
,这个返回传入的defaultValue
。
default void forEach(BiConsumer<? super K, ? super V> action)
对每个元素调用传入的action()
方法,关于函数式接口我们后面专门记录。
default void replaceAll(BiFunction<? super K, ? super V, ? extends V> function)
对泛型的解释如下:
-
BiFunction<? super K, ? super V, ? extends V> function)
我们设为BiFunction<A,B,C> function)
- 则该方法等同
C function(A,B)
- 考虑到逻辑,可以表示为
newValue function(key,OldValue)
- 我们知道java的一种上转型规律,即
A = B
,则A
属性是B
或者B
的父类 - 因为
oldValue
属性是V
,则B=V
,所以B
属性应该是V
或者V
的父类,所以B
是? super V
- 因为
newValue
属性是V
,返回的结果是V
,则V=C
,所以C
属性应该是V
或者V
的子类,所以C
是? extends V
default V putIfAbsent(K key, V value)
如果没有或者存在但是value
为null
就执行put
操作
default boolean remove(Object key, Object value)
default boolean replace(K key, V oldValue, V newValue)
default V replace(K key, V value)
default V computeIfAbsent(K key,Function<? super K, ? extends V> mappingFunction)
如果没有或者存在但是value
为null
【调用get()
返回null
】就调用函数mappingFunction()
default V computeIfPresent(K key,BiFunction<? super K, ? super V, ? extends V> remappingFunction)
如果调用get()
返回不是null
,则调用remappingFunction()
方法计算
default V compute(K key,BiFunction<? super K, ? super V, ? extends V> remappingFunction)
对key
为key
的映射调用方法remappingFunction()
default V merge(K key, V value,BiFunction<? super V, ? super V, ? extends V> remappingFunction)
对oldValue
和传入的value
进行合并,如果oldValue==null
则取值value
,负责调用remappingFunction()
获得新值。值结果为空则移除映射,否则设置新值。
内部类 Entry<K,V>
K getKey();
V getValue();
V setValue(V value);
boolean equals(Object o);
int hashCode();
public static <K extends Comparable<? super K>, V> Comparator<Map.Entry<K,V>> comparingByKey();
返回一个Comparator
用来比较。凑,我先看那个吧,这个看不下去了。后面再完善这部分。
网友评论