首页 > 其他分享 >HashMap

HashMap

时间:2023-11-30 19:11:39浏览次数:32  
标签:map HashMap bucket 链表 键值 哈希

HashMap是一种非常重要的数据结构,它实现了Map接口,允许我们存储和检索键值对。HashMap使用哈希表作为其内部实现,通过哈希码来定位键值对。

HashMap的内部实现:

数据结构:HashMap内部使用一个数组实现,每个数组元素称为一个bucket。在默认情况下,HashMap的bucket大小为16。每个bucket可以包含一个链表,链表中的每个节点都包含一个键值对。当存储一个键值对时,HashMap会根据键的哈希码计算出  对应的bucket索引,然后将键值对存储在该bucket的链表中。

哈希冲突:由于哈希表的特性,不同的键可能会计算出相同的bucket索引,从而导致哈希冲突。HashMap使用链表来解决哈希冲突。当发生哈希冲突时,新的键值对会被添加到与该bucket对应的链表的末尾。如果链表长度超过一定阈值(默认为8),链表会转化为红黑树,从而提高查询效率。

动态扩容:随着键值对的不断增加,HashMap需要动态扩容以容纳更多的数据。扩容会导致HashMap重新计算所有键的哈希码,并将键值对重新存储到新的bucket中。这个过程是比较耗时的,因此当HashMap达到一定的容量时,最好提前进行扩容。

代码实现:

要创建HashMap对象,我们需要使用HashMap类,并传入一个初始化大小参数来指定bucket的数量。

Map<String, Integer> map = new HashMap<>(16);

添加键值对:

map.put("apple", 1);  
map.put("banana", 2);  
map.put("orange", 3);

获取值:

int value = map.get("apple"); // value = 1

遍历Map:

for (Map.Entry<String, Integer> entry : map.entrySet()) {  
    System.out.println(entry.getKey() + " : " + entry.getValue());  
}

还可以使用keySet()方法来遍历所有的键,或者使用values()方法来遍历所有的值。

for (String key : map.keySet()) {  
    System.out.println(key + " : " + map.get(key));  
}

HashMap允许使用null作为键和值。但是需要注意的是,如果使用null作为键,那么在计算哈希码时会直接使用key的hashCode()方法,而不是通过将key与一个固定的对象进行比较来计算哈希码。因此,如果使用null作为键,需要特别注意避免哈希冲突的问题。另外,如果使用null作为值,那么在获取value时可能会得到null。

总结:

HashMap是Java中常用的数据结构之一,它基于哈希表实现,允许我们存储和检索键值对。HashMap内部使用一个数组实现,每个数组元素称为一个bucket。在默认情况下,HashMap的bucket大小为16。每个bucket可以包含一个链表,链表中的每个节点都包含一个键值对。当存储一个键值对时,HashMap会根据键的哈希码计算出对应的bucket索引,然后将键值对存储在该bucket的链表中。

 

标签:map,HashMap,bucket,链表,键值,哈希
From: https://www.cnblogs.com/kandh/p/17868055.html

相关文章

  • HashMap底层原理与扩容机制
    1.7数组+链表1.8数组+(链表|红黑树)JAVA1.8之后hashmap树化规则HashMap里面定义了一个常量TREEIFY_THRESHOLD=8,当链表长度超过树化阈值8时,先尝试调用resize()方法进行扩容来减少链表长度,如果数组容量已经>=64(MIN_TREEIFY_CAPACITY),才会进行树化,Node节点转为TreeNod......
  • HashMap
    HashMap是一种基于哈希表的数据结构,它通过使用散列算法来存储和检索数据,因此在查找速度上非常高效。在具体格式上,HashMap在JDK1.8之前采用的是数组+链表的格式,而在JDK1.8之后则采用了数组+链表+红黑树的结构。更具体地,HashMap是通过一个公式:index=hash&(table.length-1),来确定元素......
  • 面试官:为什么阿里不推荐使用 keySet() 遍历 HashMap?太叼钻了吧。。
    来源:https://juejin.cn/post/7295353579002396726Part1引言HashMap相信所有学Java的都一定不会感到陌生,作为一个非常重用且非常实用的Java提供的容器,它在我们的代码里面随处可见。因此遍历操作也是我们经常会使用到的。HashMap的遍历方式现如今有非常多种:使用迭代器(Iterator)......
  • HashMap中怎么处理桶冲突?
    一、关键词HashMap桶冲突二:知识点--两种方法:1).闭散列法: 若桶的key经过hash算法计算得到的映射仇重复,则把这个value放置在距离原本位置最近的下一个空的映射地址中,需要保持负载因子(=已存储个数/空间大小)大于一定的值(数组法)。2).开散列法: 经过hash计算得到的桶映射相同,则......
  • ConcurrentHashMap
    jdk1.8之后:syncronized+cashttps://blog.csdn.net/ThinkWon/article/details/102506447syncronized锁加到了链表上cas是没有hash冲突的时候,往数组插入元素时候用的。put元素的时候:首先对于每一个放入的值,首先利用spread方法对key的hashcode进行一次hash计算,由此来确定......
  • Map---WeakHashMap
    概述Hashtablebasedimplementationofthe<tt>Map</tt>interface,with<em>weakkeys</em>.Anentryina<tt>WeakHashMap</tt>willautomaticallyberemovedwhenitskeyisnolongerinordinaryuse.Moreprecisely,the......
  • HashMap HashTable ConcurrentMap 中key value是否可以为null
    HashMapHashTableConcurrentMap中keyvalue是否可以为null先说结论hashmap的key,value都可以为null;当key重复时,第二个key的value会覆盖第一个key的valueHashTable它的key和value都是不能为null的ConcurrentMap存储数据,它的key和value都是不能为null的1.HashMap//key为nullvalue......
  • java反序列化----CC6利用链学习笔记(HashMap和HashSet)
    目录java反序列化----CC6利用链学习笔记环境配置利用链java反序列化----CC6利用链学习笔记环境配置jdk8(无版本要求)pom.xml中写入<dependency><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId>......
  • 常见面试题-HashMap源码
    了解HashMap源码吗?参考文章:https://juejin.cn/post/6844903682664824845https://blog.51cto.com/u_15344989/3655921以下均为jdk1.8的HashMap讲解首先,HashMap的底层结构了解吗?底层结构为:数组+链表+红黑树什么时候链表会转换为红黑树呢?当一个位置上哈希冲突过多时,会导致......
  • HashMap集合的map.values()返回的Collection集合执行add方法报空指针问题
    一、方法1、privateCollection<String>setPermissionTenant(List<SysPermission>ls,inttenantId){//循环两次第一次设置ID和tenantId第二次设置pidMap<String,String>map=newHashMap<>();for(SysPermissionp:ls){......