首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏AI技术体系搭建过程

    面试刷题9:HashTable HashMap TreeMap的区别?

    我是李福春,我在准备面试,今天我们来回答: HashTable,HashMap,TreeMap的区别? 共同点:都是Map的子类或者间接子类,以键值对的形式存储和操作数据。 区别如下表: 项目 线程安全 是否支持null键值 使用场景 HashTable 是 不支持 java早期hash实现,同步开销大不推荐被使用 HashMap 否 支持 大部分场景的首选put,get hashMap的hash值的计算: static final int hash(Object kye) { int h; return (key == null) ? 树化的目的是:为了安全,减少hash冲突; 小结 先从线程安全,是否允许null键值,使用场景方面说出来HashTable,HashMap,TreeMap的区别。 然后扩展到了Map的类层级,分析了面试官喜欢问的hashmap的数据结构,hash值计算,扩容,树化问题。

    17500编辑于 2025-07-01
  • 来自专栏Kirito的技术分享

    应用JMH测试大型HashMap的性能

    现在一般Java世界里面的主流Benchmark就是应用的JMH。 Scala这边,我们所熟悉的Ktoso大佬包了一个sbt-jmh插件,使得我们可以方便地利用SBT来运行JMH测试。 0.0 0.0 932352.0 932352.0 5592576.0 5592545.4 9856.0 9391.3 1408.0 1316.6 12 36.611 9 0.0 0.0 932352.0 932352.0 5592576.0 5592545.4 9856.0 9391.3 1408.0 1316.6 12 36.611 9 *HashMap.* 10G也是慢,跑太久了,不乐意跑了,果断放弃。我们直接来看其他的实现。 这里还要说一下,因为内存有要求,所以我们需要同时打印一下HashMap的内存大小。 这样我们每次只需要新建HashMap即可了。

    1.7K30发布于 2019-11-05
  • 来自专栏Java

    HashMap应用场景、优点与缺点

    HashMap应用场景、优点与缺点 在许多Java应用程序中,HashMap是一种常见且实用的数据结构,它基于散列表(Hash Table)实现。 HashMap提供了快速的插入、查找和删除操作,并且可以存储键值对形式的数据。接下来,我们将通过一个具体业务场景来详细讲解HashMap应用场景、优点以及存在的一些缺点。 // 创建HashMap并添加键值对 HashMap<String, Integer> hashMap = new HashMap<>(); hashMap.put // 创建HashMap并添加不同类型的键值对 HashMap<String, Object> hashMap = new HashMap<>(); hashMap.put // 创建HashMap并添加键值对 HashMap<String, Integer> hashMap = new HashMap<>(); hashMap.put

    48800编辑于 2025-01-21
  • 来自专栏Redis原理与应用

    Redis应用9.简单应用汇总

    (String数据结构)6.实现一个简单的唯一ID生成器(incr命令)7.实现博客点赞次数计数器(incr命令 + decr命令)8.社交网站的网址点击追踪机制(长网址转短网址)(Hash数据结构)9. /短网址追踪案例public class ShortUrlDemo { private static final String[] X36_ARRAY = "0,1,2,3,4,5,6,7,8,9, shortUrlDemo.getShortUrlAccessCount(shortUrl); System.out.println("短网址被访问的次数为:" + accessCount); }}9. ; demo.publishBlog(id, blog); //更新一篇博客 Map<String, String> updatedBlog = new HashMap "); demo.publishBlog(id, blog); //更新一篇博客 Map<String, String> updatedBlog = new HashMap

    17900编辑于 2025-03-08
  • 来自专栏全栈程序员必看

    hashmap的扩容原理_HashMap

    本篇文章分别讲解JDK1.7和JDK1.8下的HashMap底层实现原理 文章目录 一、什么是HashMap? 二、为什么要使用HashMap? 三、HashMap扩容为什么总是2的次幂? 四、JDk1.7HashMap扩容死循环问题 五、JDK1.8的新结构—-红黑树 1.为什么非要使用红黑树呢? 2.什么是红黑树? 3.红黑树的特性 4.红黑树的应用 一、什么是HashMap? 那么就有一种新的容器叫HashMap,他里面既有数组结构,也有链表结构,所以可以弥补相互的缺点。而且HashMap主要用法是get()和put() 。 三、HashMap扩容为什么总是2的次幂? 先看根节点9,由于10 > 9,因此查看右孩子13;由于10 < 13,因此查看左孩子11;由于10 < 11,因此查看左孩子10,发现10正是要查找的节点;这种方式查找最大的次数等于二叉查找树的高度。 常用的调整方法有三种: 左旋转 右旋转 变色 4.红黑树的应用 1.TreeSet 2.TreeMap 3.HashMap(JDK8) 完!

    3.5K10编辑于 2022-11-08
  • 来自专栏快乐阿超

    HashMap

    HashMap是由数组和链表组合构成的数据结构。 大概如下,数组里面每个地方都存了Key-Value这样的实例,在Java1.7叫Entry,在Java1.8中叫Node。 以及(next)下个节点 java8之前采用头插法,原有的值顺推到链表中去,新来的值变成链表表头,是因为代码作者认为新来的值会被查找的可能性大一点,为了提升查找的效率设计的 java8之后改用尾插法,当hashmap 先创建一个长度为原有数组的两倍的空数组,再调用rehash遍历原有entry数组,把所有的entry重新hash到新数组 因为扩容的时候,Capacity会改变,所以不能直接复制 改用尾插法的原因: 因为hashmap 此时又触发了扩容机制的时候,可能会导致环形链表,此时如果对它取值会导致死循环 因此java8之后改成了尾插法,在扩容时会保持链表元素原本的顺序,就不会出现链表成环的问题了 而且改用了红黑树,降低了时间复杂度 hashmap 是线程不安全的,原因是put/get都没有加同步锁,多线程容易发生上一秒put的值,下一秒get就变了 hashmap初始化默认长度是16,因为1对4执行位运算就是16,位运算比算术计算的效率高了很多,

    61210编辑于 2022-08-16
  • 来自专栏JAVA

    HashMap

    只要哈希函数映射得比较均匀松散,一般应用是很难出现碰撞的。 "lo8u", "pqdi", "bbam", "hhc5", "pnem", "u955", "p4z7", "phr0", "suv8", "u4pu", "p63n", "jaua", "zth9" "lo8u", "pqdi", "bbam", "hhc5", "pnem", "u955", "p4z7", "phr0", "suv8", "u4pu", "p63n", "jaua", "zth9" "maxe", "wymp"}; arr1与arr2数据演示:size=16<=64,单链长度>8导致的扩容 arr1是8个字符串,arr1数据在size=16时,全部落到index=2处 arr2是9个字符串 size=64,index=18 u4pu size=64,index=18 p63n size=64,index=18 jaua size=64,index=50 zth9

    32800编辑于 2024-11-25
  • 来自专栏LeetCode

    hashMap

    https://www.cnblogs.com/skywang12345/category/455711.html 一、hashMap HashMap 的实现不是同步的,这意味着它不是线程安全的。 此外,HashMap中的映射不是有序的。 HashMap 的实例有两个参数影响其性能:“初始容量” 和 “加载因子”。容量 是哈希表中桶的数量,初始容量 只是哈希表在创建时的容量。 size是HashMap的大小,它是HashMap保存的键值对的数量。 threshold是HashMap的阈值,用于判断是否需要调整HashMap的容量。 threshold的值="容量*加载因子",当HashMap中存储数据的数量达到threshold时,就需要将HashMap的容量加倍。 loadFactor就是加载因子。 3.1.1 HashMap数据存储数组 transient Entry[] table; HashMap中的key-value都是存储在Entry数组中的。

    1.1K00发布于 2019-03-03
  • 来自专栏酒楼

    HashMap

    HashMap 关于hashmap的几点思考 1.hash函数是对key做处理,利用int 类型的hashCode()函数,获取32位hash 值,然后前32位与后32位做亦或获得。 key.hashCode()) ^ (h >>> 16);//扰动,这样前16位和后16位都会对hash值造成影响 } 2.获取数组坐标是用length-1做掩码,取hash 后几位 public class HashMap Objects.hashCode(key) ^ Objects.hashCode(value); } } /** * 新增红黑树节点 */ final TreeNode<K,V> putTreeVal(HashMap

    33000编辑于 2023-12-01
  • 来自专栏方法论

    基于HashMap的过期时间类的设计与应用

    代码实现: import lombok.Data; import java.util.HashMap; import java.util.Map; public class ExpireDataUtil { private static Map<String,ExpireData> map = new HashMap(); //添加一个键值对 public static void System.currentTimeMillis() / 1000; this.endTime = startTime + expireSeconds; } } } 实际应用

    1.4K10发布于 2020-04-14
  • HashMap

    HashMap的实现原理:JDK1.6、JDK1.7:HashMap采用位桶+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。 JDK1.8:HashMap采用位桶+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。 HashMap是基于哈希算法实现的,我们通过put(key,value)存储,get(key)来获取数据。 即HashMap的原理图是:1、HashMap的底层数据结构? 数组+单向链表+红黑树2、HashMap的主要参数都有哪些? 9HashMap为啥会线程不安全?

    39010编辑于 2024-04-17
  • 来自专栏Devops专栏

    9. Django 2.1.7 创建应用模板

    上一篇中讲诉了关于Django 2.1.7 视图的操作,本篇章开始研究模块这块内容。

    50820编辑于 2022-01-17
  • 来自专栏全栈程序员必看

    hashmap扩容过程保证可用_HashMap扩容

    前言 HashMap作为Java中使用最频繁的数据结构之一,它的技术原理与细节在面试中经常会被问到。笔者在面试美团时曾被面试官问到HashMap扩容机制的原理。这个问题倒不难,但是有些细节仍需注意。 JDK1.8对HashMap进行的较大的改动,其中对HashMap的扩容机制进行了优化。在JDK1.8前,在多线程的情况下,使用HashMap进行put操作会造成死循环。 这是因为多次执行put操作会引发HashMap的扩容机制,HashMap的扩容机制采用头插法的方式移动元素,这样会造成链表闭环,形成死循环。 注:本文所有代码均来自JDK1.8 正文 HashMap利用resize()方法实现扩容,与此同时resize()方法也承担着HashMap初始化工作。 这就是HashMap扩容机制中的高低位算法。 想要理解这个过程,首先需要明白HashMap中如何计算数组下标位。

    2K20编辑于 2022-11-08
  • 来自专栏C++核心准则原文翻译

    自学鸿蒙应用开发(9)- TimePicker组件

    本文介绍在鸿蒙应用中TimePicker组件的基本用法。 增加TimePicker组件 如下代码中46行~52行所示,在布局中增加TimePicker组件。 <?

    59020发布于 2021-01-13
  • 来自专栏desperate633

    Java的HashMap中的常用方法总结遍历HashMap打印HashMap根据HashMap的value进行排序

    HashMap在编程中是一个非常有用的工具,使用的频率很高,所以本文简单总结一下hashmap的常用方法 遍历HashMap 可以通过entryset取得iter,然后逐个遍历 Iterator it map.entrySet()) { System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue()); } 打印HashMap pairs.getKey() + " = " + pairs.getValue()); it.remove(); // avoids a ConcurrentModificationException } } 根据HashMap (base.get(a) >= base.get(b)) { return -1; } else { return 1; } // returning 0 would merge keys } } HashMap <String, Integer> countMap = new HashMap<String, Integer>(); //add a lot of entries countMap.put("a",

    2K10发布于 2018-08-22
  • 来自专栏程序员小航

    关于红黑树,在HashMap中是怎么应用的?

    前言 " 在阅读HashMap源码时,会发现在HashMap中使用了红黑树,所以需要先了解什么是红黑树,以及其原理。从而再进一步阅读HashMap中的链表到红黑树的转换,红黑树的增删节点等。 红黑树的概念 红黑树的性质 红黑树的操作 在HashMap中是怎么应用的? HashMap 1 什么是红黑树? 红黑树的概念? 情形:父节点染色为黑色,进行右旋,祖父节点变为右子节点,然后重新判断进行染色或旋转 2 HashMap 结构 static final class TreeNode<K,V> extends

    67730发布于 2020-11-23
  • 来自专栏全栈程序员必看

    hashmap动态扩容死循环_HashMap扩容

    HashMap扩容死循环问题源码分析问题(jdk1.7) 一、首先hashmap单线程正常扩容 遍历每个数组,依次遍历每个数组的链表,根据头插法由原来的1,2,3 变为了3,2,1 二、hashmap

    2K30编辑于 2022-11-08
  • 来自专栏springBoot3.0

    了解HashMap

    HashMap 简介 HashMap 主要用来存放键值对,它基于哈希表的 Map 接口实现,是常用的 Java 集合之一,是非线程安全的。 HashMap 可以存储 null 的 key 和 value,但 null 作为键只能有一个,null 作为值可以有多个 JDK1.8 之前 HashMap 由 数组+链表 组成的,数组是 HashMap HashMap 默认的初始化大小为 16。之后每次扩充,容量变为原来的 2 倍。并且, HashMap 总是使用 2 的幂作为哈希表的大小。 参考 JDK8 HashMap.java 658 行(issue#608)。 参考 HashMap 的 treeifyBin() 方法(issue#1087)。

    67920编辑于 2023-03-08
  • 来自专栏开源君

    HashMap详解

    HashMap一直是面试的重点。今天我们来了解了解它的源码吧! HashMap 简介 HashMap 主要用来存放键值对,它基于哈希表的 Map 接口实现,是常用的 Java 集合之一。 HashMap 底层数据结构 JDK 1.8 之前 HashMap 底层是数组 + 链表 结合在一起使用,也就是 链表散列。 数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的(”拉链法”解决冲突)。 JDK 1.8 之后 HashMap 底层是数组 + 红黑树 。 // 包含另一个“Map”的构造函数 public HashMap(Map<?

    63140编辑于 2023-08-25
  • 来自专栏故里学Java

    遍历HashMap

    HashMap遍历主要有四类方法: 迭代器方式遍历 For Each方式遍历 Lambda表达式遍历 Streams API遍历 其中迭代器、For Each、Streams API又有不同的实现(EntrySet class HashMapDemo{ public static void main(String[] args){ Map<Integer,String> map = new HashMap

    97720发布于 2020-11-25
领券