我正在尝试创建一个相当大的二维数组,并且我不断收到错误“java.lang.OutOfMemoryError:Java堆空间”。我已经尝试了-Xmx命令,但我仍然可以使用它。
我可以使用2D阵列吗?或者一种增加堆大小的方法。
答案 0 :(得分:4)
如果不是矩阵的所有元素都被占用(或者甚至共享一个非常常见的默认值),你可以使用sparse matrix。
执行此操作的最简单方法之一是使用HashMap:
Map<Point, Integer> matrix = new HashMap<Point, Integer>();
matrix.put(new Point(5, 2), 7);
Integer fiveTwo = matrix.get(new Point(5, 2));
您可以迭代所有索引,如下所示:
for ( int i = 0; i < ROW_COUNT; i++ ) {
for ( int j = 0; j < COL_COUNT; j++ ) {
Integer val = matrix.get(new Point(i, j));
//val is null here if not stored in the matrix. Replace with a different
//default as desired. eg:
//if ( val == null ) val = 0;
process(val);
}
}
也很容易迭代被占用的索引:
for ( Entry<Point, Integer> entry : matrix ) {
process(entry.getValue());
}
虽然这可能会返回一些已明确设置为默认值的单元格。使用此实现更困难的是仅按特定顺序迭代占用的索引。
这是上面链接的维基百科文章中描述的“密钥字典”实现的一个例子。
答案 1 :(得分:1)
考虑使用Flyweight pattern来降低对象的分配成本。正如Jon Skeet( Tips hat )所做的那样,它实际上取决于数组的大小,以及它中的内容。 Flyweight可以为你买很多东西,但只有这么多。