Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态2D数组能否实现Java.Collection.size()方法?_Java_Collections_Int_Type Conversion_Long Integer - Fatal编程技术网

动态2D数组能否实现Java.Collection.size()方法?

动态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

好的,我正在用Java制作一个动态2D数组,它实现Java.util.Collection接口。我让我的阵列实现它,因为我希望它具有与普通
集合相同的功能。但是,我无法实现
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()