Java源码学习之Map

Map

       是将键(key)映射到值(value)的对象。一个map不能有重复的键,每一键最多映射到一个值。

       这一接口代替了作为抽象类的Dictionary。          

       map接口提供了三种容器视角(view):键的集合(set),值的容器(collection),键值映射的集合(set)。map的顺序取决于迭代器返回元素的顺序。一些map有序,比如TreeMap;一些无序,比如HashMap。

       当易变的元素作为map的键时,应当格外注意。当一个变量以一种会影响equals比较结果的方式改变,且当它作为map的键时,这一map的行为将不确定。map不允许将其自身作为值,在这样的map上equals和hashCode不再被良好地定义。

一些特别的操作:

       public interface Map<K, V>

     1.查询性操作:

       boolean containsKey(Object key): 返回map是否包含一个特定值的映射。即key==null?k==null:key.equals(k)。

   boolean containsValue(Object value): 如果这个map有一个或多个键映射在这个值上。即value==null?v==null:value.equals(v)。对于大部分的Map接口的实现这一操作很可能需要与map大小线性相关的时间。

       V get(Object key): 返回key所映射的值,如果没有则null。

     2.更改性操作:

       V put(k key, V value): 将特定的值与map中特定的键相联系。返回原先与key相练习的值,无则null。

       V remove(Object key): 从map中删除一个键的映设。返回map中键原先映设的值,无则null.

     3.批量性操作

       void putAll(map<? extends K, ? extends V> m): 将特定map的所有映设复制到当前map。当特定map在操作过程中改变了则导致这一操作行为不定。

     4.Views

       Set<K> keySet(): 返回map所包含的键的集合。这个集合是map所备份的,所以map的改变会反应在集合上,反之亦然。如果在集合的迭代过程中map改变了,迭代的结果不定。这个集合支持元素删除,由此map中相应的映设也将通过Iterator.remove,Set.remove,removeAll,retainAll和clear操作删除。这个集合不支持add和addAll操作,会抛出异常。

       Collection<V> values(): 返回map包含的值的容器。其余同上。

       Set<Map.Entry<K, V>> entrySet(): 返回map中所包含的映设的集合,其余同上。

       Entry是一个接口,定义如下:

       interface Entry<K, V>:  它就是键值对的map条目(entry)。迭代器是获得map条目引用的唯一方式。这些Map.Entry对象仅在迭代期间是有效的。它内置有K getKey(),V getValue(),V setValue(V value), boolean equals(Object o),int hashCode()等方法。

     5.默认方法

       default V getOrDefault(Object key, V defaultValue): 返回特定键映射的值,无则返回defaultValue。这一默认实现对该方法的同步和原子属性(atomicity properties)没有保证。任何提供了原子保证的实现必须重载这一方法并且记录它的同步属性。

       default void forEach(BiConsumer<? super K, ? super V> action):对每一个map中的每个entry都执行action操作,直到遍历完所有的entry或抛出异常。action的执行顺序依照entry集合迭代器的顺序。

       default void replaceAll(BiFunction<? super K, ? super V, ? extends V> function):用function的结果代替每一个entry的值,直到遍历完所有的entry或者抛出异常。

       default V putIfAbsent(K key, V value):如果特定键没有映射的值(或是映射为null),将它映射为所给的值并返回null,否则返回当前值。

       default boolean remove(Object key, Object value):当特定的键映射为特定的值时,删除该entry。当key映射为null且value=null时也会删。

       default boolean replace(K key, V oldValue, V newValue) :当特定的键映射为特定的值时,替换掉该entry。否则不变。

       default V replace(K key, V value):当特定的键有映射的值时,替换它,并返回原来的值。

      default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction):当特定的键没有映射的值(或null)时,尝试通过mappingFunction计算出值并将其写入map,除非该值是null。如果发生替换则返回新值,无则原来的值。常用的用法有:

       构建一个作为初始映射值或是备忘结果的对象,如

   map.computeIfAbsent(key, k -> new Value(f(k)));

        实现多值的映射,Map<K, Collection<V>>支持每一键有多个值:

   map.computeIfAbsent(key, k -> new HashSet<V>()).add(v);
       default V computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction):如果特定的键有映射为非null的值,尝试计算新值赋予键。如果计算结果是null则删除映射,如果function本身会抛出异常,那么该异常会再度被抛出,映射将不变。

       default V compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction):为特定的键和其新值做映射。如果function返回null,则删除映射或保持原本就没有的状态。如果function抛出异常了,映射不变。

       default V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction):当特定的键没有映射或映射为null时,将其映射为非null的value。否则映射为function的结果,若结果是null则删除它。这一方法多用于对一个键联合多个映射值。比如为值创建或增加msg:

   map.merge(key, msg, String::concat);
       注意:它的function是作用在key原映射的值和value上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值