hashmap的扩容机制面试题

作者&投稿:运曲 (若有异议请与网页底部的电邮联系)

HashMap的底层数据结构以及主要参数
  1.底层由链表+数组实现   2.可以存储null键和null值   3.线性不安全   4.初始容量为16,扩容每次都是2的n次幂(保证位运算)  5.加载因子为0.75,当Map中元素总数超过Entry数组的0.75,触发扩容操作.  6.并发情况下,HashMap进行put操作会引起...

HashMap实现原理
以下是和扩容相关的一些概念和解释:Ps: 扩容要重新计算下标 , 扩容要重新计算下标 , 扩容要重新计算下标 ,因为下标的计算和数组长度有关,长度改变,下标也应当重新计算。在1.8及其以上的jdk版本中,HashMap又引入了红黑树。红黑树的引入被用于替换链表,上文说到,如果冲突过多,会导致链表过长,...

Java HashMap扩容的时候,为什么要把Entry链表反转
我觉得应该是效率问题,如何不做反转在重新计算hash值后将要获得当前链表的最后一个元素,然后对最后一个元素的next属性添加一个节点信息,但是如果反转的话就不用了。例子:void transfer(Entry[] newTable, boolean rehash) { int newCapacity = newTable.length; for (Entry<K,V> e : table...

HashMap为什么不安全?
0 : hash(e.key); } int i = indexFor(e.hash, newCapacity); e.next = newTable[i]; newTable[i] = e; e = next; } }}复制代码这段代码是HashMap的扩容操作,重新定位每个桶的下标,并采用头插法将元素迁移到新数组中。头插法会将链表的顺序翻转,这也是形成...

为什么HashMap是线程不安全的
不过,JDK8时已经修复了这个问题,扩容时会保持链表原来的顺序,参照HashMap扩容机制的这一篇。02、多线程下put会导致元素丢失正常情况下,当发生哈希冲突时,HashMap是这样的:但多线程同时执行put操作时,如果计算出来的索引位置是相同的,那会造成前一个key被后一个key覆盖,从而导致元素的丢失。put的...

安卓hashmap占用内存过大,
安卓hashmap占用内存过大解决方法如下:1、可以通过在创建HashMap时指定初始容量和负载因子,来控制HashMap的大小和扩容时机,从而减少内存的占用。2、可以考虑使用其他数据结构,如数组或者List等,来代替HashMap。

HashMap以及其子类关键性总结
扩容(resize) 就是重新计算容量,数组无法自动扩容 方法就是使用一个新数组代替已有的容量小的数组 2倍扩容 HashMap是利用 拉链法 处理hashcode的碰撞问题 在调用HashMap的put或者get方法时,都会调用Hashcode方法区查找相关的key 当有冲突时在调用equals方法 HashMap基于hashing原理 通过put和get方法存取...

HashMap类简介
数据结构 定义参数 基本特性 HashMap 中允许 null 值和 null 键。 null 键对应着哈希值0,即数组的下表0。HashMap 是不保证对象的放入顺序的。基本操作 get 和`put的时间性能基本为 (如果不考虑哈希冲突的情况下)。读 判断hash\/key,key值是否相等,hash值是否相等 判断是否是TreeNode...

Android面试 HashMap算法
HashCode相同,通过equals比较内容获取值对象。超过阙值会进行扩容操作,概括的讲就是扩容后的数组大小是原数组的2倍,将原来的元素重新hashing放入到新的散列表中去。相同点:都是存储key-value键值对的 不同点:loadFactor表示HashMap的拥挤程度,影响hash操作到同一个数组位置的概率。默认loadFactor等于...

HashMap为什么变成从尾部插入?
1.7插入元素到单链表中采用头插入法,1.8采用的是尾插入法。 HashMap在jdk1.7中采用头插入法,在扩容时会改变链表中元素原本的顺序,以至于在并发场景下导致链表成环的问题。而在jdk1.8中采用尾插入法,在扩容时会保持链表元素原本的顺序,就不会出现 链表成环 的问题了。参考: HashMap之元素...

强饺17521931681问: 为什么面试要问hashmap 的原理 -
泗洪县血平回答: 我用笔记本给最佳答案排了一下版,给大家贴出来.虽说排版确实很乱,但是答案不得不给一个大赞.HashMap的工作原理 HashMap,都知道哪里要用HashMap,知道Hashtable和HashMap之间的区别,那么为何这道面试题如此特殊呢?是因...

强饺17521931681问: HashMap<String, Image> cacheMap = new HashMap<String, Image>(99);后面的99是什么意思 -
泗洪县血平回答: 初始化的HashMap 的大小,但不是size 的大小,而是申请的内存空间,建议了解下haspMap 的扩容机制

强饺17521931681问: Java集合框架的操作的方法有哪些?怎么用? -
泗洪县血平回答: 浅谈JAVA集合框架 Java提供了数种持有对象的方式,包括语言内置的Array,还有就是utilities中提供的容器类(container classes),又称群集类(collection classes).集合在java中非常重要,在讨论之前,先来看几个面试中的经典问题. 1 ...

强饺17521931681问: JAVA中的HashMap底层白话文解释? -
泗洪县血平回答: 如果只是初学者,只需要了解hashMap是一种工具类,以键值对存放数据,非线程安全,用散列桶实现,查询遍历快.如果你想深入的学就还是自己读代码,网上大神的讲解很多啊;看完之后再看懂然后再去思考,然后这才能是你的东西....

强饺17521931681问: 面试问题:请用白话说明一下Java中HashMap和TreeMap的区别? -
泗洪县血平回答: HashMap-- 底层是哈希表数据结构,可以存入null键null值,线程不同步的 TreeMap -- 底层是二叉树数据结构,线程不同步,可以给map集合中的键进行排序 HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的).HashMap效率高

强饺17521931681问: hashmap的put方法 -
泗洪县血平回答: put public V put(K key, V value) 在此映射中关联指定值与指定键.如果此映射以前包含了一个该键的映射关系,则旧值被替换. 指定者: 接口 Map<K,V> 中的 put 覆盖: 类 AbstractMap<K,V> 中的 put 参数: key - 指定值将要关联的键. value - 指定键将要关联的值. 返回: 与指定键相关联的旧值,如果键没有任何映射关系,则返回 null.返回 null 还可能表示该 HashMap 以前将 null 与指定键关联.

强饺17521931681问: Java HashMap扩容的时候,为什么要把Entry链表反转 -
泗洪县血平回答: 需要将链表重新整理到新表当中,因为newCap是oldCap的两倍所以原节点的索引 值要么和原来一样,要么就是原(索引+oldCap)和JDK 1.7中实现不同这里不存在rehash,直接使用原hash 值JDK 1.7中resize过程是在链表头插入,这里是在链表尾插入

强饺17521931681问: 写一个HashMap的子类,有map.put("ABC","text"),map.get("aBc"),让求输出text, 考试题, -
泗洪县血平回答: 就是让你覆盖 put 和 get 方法 public class C<K,V> extends HashMap<K,V>{ private static final long serialVersionUID = 1L; @Override public V put(K key, V value) { if(key instanceof String){key = extracted(key.toString()); } return super.put(key, ...

强饺17521931681问: Java中HashMap和TreeMap的区别深入理解 -
泗洪县血平回答: HashMap:数组方式存储key/value,线程非安全,允许null作为key和value,key不可以重复,value允许重复,不保证元素迭代顺序是按照插入时的顺序,key的hash值是先计算key的hashcode值,然后再进行计算,每次容量扩容会重新计算所以key...

强饺17521931681问: Java常用集合包适用场景有哪些呢?
泗洪县血平回答: 1. ArrayList 基于数组方式实现,无容量的限制. 在执行插入元素时可能要扩容,在删除元素时并不会减少数组的容量. 如果希望相应的缩小数组容量,可以调用...


本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网