第一章 java 基础 - 03集合专栏(03_HashMap)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_39923324/article/details/82015291

无意间都到一篇《走心的安卓工程师跳槽经验分享》,发现自己工作几年了,技术方面虽然有了飞跃的进步,可是不知道自己的技术到了什么地步,每个方面我都涉及到了,但都不深,这大概是初级工程师的诟病吧!

即使知道也不知道从何下手,非常感谢《走心的安卓工程师跳槽经验分享》的作者!

感兴趣的朋友和我一起走下去吧!

03集合专栏(03_HashMap)

生命 <K,Y>不请不显示,而且会导致后面的内容看不到,故用《K,V》代替。
Class HashMap<K,V>
java.lang.Object
    java.util.AbstractMap<K,V>
        java.util.HashMap<K,V>

类型参数:
K - 此地图维护的密钥类型
V - 映射值的类型
所有已实现的接口:

Serializable,Cloneable,Map <K,V>

直接已知子类:

LinkedHashMap, PrinterStateReasons
public class HashMap<K,V> extends AbstractMap<K,V>
        implements Map<K,V>, Cloneable, Serializable{
    }

基于哈希表的Map接口实现。此实现提供所有可选的映射操作,并允许空值和空键。 (HashMap类大致相当于Hashtable,除了它是不同步的并且允许空值。)这个类不保证地图的顺序;特别是,它不保证订单会随着时间的推移保持不变。
假设散列函数在桶之间正确地分散元素,该实现为基本操作(get和put)提供了恒定时间性能。对集合视图的迭代需要与HashMap实例的“容量”(桶的数量)加上其大小(键 - 值映射的数量)成比例的时间。因此,如果迭代性能很重要,则不要将初始容量设置得太高(或负载因子太低)非常重要。

HashMap的一个实例有两个影响其性能的参数:初始容量和负载因子。容量是哈希表中的桶数,初始容量只是创建哈希表时的容量。加载因子是在自动增加容量之前允许哈希表获取的完整程度的度量。当哈希表中的条目数超过加载因子和当前容量的乘积时,哈希表将被重新哈希(即,重建内部数据结构),以便哈希表具有大约两倍的桶数。

作为一般规则,默认加载因子(.75)在时间和空间成本之间提供了良好的折衷。较高的值会减少空间开销,但会增加查找成本(反映在HashMap类的大多数操作中,包括get和put)。在设置其初始容量时,应考虑映射中的预期条目数及其负载因子,以便最小化重新散列操作的数量。如果初始容量大于最大条目数除以加载因子,则不会发生重新加载操作。

如果要将多个映射存储在HashMap实例中,则使用足够大的容量创建映射将允许映射更有效地存储,而不是根据需要执行自动重新散列来扩展表。

请注意,此实现不同步。如果多个线程同时访问哈希映射,并且至少有一个线程在结构上修改了映射,则必须在外部进行同步。 (结构修改是添加或删除一个或多个映射的任何操作;仅更改与实例已包含的键相关联的值不是结构修改。)这通常通过同步自然封装映射的某个对象来完成。 。如果不存在此类对象,则应使用Collections.synchronizedMap方法“包装”该映射。这最好在创建时完成,以防止意外地不同步访问地图:

   Map m = Collections.synchronizedMap(new HashMap(...));

所有这个类的“集合视图方法”返回的迭代器都是快速失败的:如果在创建迭代器之后的任何时候对映射进行结构修改,除了通过迭代器自己的remove方法之外,迭代器将抛出ConcurrentModificationException。 。因此,在并发修改的情况下,迭代器快速而干净地失败,而不是在未来的未确定时间冒任意,非确定性行为的风险。

请注意,迭代器的快速失败行为无法得到保证,因为一般来说,在存在不同步的并发修改时,不可能做出任何硬性保证。失败快速迭代器会尽最大努力抛出ConcurrentModificationException。因此,编写依赖于此异常的程序以确保其正确性是错误的:迭代器的快速失败行为应该仅用于检测错误。

此类是Java Collections Framework的成员。

构造函数

public HashMap(int initialCapacity, float loadFactor)
使用指定的初始容量和加载因子构造一个空的HashMap。
参数:
initialCapacity - 初始容量
loadFactor - 加载因子
抛出:
IllegalArgumentException - 如果初始容量为负数或负载因子为非正数

public HashMap(int initialCapacity)
使用指定的初始容量和默认加载因子(0.75)构造一个空的HashMap。
参数:
initialCapacity - 初始容量。
抛出:
IllegalArgumentException - 如果初始容量为负数。

public HashMap()
使用默认初始容量(16)和默认加载因子(0.75)构造一个空的HashMap。

public HashMap(Map <?extends K,?extends V> m)
使用与指定Map相同的映射构造一个新的HashMap。使用默认加载因子(0.75)创建HashMap,初始容量足以保存指定Map中的映射。
参数:
m - 要将映射放在此映射中的映射
抛出:
NullPointerException - 如果指定的映射为null

方法

public int size()
返回此映射中键 - 值映射的数量。
具体说明:
接口Map 《K,V》中的大小
覆盖:
AbstractMap《K,V》类中的大小
返回:
此映射中键 - 值映射的数量

public boolean isEmpty()
如果此映射不包含键 - 值映射,则返回true。
具体说明:
接口Map 《K,V》中的isEmpty
覆盖:
类AbstractMap《K,V》中的isEmpty
返回:
如果此映射不包含键 - 值映射,则返回true

public V get(对象键)
返回指定键映射到的值,如果此映射不包含键的映射,则返回null。
更正式地说,如果此映射包含从键k到值v的映射,使得(key == null?k == null:key.equals(k)),则此方法返回v;否则返回null。 (最多可以有一个这样的映射。)
返回值null不一定表示映射不包含键的映射;地图也可能显式地将键映射为null。 containsKey操作可用于区分这两种情况。
具体说明:
进入接口Map 《K,V》
覆盖:
在类AbstractMap《K,V》中获取
参数:
key - 要返回其关联值的键
返回:
指定键映射到的值,如果此映射不包含键的映射,则返回null
也可以看看:
put(Object, Object)

public boolean containsKey(Object key)
如果此映射包含指定键的映射,则返回true。
具体说明:
接口Map 《K,V》中的containsKey
覆盖:
abstractMap《K,V》中的containsKey
参数:
key - 要测试其在此映射中的存在的密钥
返回:
如果此映射包含指定键的映射,则返回true。

public V put(K key, V value)
将指定的值与此映射中的指定键相关联。如果映射先前包含键的映射,则替换旧值。
具体说明:
放入接口Map《K,V》
覆盖:
放在类AbstractMap《K,V》中
参数:
key - 与指定值关联的键
value - 要与指定键关联的值
返回:
与key关联的先前值,如果没有key的映射,则返回null。 (null返回也可以指示以前的映射与键关联的null。)

public void putAll(Map <?extends K,?extends V> m)
将指定映射中的所有映射复制到此映射。这些映射将替换此映射对当前位于指定映射中的任何键的任何映射。
具体说明:
putAll在接口Map《K,V》中
覆盖:
在AbstractMap 《K,V》类中putAll
参数:
m - 要存储在此映射中的映射
抛出:
NullPointerException - 如果指定的映射为null

public V remove(Object key)
从此映射中删除指定键的映射(如果存在)。
具体说明:
在接口Map《K,V》中删除
覆盖:
在类AbstractMap《K,V》中删除
参数:
key - 要从地图中删除其映射的键
返回:
与key关联的先前值,如果没有key的映射,则返回null。 (null返回也可以指示以前的映射与键关联的null。)

public void clear()
从此映射中删除所有映射。此调用返回后,映射将为空。
具体说明:
在接口Map 《K,V》中清除
覆盖:
在AbstractMap《K,V》类中清除
中的containsValue
public boolean containsValue(Object value)
如果此映射将一个或多个键映射到指定值,则返回true。
具体说明:
接口Map《K,V》中的containsValue
覆盖:
abstractMap 《K,V》中的containsValue
参数:
value - 要测试其在此映射中的存在的值
返回:
如果此映射将一个或多个键映射到指定值,则返回true

public Object clone()
返回此HashMap实例的浅表副本:未克隆键和值本身。
覆盖:
在类AbstractMap 《K,V》中克隆
返回:
这张地图的浅表副本
也可以看看:
Cloneable

public Set keySet()
返回此映射中包含的键的Set视图。该集由地图支持,因此对地图的更改将反映在集中,反之亦然。如果在对集合进行迭代时修改了映射(除了通过迭代器自己的remove操作),迭代的结果是未定义的。该集支持元素删除,它通过Iterator.remove,Set.remove,removeAll,retainAll和clear操作从地图中删除相应的映射。它不支持add或addAll操作。
具体说明:
接口Map 《K,V》中的keySet
覆盖:
类AbstractMap 《K,V》中的keySet
返回:
此映射中包含的键的设置视图

public Collection values()
返回此映射中包含的值的Collection视图。该集合由地图支持,因此对地图的更改将反映在集合中,反之亦然。如果在对集合进行迭代时修改了映射(除了通过迭代器自己的remove操作),迭代的结果是未定义的。该集合支持元素删除,它通过Iterator.remove,Collection.remove,removeAll,retainAll和clear操作从地图中删除相应的映射。它不支持add或addAll操作。
具体说明:
接口Map《K,V》中的值
覆盖:
类AbstractMap 《K,V》中的值
返回:
此映射中包含的值的集合视图

public Set 《Map.Entry《K,V》 》 entrySet()
返回此映射中包含的映射的Set视图。该集由地图支持,因此对地图的更改将反映在集中,反之亦然。如果在对集合进行迭代时修改了映射(除非通过迭代器自己的remove操作,或者通过迭代器返回的映射条目上的setValue操作),迭代的结果是未定义的。该集支持元素删除,它通过Iterator.remove,Set.remove,removeAll,retainAll和clear操作从地图中删除相应的映射。它不支持add或addAll操作。
具体说明:
接口Map 《K,V》中的entrySet
具体说明:
类AbstractMap 《K,V》中的entrySet
返回:
此映射中包含的映射的set视图

猜你喜欢

转载自blog.csdn.net/weixin_39923324/article/details/82015291