5

好的,所以我在 Java 中创建了一个实现 java.util.Collection 接口的动态二维数组。我让我的数组实现了它,因为我希望它具有与普通Collection. 但是,我无法实现该size()方法,因为在接口中它返回一个整数,而二维矩阵可能会溢出整数类型。

这是我正在尝试制作的课程片段:

public abstract class AbstractMatrix<E> implements Collection<E>{
     @Override
     public long size() {
         return columns * rows;
     }
}

现在,这将不起作用,因为“返回类型与Collection<E>.size()”不兼容,如果我将类型更改为 int,列 * 行可能会溢出。

我知道我不能像这样覆盖 size 方法,但是有什么方法可以确保该方法在实现Collection接口的同时返回正确的大小?

是的,我知道这是不切实际的,可能永远不会成为问题,但我很想知道是否有一个好的解决方案。

4

4 回答 4

2

尽管您的实现是有问题的,但在javadoc中定义size了合同:Collection#size

返回此集合中的元素数。如果此集合包含多个 Integer.MAX_VALUE 元素,则返回 Integer.MAX_VALUE。

因此,您可以将大小计算为 a longInteger.MAX_VALUE如果大于 则返回Integer.MAX_VALUE

或者,您可以模仿它的实现方式,LinkedList#add例如,size简单地递增并允许溢出。

于 2012-06-18T16:59:20.267 回答
2

假设你愿意拥有一个 8GB 的​​数组——一个二维数组的最小大小,int它的总大小会溢出一个至少仅用于迭代分钟)...

我相信典型的方法是要么退回到实施Iterable而不是Collection,或者只是返回Integer.MAX_VALUE,如Javadoc所指定的:

返回此集合中的元素数。如果此集合包含多个 Integer.MAX_VALUE 元素,则返回 Integer.MAX_VALUE。

于 2012-06-18T16:59:20.627 回答
0

如果您真的担心可能溢出的足够大的矩阵,您可以通过检查结果大小(初始化或调整大小)是否仍在整数范围内来确保不会发生这种情况,如果会抛出(运行时)异常是这样

于 2012-06-18T16:59:16.150 回答
-1

我不这么认为,您将需要使用某种解决方法。您可以扩展您的大小以返回负数并将它们解释为无符号的 32 位整数,这将为您提供最多 40 亿和更改。

不过问问自己,你真的需要能够支持这么多对象吗?请记住,40 亿和更改 32 位整数将占用 16GB 的 RAM。使用 64 位 java,一个 40 亿长的Objectset to all null 数组将占用 32GB,因为 64 位 java 上的引用是 64 位的。这甚至没有考虑用于实际实例化那么多类的内存,这很可能会高得多。

于 2012-06-18T16:59:03.123 回答