动态2D数组能否实现Java.Collection.size()方法?
好的,我正在用Java制作一个动态2D数组,它实现Java.util.Collection接口。我让我的阵列实现它,因为我希望它具有与普通动态2D数组能否实现Java.Collection.size()方法?,java,collections,int,type-conversion,long-integer,Java,Collections,Int,Type Conversion,Long Integer,好的,我正在用Java制作一个动态2D数组,它实现Java.util.Collection接口。我让我的阵列实现它,因为我希望它具有与普通集合相同的功能。但是,我无法实现size()方法,因为在接口中它返回一个整数,2D矩阵可能会溢出整数类型 下面是我试图制作的课堂片段: public abstract class AbstractMatrix<E> implements Collection<E>{ @Override public long siz
集合相同的功能。但是,我无法实现size()
方法,因为在接口中它返回一个整数,2D矩阵可能会溢出整数类型
下面是我试图制作的课堂片段:
public abstract class AbstractMatrix<E> implements Collection<E>{
@Override
public long size() {
return columns * rows;
}
}
公共抽象类AbstractMatrix实现集合{
@凌驾
公共长码(){
返回列*行;
}
}
现在,这将不起作用,因为“返回类型与Collection.size()
不兼容”,如果我将类型更改为int,columns*行可能会溢出
我知道我不能像这样重写size方法,但是有什么方法可以确保该方法在仍然实现集合
接口的情况下返回正确的大小
是的,我知道这是不切实际的,可能永远不会成为问题,但我想知道是否有一个好的解决方案。我不这么认为,您需要使用某种解决方法。您可以扩展您的大小以返回负数,并将其解释为无符号32位整数,这将使您的最大值为40亿并进行更改
问问你自己,你真的需要支持这么多的对象吗?请记住,40亿和32位整数将占用16GB的RAM。使用64位java,设置为all null的40亿长的对象数组将占用32GB,因为64位java上的引用是64位的。这甚至没有考虑用于实际实例化那么多类的内存,这些类很可能要高得多 如果您确实关心可能溢出的足够大的矩阵,可以通过检查结果大小(初始化或调整大小)是否仍在整数范围内并抛出(运行时)来确保不会发生溢出例外情况如果是这种情况尽管您对大小
的实施存在疑问,但集合#大小
的合同定义如下:
返回此集合中的元素数。如果此集合包含多个Integer.MAX_值元素,则返回Integer.MAX_值
因此,您可以将大小计算为long
,如果大于Integer.MAX\u值,则返回Integer.MAX\u值
或者,您可以模仿它在LinkedList#add
中的实现方式,例如,其中,size
简单地递增,并允许溢出。假设您愿意使用8GB数组(二维数组的最小大小,该数组将使int
的总大小溢出),并且假设您愿意对该集合执行任何有趣的操作,例如对其进行迭代(迭代至少需要几分钟的时间)
我认为,典型的方法是返回到实现Iterable
而不是Collection
,或者只返回Integer.MAX_值
,如Javadoc所指定:
返回此集合中的元素数。如果此集合包含多个Integer.MAX_值元素,则返回Integer.MAX_值
在大于45k行x 45k列(假设为正方形)的矩阵中出现溢出?您计划拥有超过2147483647个元素?您可以使用大小即列*行做什么?它可以让您对矩阵做什么?我想您应该问的问题是“我的用例真的需要这样定义大小吗?”“我对大小的定义一般来说有意义吗”?相关:有趣的是,LinkedList#add让大小溢出而无需检查。这并不奇怪;在您开始遇到此类问题之前,您的内存通常会耗尽很长时间。(同样,很难想象LinkedList
s的使用首先会扩展到那么多元素。)是的,我意识到让2D数组像这样溢出是不切实际的,但我只是想看看是否有解决方案。您是否考虑过查看ArrayList的代码。为什么返回类型需要很长?mugafuga:ArrayList是集合,只有int size()
,没有long size()
。