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

Java 如何在LinkedHashMap中保存大量元素?,java,hashmap,integer,overflow,Java,Hashmap,Integer,Overflow,我有大量元素要保存在LinkedHashMap中。问题是我有大量的元素,也就是说,超过了Integer类的大小。由于LinkedHashMap类的size()方法返回一个int,我认为LinkedHashMap中的元素数不能超过int的可能性。是这样吗?如果是,我能做什么 我还应该提到,我实际上不知道问题到底发生在我的代码中的什么地方。这只是我的猜测,问题在于LinkedHashMap的size()方法。我只是得到了与相同的错误。我认为拥有一个包含如此多值的映射不是一个好主意,但是如果您真的想继

我有大量元素要保存在
LinkedHashMap
中。问题是我有大量的元素,也就是说,超过了
Integer
类的大小。由于
LinkedHashMap
类的
size()
方法返回一个
int
,我认为
LinkedHashMap
中的元素数不能超过
int
的可能性。是这样吗?如果是,我能做什么


我还应该提到,我实际上不知道问题到底发生在我的代码中的什么地方。这只是我的猜测,问题在于
LinkedHashMap
size()
方法。我只是得到了与相同的错误。

我认为拥有一个包含如此多值的映射不是一个好主意,但是如果您真的想继续,您可以重写
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;
    }
}
公共类MyLinkedHashMap扩展LinkedHashMap{
大整数神秘化;
@凌驾
公共V输入(K键,V值){
if(super.put(key,value)==null)//由于HashMap中的'size'变量在内部递增,因此最终仍会引发异常
添加(biginger.ONE);
}
@凌驾
公共V删除(对象密钥){
if(super.remove(key)!=null)
mySize.subtract(BigInteger.ONE);
}
@凌驾
公共整数大小(){
抛出新的UnsupportedOperationException();
}        
public BigInteger getSize(){
回归神秘化;
}
}
请注意,由于无法更改
size()
方法的返回类型,因此必须创建自己的size方法和变量来检索映射的大小

此外,您可能实际上需要重写
HashMap
本身,因为它的
put()
方法仍然会增加现有的
size
变量
int
值,并最终导致它超出Java整数的范围


最后,需要明确的是,这根本不是一个好主意,因为以这种方式重新调整现有数据结构的用途存在许多陷阱(例如,忘记覆盖修改/使用
大小
变量的其他方法、可能损害原始数据结构有效性的程序员错误,或最初从未打算处理如此大大小的其他实例变量/副作用等)。

“如果是,我能做什么?”。重新考虑您的设计。为什么要首先尝试存储一个值超过20亿的映射?不要忘记,
LinkedHashMap
中的每个条目都需要40字节加上实际元素的内存开销,所以这是一个至少80 GB的堆。您可能不需要
LinkedHashMap
。您可能需要database。你可能完全想要别的东西。你真的需要保留这么多数据的迭代顺序吗?亲爱的@Tunaki和其他朋友,非常感谢你的评论。在你的评论之后,我真的意识到我要制造多大的灾难!所以,我以正确工作的方式更改了我的程序。实际上,我想要o为小说的每个单词提取一些信息,小说中的字数绝对很大。因此,我以一种可以逐章处理文本的方式更改了代码,问题得到了解决。再次感谢您的帮助:)