本帖最后由 qunhao 于 2013-01-11 19:17:43 编辑

解决方案 »

  1.   

    Map<key,value>,size()说明map中存在size()个不同的key
      

  2.   

    还有,Map<String ,Object> map = new HashMap<String,Object>()就不会出现你说的溢出的问题了
      

  3.   

    我觉得你不能这么看问题,这样的话,api就漏洞百出了,没人会搞那么多键值放一起的。同样的道理很多方法都返回int,难道你都要去追究它如果超过了这个类型的范围怎么办呢。你说是吧
      

  4.   

    看看源代码里的这段话吧:
    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最大,将不再扩容了。
      

  5.   

    static final int MAXIMUM_CAPACITY = 1 << 30;
    即 MAXIMUM_CAPACITY = 1073741824
    也就是说,当存的数量到达1073741824后,就不扩容了,所以不会出现你说的超范围的存储
      

  6.   


    不是这样的,HashMap的capacity和size是不同概念的。capacity的是桶的数量,而size是映射关系数量,两者并不是同一个概念。
    而且照你的理解,当达到1073741824后,再次put操作,会下标越界了,其实并不会。
      

  7.   


    嘿嘿,我就是想知道超过这个类型最大数值的结果会是怎么样,我好奇点就是在这里。
    我个人认为如果超过了,就会返回负数,那么这种极限情况下调用size()方法返回的数量就不是正确的。我希望有人推翻我这个观点,给我有用的信息,谢谢。
      

  8.   

    那你找台好的电脑 看能跑出来不 实践出真知,我觉得java的开发工作者,应该考虑过这个问,我是没深究过。
      

  9.   

    你错了,你好好看看源代码吧
    调用put方法后,会调用addEntry
    而在addEntry里会调用resize判断容量
    而resize里容量超出就会直接返回了,所以不会再添加
    怎么会和size没关系???
      

  10.   


    实践出真知,确实,可惜身边没有好点的机子,跑到千万级别就内存溢出了,研究进行不下去,这不才上csdn找大家一起研究下。
      

  11.   


    哥,你前面把容量和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);
        }
      

  12.   

    我靠,看得太快,没注意到size后面的++
    如果是这样的话,size确实是一直在增加,但是不会出现你说的变负数情况吧
    因为size++如果超出了int的表数范围,就报错了,程序退出,不可能变负数啊
      

  13.   

    to 14楼
    int超过范围怎么会报错呢,你运行下面的代码看看。 int size = Integer.MAX_VALUE;
    System.out.println(size);
    size++;
    System.out.println(size);
      

  14.   

    是我想当然了,确实会变负数
    不过再加的话,size又开始变大了,所以理论上可以无限制的加下去
    这么说size()确实有点不靠谱
      

  15.   

    就目前来说,不会出现这种情况,所有数组的下标是int,ArrayList中也存储的是一个数组,很多都是基于这样的假设空循环Integer.MAX_VALUE次LZ知道要耗时多久吗?
      

  16.   

    正常put肯定会走到addEntry(hash, key, value, i);
        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,就变负数了呗
      

  17.   

    为啥HashMap还要显示的实现Map接口?
    大神能不能解释一下这个,我想了半天也没想出来一个可以说明自己的理由
      

  18.   

    size变复数,是不是以为这size()方法的返回值不在准确了那?
      

  19.   

    能否说明HashMap保存的关系映射数量是有限制的呢?
    化无限为有限
      

  20.   


    extends AbstractMap<K,V> implements Map<K,V>这可能是在代码整理时出现的错误,又或者它根本就是垃圾代码,至少我没看出这么写有任何必要性...
      

  21.   

    等哪天科技发达了,java里的int估计要变long了