如何在LinkedHashMap中保存大量元素?

时间:2016-01-03 18:28:14

标签: java hashmap integer overflow

我想要在LinkedHashMap中保存大量元素。问题是我确实有很多元素,即大于Integer类的大小。由于size()类的LinkedHashMap方法返回int,我认为LinkedHashMap中的元素数量不能超过int的可能性。是对的吗?如果是,我该怎么办?

我还应该提一下,我实际上并不知道我的代码中究竟出现了什么问题。我只是猜测问题在于size()的{​​{1}}方法。我只是得到与here相同的错误。

1 个答案:

答案 0 :(得分:1)

我不相信拥有拥有如此众多价值的地图是一个好主意,但如果你真的想继续使用它,你可以覆盖LinkedHashMap并使用BigInteger类来增加大小。

public class MyLinkedHashMap<K,V> extends LinkedHashMap<K,V> {
    BigInteger mySize;

    @Override
    public V put(K key, V Value) {
        if (super.put(key,value) == null) // this will still eventually throw an exception because of the 'size' variable incrementing internally in the HashMap
            mySize.add(BigInteger.ONE);
    }

    @Override
    public V remove(Object key) {
        if (super.remove(key) != null)
            mySize.subtract(BigInteger.ONE);
    }

    @Override
    public int size() {
        throw new UnsupportedOperationException();
    }        

    public BigInteger getSize() {
        return mySize;
    }
}

请注意,因为您无法更改size()方法的返回类型,所以您必须创建自己的大小方法和变量来检索地图的大小。

此外,您实际上可能需要覆盖HashMap本身,因为其put()方法仍会增加现有的size变量int值,并最终会使其超越Java Integer的范围。

最后,为了清楚起见,这是 NOT 一个好主意,因为尝试以这种方式重新利用现有数据结构存在许多陷阱(例如,忘记覆盖其他修改的方法/使用size变量,程序员错误可能会损害原始数据结构的有效性,或者其他实际变量/副作用,这些变量/副作用从未打算用于处理如此大的大小等。)