解决方案 »
- 请问实际项目中,于/src同级的/data目录路径如何读取?
- List排序
- 请教大家一道程序设计概念的SCJP题目 谢谢啦
- String 类里的toLowerCase()方法是啥意思?
- JDBC数据库的连接
- 請問我這樣定義數組錯了嗎﹖
- 请大家帮忙!!!
- 在jsp中向oracle插入一行数据
- 急!50分!我现在想要在VECTOR中直接存储结果集???但不想使用"在VECTOR中存储一个
- 高手请进,有人会么?我问一遍了,这个问题竟然没人回答!!!!!!!!!!!!!!!!!!
- 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>这可能是在代码整理时出现的错误,又或者它根本就是垃圾代码,至少我没看出这么写有任何必要性...