hashmap的最大容量是多少,在多少的时候会导致查询响应过慢

作者&投稿:尤衬 (若有异议请与网页底部的电邮联系)
java HashMap 最多放多少个key 不影响查询效率~

查询效率和有多少个key没关系。

而且查询效率这个词是相对的,不是绝对意义上的。
理论上来说,map保存的key越多,查询越慢(查询所消耗的时间越多,而且这是一定的)。但是同等数量的数据(比如100000条),map的查询速度要比数组要快。

这个问题可以跟踪一下HashMap的源码就知道了,根据输入的初始化容量(门槛?)的值(先了解HashMap中容量和负载因子的概念,其实这个和HashMap确定存储地址的算法有关),先判断是否大于最大容量,最大容量2的30次方,1<<30 =(1073741824),如果大于此数,初始化容量赋值为1<<30,如果小于此数,调用tableSizeFor方法 使用位运算将初始化容量修改为2的次方数,都是向大的方向运算,比如输入13,小于2的4次方,那面计算出来桶的初始容量就是16.
public HashMap(int initialCapacity) { this(initialCapacity, DEFAULT_LOAD_FACTOR); } /** * Constructs an empty HashMap with the specified initial * capacity and load factor. * * @param initialCapacity the initial capacity * @param loadFactor the load factor * @throws IllegalArgumentException if the initial capacity is negative * or the load factor is nonpositive */ public HashMap(int initialCapacity, float loadFactor) { if (initialCapacity MAXIMUM_CAPACITY) initialCapacity = MAXIMUM_CAPACITY; if (loadFactor <= 0 || Float.isNaN(loadFactor)) throw new IllegalArgumentException("Illegal load factor: " + loadFactor); this.loadFactor = loadFactor; this.threshold = tableSizeFor(initialCapacity); }/**
* Returns a power of two size for the given target capacity.
*/
static final int tableSizeFor(int cap) {
int n = cap - 1;
n |= n >>> 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16;
return (n = MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}

原则上,hashmap的插入和搜索,复杂度都是1,是非常快速的跟你的容量大小通常是没有直接关系的但是这是理想的情况。
这里说的理想,是在你所存储的对象的hashcode这个方法写的非常有效的情况下。根据hash的原理,存放一个对象是根据他的hashcode来计算的,如果没有哈希冲突,那么他的存储效率是最高,最完美的。
为什么哈希冲突会使得效率下降呢?
具体来分析,假设一个对象O1,他的hashcode算出来是1,另一个对象是O2,hashcode算起来也是1. 先放入O1对象,这时候速度很快,根据hashcode计算出来这个对象应该在哪个位置存放,然后直接放进去。但是到了放O2的时候,根据hashcode计算的地址存放,发现之前已经有O1了,那么显然是不能放的,因此就要采取些措施,比如,再计算一次,然后分配存放的地址(如果冲突,将继续,知道解决),一种最恶劣的情况下,很多很多的对象都存在hash冲突,那么重要就变得存储越来越慢。但是这个不是hashmap的责任,而是你的对象的hashcode方法没有定义好,使得冲突频繁
另外,哈希表为了避免这种冲突,会有一点优化。简单的说,原本可以放100个数据的空间,当放到80个的时候,根据经验,接下去冲突的可能性会更加高,就好比一个靶子上80%都是箭的时候你再射一箭出去,射中箭的可能性很大。因此就自动增加空间来减小冲突可能性。
80/100 = 0.8 这个0.8就是负载因子。
java中的hashmap的负载因子是0.75说了写理论。说这个的原因是想解释一下你的疑问“10000条的时候在搜索的时候很快,那么在多少条的时候可能导致效率下降呢”。这个答案是肯定的,就是存储的量跟存储效率没有直接的关系。
这页是hash表这个数据结构的优势所在
如果你觉得效率出现问题的时候,应该去关注一下你的存储对象的hashcode方法写的是否有问题
如果想更完美的解决效率问题,还可以手动指定hashmap的负载因子(用HashMap(int factor)这个构造方法),负载因子越低,冲突可能越小。但是牺牲的空间会相应增加

如果还是不能很好理解,可以先参看hash这个数据结构的特点,和JDK中HashMap的源代码,以及注释

学好java,数据结构是很重要的,理解原理的使用,跟生搬硬套的使用,不可同年而语
所以,去面试淘宝,腾讯,化为这种公司不会问你struts怎么用,只会问你struts怎么写。如同不会问你hashmap怎么用,而会问你hashmap的设计理念,和实现原理

希望对你有所帮助

很大吧,现在的NOSQL不就是这种原理吗,专门用来处理大数据的。


hashmap 中的初始容量 和加载因子和 最大条目数 是什么意思?
如果桶的容量是40 加载因子是0.75 那么你的桶最多能装40*0.75 = 30的水 如果你要装的水比30 多 那么就该用大一点的桶 而rehash就是负责增加桶的容量的方法

hashmap的最大容量是多少,在多少的时候会导致查询响应过慢
原则上,hashmap的插入和搜索,复杂度都是1,是非常快速的跟你的容量大小通常是没有直接关系的但是这是理想的情况。这里说的理想,是在你所存储的对象的hashcode这个方法写的非常有效的情况下。根据hash的原理,存放一个对象是根据他的hashcode来计算的,如果没有哈希冲突,那么他的存储效率是最高,最完...

jdk1.8的hashmap真的是大于8就转换成红黑树,小于6就变成链表吗_百度知 ...
写这篇文章,是因为最近研究hashmap源码的时候,会结合网上的一些博客来促进理解。而关于红黑树和链表相互转换这一块,大部分的文章都会这样描述:hashmap中定义了两个常量:当链表元素个数大于8的时候,就会转换为红黑树;当红黑树元素个数小于6的时候,就会转换回链表。笔者通过仔细观察,发现这种说法并...

HashMap底层实现和原理(源码解析)
HashMap是Java程序员使用最频繁的的用于键值对(keyvalue)数据处理的容器,在JDK1.7(JavaDevelopmetKit)时HashMap采取的是数组+链表的形式存储数据,JDK1.8对HashMap进行了存储结构上的优化,引入了红黑树数据结构,极大的增强了HashMap的存取性能!为什么会引入红黑树呢?因为HashMap存在一个问题,即使负载因子和Hash算法设计的...

hashmap的扩容机制
HashMap 容量扩展的特性:加载因子越大,空间利用率越高,扩容前需要填充的元素越多,put 操作越快,但链表容易过长,hash 碰撞概率大,get 操作慢。加载因子越小,get 操作越快,链表越短,hash 碰撞概率低。但是,空间利用率低。put 元素太多会导致频繁扩容,影响性能。HashMap 扩容可以分为三种情况...

如何取得map里key得最大值
一般在map里取key的最大值是先排序,之后取出最大的一个即可。import java.util.Arrays;import java.util.Collection;import java.util.HashMap;import java.util.Map;import java.util.Set;public class MaxMapDemo {public static void main(String[] args) {Map<Integer, Integer> map = new ...

为什么HashMap是线程不安全的
onlyIfAbsent||oldValue==null)e.value=value;afterNodeAccess(e);returnoldValue;}}++modCount;\/\/步骤⑦:超过最大容量就扩容if(++size>threshold)resize();afterNodeInsertion(evict);returnnull;}问题发生在步骤②这里:if((p=tab[i=(n-1)&hash])==null)tab[i]=newNode(hash,key,value,null...

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

...ArrayList 初始化容量大小为 10?HashMap 的初始化容量为 16?_百度...
而关于HashMap计算Key值坐标的哈希算法,其效果依赖于数组的大小,确保容量为2的n次方能实现更高效的位操作,减少哈希碰撞。通常,选择16作为默认值,不仅减少哈希碰撞,也提升了效率,这是HashMap采用2的n次方,且默认值为16的原因。而ArrayList的初始化容量为何设定为10?答案其实颇为“直觉”,10是一...

ArrayList和HashMap的默认大小是多少?
详情请查看视频回答

陕县14782038385: hashMap默认起始容量是16 为什么. -
锺毓藿香: 为后来者解惑! 先抛出俩个问题: 1.为什么hashmap的容量约定是the power of 2 size呢 2.基于问题1的前提下,为什么不是32,或者8呢 回答:hashmap是基于数组的,源码: transient Node<K,V>[] table; table俗称hash桶(hash bin),将一个...

陕县14782038385: ArrayList、HashSet、HashMap异同 -
锺毓藿香: ArrayList类 ArrayList实现了可变大小的数组.它允许所有元素,包括null.ArrayList没有同步. size,isEmpty,get,set方法运行时间为常数.但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间.其他的方法运行时间为线性. 每个...

陕县14782038385: HashMap在Android和Java中的不同实现 -
锺毓藿香: 1.具体代码比较如下:<!-- Android -->@Override public int hashCode() { int hash = hashCode; if (hash == 0) { if (count == 0) { return 0;...

陕县14782038385: java中hashset和hashmap 有什么特点. -
锺毓藿香: HashSet:HashSet实现了Set接口,它不允许集合中有重复的值.当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能比较对象的值是否相等,以确保set中没有储...

陕县14782038385: 如何存储的HashMap在Android -
锺毓藿香: HashMap在android是可以直接使用的,因为本身用的就是java这个开发语言

陕县14782038385: HashMap和HashSet的区别 -
锺毓藿香: 什么是HashSetHashSet实现了Set接口,它不允许集合中有重复的值,当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能比较对象的值是否相等,以确保set中...

陕县14782038385: Map接口,HashMap和HashTable的相同点和不同点分别是什么? -
锺毓藿香: Hashtable和HashMap的区别:1.Hashtable是Dictionary的子类,HashMap是Map接口的一个实现类;2.Hashtable中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的.即是说,在多线程应用程序中,不用专门的操作就安全地可以...

陕县14782038385: hashmap 注意table初始大小并不是构造函数中的initialcapacity 为什么这样设计 -
锺毓藿香: HashMap有以下4个构造函数(JDK6): HashMap() 构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap. HashMap(int initialCapacity) 构造一个带指定初始容量和默认加载因子 (0.75) 的空 HashMap. HashMap(int initialCapacity, float loadFactor) 构造一个带指定初始容量和加载因子的空 HashMap. HashMap(Map<? extends K,? extends V> m) 构造一个映射关系与指定 Map 相同的新 HashMap. 有两个传入参数的并不是表示key,value的意思啊

陕县14782038385: 如何获取 java hashmap占用内存空间大小 -
锺毓藿香: java没有sizeofo,, 我参考 http://topic.csdn.net/t/20060224/20/4575988.html写了一个 public static void main(String[] args){// 创建1000个HashMapHashMap strA[] = new HashMap[1000];long start = 0;long end = 0;// 先垃圾回收System.gc...

陕县14782038385: linkedhashmap和hashmap的区别 -
锺毓藿香: 一般情况下,我们用的最多的是HashMap,在Map 中插入、删除和定位元素,HashMap 是最好的选择.但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好.如果需要输出的顺序和输入的相同,那么用LinkedHashMap 可以实现,...

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