解决方案 »
- split "."
- 关于string.getBytes()的问题
- java中collections的作用是什么?
- System.out cannot be resolved???
- TextField不能编辑的问题
- thinking in java 的例子。。在线等
- 在jb里面怎样设置工程才能在编译工程的时候能够把所有的类生成jar包
- split(".")为什么不能分割字符串应该怎么做
- 有个小问题,请教有类似经验的人士?谁会是我的等待?走过错过别漏过,都请进请坐请赐教!!!
- 求高手帮忙改一个“Java数据操作层”的类型的源码。
- JWindow中JComboBox下拉框无法显示,有没有人了解?
- Android X86(安装在上网本)上面安装应用程序,显示器屏幕旋转90度
If current capacity is MAXIMUM_CAPACITY, this method does not
resize the map, but sets threshold to Integer.MAX_VALUE.
This has the effect of preventing future calls.可以看出,如果到达了integer最大,将不再扩容了。
即 MAXIMUM_CAPACITY = 1073741824
也就是说,当存的数量到达1073741824后,就不扩容了,所以不会出现你说的超范围的存储
不是这样的,HashMap的capacity和size是不同概念的。capacity的是桶的数量,而size是映射关系数量,两者并不是同一个概念。
而且照你的理解,当达到1073741824后,再次put操作,会下标越界了,其实并不会。
嘿嘿,我就是想知道超过这个类型最大数值的结果会是怎么样,我好奇点就是在这里。
我个人认为如果超过了,就会返回负数,那么这种极限情况下调用size()方法返回的数量就不是正确的。我希望有人推翻我这个观点,给我有用的信息,谢谢。
调用put方法后,会调用addEntry
而在addEntry里会调用resize判断容量
而resize里容量超出就会直接返回了,所以不会再添加
怎么会和size没关系???
实践出真知,确实,可惜身边没有好点的机子,跑到千万级别就内存溢出了,研究进行不下去,这不才上csdn找大家一起研究下。
哥,你前面把容量和size的概率都搞错了,这次还来。
你仔细看看下面的代码,在调用resize()方法之前,size已经自增1了,resize方法的作用是用来扩展容量,里面你说的直接返回是因为判断如果容量已达上限,不能再扩展。不能扩展容量跟size是没有关系的。你自己好好看看源码吧。 void addEntry(int hash, K key, V value, int bucketIndex) {
Entry<K,V> e = table[bucketIndex];
table[bucketIndex] = new Entry<K,V>(hash, key, value, e);
if (size++ >= threshold)
resize(2 * table.length);
}
如果是这样的话,size确实是一直在增加,但是不会出现你说的变负数情况吧
因为size++如果超出了int的表数范围,就报错了,程序退出,不可能变负数啊
int超过范围怎么会报错呢,你运行下面的代码看看。 int size = Integer.MAX_VALUE;
System.out.println(size);
size++;
System.out.println(size);
不过再加的话,size又开始变大了,所以理论上可以无限制的加下去
这么说size()确实有点不靠谱
void addEntry(int hash, K key, V value, int bucketIndex) {
Entry<K,V> e = table[bucketIndex];
table[bucketIndex] = new Entry<K,V>(hash, key, value, e);
if (size++ >= threshold)
resize(2 * table.length);
}
size++
真的哪天谁把它用超过了Integer.MAX_VALUE,就变负数了呗
大神能不能解释一下这个,我想了半天也没想出来一个可以说明自己的理由
化无限为有限
extends AbstractMap<K,V> implements Map<K,V>这可能是在代码整理时出现的错误,又或者它根本就是垃圾代码,至少我没看出这么写有任何必要性...