首页 > 编程语言 >Java HashMap类

Java HashMap类

时间:2023-10-24 13:08:06浏览次数:46  
标签:map Java HashMap 因子 key Entry 加载

HashMap是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以key-value的形式存在。

HashMap实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了不同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。

HashMap不是线程安全的,如果想要线程安全的HashMap,可以通过Collections类的静态方法synchronizedMap获得线程安全的HashMap,例如:Map map = Collections.synchronizedMap(new HashMap());

构造函数

HashMap():构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap。
HashMap(int initialCapacity):构造一个带指定初始容量和默认加载因子 (0.75) 的空 HashMap。
HashMap(int initialCapacity, float loadFactor):构造一个带指定初始容量和加载因子的空 HashMap。

在这里提到了两个参数:初始容量,加载因子。这两个参数是影响HashMap性能的重要参数,其中容量表示哈希表中桶的数量,初始容量是创建哈希表时的容量,加载因子是哈希表在其容量自动增加之前可以达到多满的一种尺度,它衡量的是一个散列表的空间的使用程度,负载因子越大表示散列表的装填程度越高,反之愈小。对于使用链表法的散列表来说,查找一个元素的平均时间是O(1+a),因此如果负载因子越大,对空间的利用更充分,然而后果是查找效率的降低;如果负载因子太小,那么散列表的数据将过于稀疏,对空间造成严重浪费。系统默认负载因子为0.75,一般情况下我们是无需修改的。

属性

transient Entry[] table;//存储元素的实体数组
transient int size;//存放元素的个数
int threshold; //临界值   当实际大小超过临界值时,会进行扩容threshold = 加载因子*容量
final float loadFactor; //加载因子
transient int modCount;//被修改的次数

其中loadFactor加载因子是表示Hsah表中元素的填满的程度.若:加载因子越大,填满的元素越多,好处是,空间利用率高了,但:冲突的机会加大了.链表长度会越来越长,查找效率降低。反之,加载因子越小,填满的元素越少,好处是:冲突的机会减小了,但:空间浪费多了.表中的数据将过于稀疏(很多空间还没用,就开始扩容了)冲突的机会越大,则查找的成本越高.因此,必须在 "冲突的机会"与"空间利用率"之间寻找一种平衡与折衷. 这种平衡与折衷本质上是数据结构中有名的"时-空"矛盾的平衡与折衷. 如果机器内存足够,并且想要提高查询速度的话可以将加载因子设置小一点;相反如果机器内存紧张,并且对查询速度没有什么要求的话可以将加载因子设置大一点。不过一般我们都不用去设置它,让它取默认值0.75就好了。

方法

void

clear()

Removes all of the mappings from this map.

Object

clone()

Returns a shallow copy of this HashMap instance: the keys and values themselves are not cloned.

boolean

containsKey(Object key)

Returns true if this map contains a mapping for the specified key.

boolean

containsValue(Object value)

Returns true if this map maps one or more keys to the specified value.

Set<Map.Entry<K,V>>

entrySet()  返回一个包含HashMap的键值对的set

V

get(Object key) 根据键获取值

boolean

isEmpty() 

Returns true if this map contains no key-value mappings.

Set<K>

keySet() 返回一个HashMap键的Set

V

put(K key, V value)

Associates the specified value with the specified key in this map.

void

putAll(Map<? extends K,? extends V> m)

Copies all of the mappings from the specified map to this map.

V

remove(Object key) 根据键移除

int

size()

Collection<V>

values() 返回一个HashMap的值的Collection

数据结构

Hashmap是一个数组和链表的结合体(在数据结构称“链表散列“),如下图示:

Java HashMap类_数组

当我们往hashmap中put元素的时候,先根据key的hash值得到这个元素在数组中的位置(即下标),然后就可以把这个元素放到对应的位置中了。如果这个元素所在的位子上已经存放有其他元素了,那么在同一个位子上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾。

例子

Map map = new HashMap();
map.put("Rajib Sarma","100");
map.put("Rajib Sarma","200");//The value "100" is replaced by "200".
map.put("Sazid Ahmed","200");

Iterator iter = map.entrySet().iterator();
while (iter.hasNext()) {
    Map.Entry entry = (Map.Entry) iter.next();
    Object key = entry.getKey();
    Object val = entry.getValue();
}

总结

1. 归纳起来简单地说,HashMap 在底层将 key-value 当成一个整体进行处理,这个整体就是一个 Entry 对象。HashMap 底层采用一个 Entry[] 数组来保存所有的 key-value 对,当需要存储一个 Entry 对象时,会根据 Hash 算法来决定其存储位置;当需要取出一个 Entry 时,也会根据 Hash 算法找到其存储位置,直接取出该 Entry。由此可见:HashMap 之所以能快速存、取它所包含的 Entry,完全类似于现实生活中母亲从小教我们的:不同的东西要放在不同的位置,需要时才能快速找到它。 
2. 当创建 HashMap 时,有一个默认的负载因子(load factor),其默认值为 0.75,这是时间和空间成本上一种折衷:增大负载因子可以减少 Hash 表(就是那个 Entry 数组)所占用的内存空间,但会增加查询数据的时间开销,而查询是最频繁的的操作(HashMap 的 get() 与 put() 方法都要用到查询);减小负载因子会提高数据查询的性能,但会增加 Hash 表所占用的内存空间。 

标签:map,Java,HashMap,因子,key,Entry,加载
From: https://blog.51cto.com/u_16248220/8002332

相关文章

  • Java中Servlet Filter配置(web.xml详解)
    Java中ServletFilter在web.xml中配置时有2个用于过滤器的元素,分别是filter和filter-mapping。filter元素向系统注册一个过滤对象,filter-mapping元素指定该过滤对象所应用的URL。Filter配置过滤器元素filter元素filter元素位于部署描述符文件(web.xml)的前部,所有filter-mapping、serv......
  • JAVA架构师具备的技术和能力
    JAVA架构师是一种高级职位,需要具备深厚的技术实力和广泛的能力。以下是JAVA架构师常见的技术和能力要求:1、扎实的编程基础:JAVA架构师需要具备良好的编程能力和深入理解JAVA语言特性和编程范式,熟悉面向对象编程和设计模式。2、深入理解框架和技术栈:JAVA架构师需要熟练掌握常用的JAVA......
  • 记录一次Java编程题(适合所有的新手哦)
    题目:用Java编写以下代码:1)定义一个抽象的商品类Production,包含商品号id、商品名name、商品价格price3个数据成员;2)定义3个分别用来获取商品号、商品名、商品价格的成员方法;3)定义一个抽象的输出数据成员信息的方法abstractvoidshowInfo();注意使用适当的访问控制符对属性和方......
  • 华为云耀云服务器L实例 - java环境配置
     Java环境在云服务器上是为了支持Java应用程序的运行、开发和使用Java生态系统中的各种工具和库。它为开发人员提供了一个稳定和可靠的平台,使他们能够利用Java的强大功能来构建高性能、可扩展和安全的应用程序。1. 登录华为云耀云服务器L实例:使用SSH或远程桌面工具登录到您......
  • Java:自定义实现SpringBoot Starter
    (目录)1、自定义Starter1.1、项目结构$tree.├──pom.xml└──src├──main│├──java││└──com││└──example││└──demo││├──ReadingConfiguration.java......
  • Java医院绩效考核系统源码
    一、系统总体功能作为医院用综合绩效核算系统,系统需要和his系统进行对接,按照设定周期,从his系统获取医院科室和医生、护士、其他人员工作量,对没有录入信息化系统的工作量,绩效考核系统设有手工录入功能(可以批量导入),对获取的数据系统按照设定的公式进行汇算,且设置审核机制,可以退回修......
  • Java中将Byte[] 转成封装类型
    今天做一个需求,需要将byte[]类型转换为Double和String,因此整理起来 Doublebyte[]转doublepublicDoublebyteArrayToDouble(byte[]bytes){if(bytes.length!=8){thrownewIllegalArgumentException("数据长度不符");}longlongBits=0;for(inti=0;i<8......
  • 如何使用Java Spring Boot 创建一个微服务项目 一?
    如何使用JavaSpringBoot创建一个微服务项目一?微服务现在更流行。它们可以用任何语言编写。在这篇文章中,让我们看看SpringBoot微服务。在本文中,我们看到一个基础项目currency-exchange-sample-service,它具有业务逻辑,并且可以在另一个项目 currency-conversion-sample-service ......
  • 如何使用Java Spring Boot 创建一个微服务项目 二?
    如何使用JavaSpringBoot创建一个微服务项目二?上一篇我们已经链接了如何使用JavaSpringBoot创建一个微服务项目一?这一篇我们接着实现第二部分微服务2:货币兑换样本服务这也是一个maven项目pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apac......
  • JavaScript 将对象转换为数组
    JavaScript将对象转换为数组在JavaScript中,你可以使用不同的方法将对象转换为数组,具体取决于对象的结构和你希望在数组中得到什么样的数据。以下是一些常见的方法:Object.keys()方法:这种方法将对象的键转换为数组。constobj={a:1,b:2,c:3};constarr=Object......