我是靠谱客的博主 优秀小松鼠,最近开发中收集的这篇文章主要介绍java.util.HashMap,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、注释

  • 基于hash table的Map接口实现。HashMap提供所有map的可选操作,允许键和值为null。(HashMap除了unsynchronized和允许null值,与Hashtable相同)。HashMap不保证元素顺序,特别是随着时间推移。
  • 在hash函数正确的分散元素到buckets中时,HashMap对基本的get和put操作提供常数项时间性能。对集合视图的迭代则与HashMap实例的capacity(buckets的数量)和size(key-value键值对的数量)成比例。因此,如果迭代性能非常重要时,不要把initial capacity初识容量设置的太高(或者load factor负载因子设置太低)
  • 有两个参数影响HashMap实例的性能:initial capacity初识容量和load factor负载因子。capacity就是hash tablebuckets的数量,initial capacity就是hash table创建时的容量。load factorhash table再次自动增长时能有多满的一个衡量值。当hash table中entires的数量超过load factor* 当前capacity时,hash table会进行rehashed(),hash tablebuckets数量会翻倍
  • 一般情况下,默认load factor(0.75)在时间和空间成本之间提供了一个较好的平衡。较高的值会减少空间开销但是会增加查找成本(反映在HashMap绝大多数操作,包括get和put)。为了减少rehash的操作,在设置initial capacity时应该考虑集合存储的元素数量和load factor。如果initial capacity大于元素数量除以load factor,就不会发生rehash操作。
  • 如果要在HashMap实例中存储许多元素,再创建时设置比较大的容量比它进行rehashed自动增长容量要更有效率。注意这点,对于任何hash table,用很多有相同hashCode()的keys是最能降低hash table的性能,当keys是可比较时,HashMap会使用keys之间的比较来改善这种状况。
  • 请注意,此实现不是synchronized的。如果多个线程并发访问,并且至少又一个线程修改map的结构时,必须在外部进行synchronized。(结构修改是指增加或删除一个或多个mappings映射,改变一个key对应的value不属于结构的修改)。这通常通过一个对象锁来实现,如果不存在这个对象,也可以使用Collections.synchronizedMap来实现:Map m = Collections.synchronizedMap(new HashMap(...));
  • 对于这个类的所有返回的iterator方法:在iterator创建后,除了通过iterator的remove方法,任何对map的结构修改都会fast-fail快速失败,并抛出异常ConcurrentModificationException。在并发修改的情况下,iterator会快速干净的失败,而不是在未来发生不确定的风险。
  • 请注意,迭代器的故障快速行为无法得到保证,因为一般来说,在存在非同步并发修改时,无法做出任何硬性保证。失败快速的迭代器会尽最大努力抛出ConcurrentModificationException。因此,编写依赖于此异常的程序以确保其正确性是错误的:迭代器的失败快速行为应该 仅用于检测错误。

二、主要方法分析

三、使用注意

四、参考

  • https://crossoverjie.top/2018/07/23/java-senior/ConcurrentHashMap/

最后

以上就是优秀小松鼠为你收集整理的java.util.HashMap的全部内容,希望文章能够帮你解决java.util.HashMap所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部