【发布时间】:2011-11-06 18:29:09
【问题描述】:
这两个数组在java中是否存在性能差异(可能与J2ME开发有关...):
String[][][] a = //for getting an entry by a[group][person][field]
{
{ // group A:
{"John", "Doe", "teacher", "New York"},
{"Donald", "Duck", "jinx", "Duckburg"},
// 10 or more further entries
},
{ // group B:
{"Barack", "Obama", "president", "Washington"},
// ...
}
};
String[][][] b = //for getting an entry by b[field][group][person]
{
{ // prenames:
{"John", "Donald", ...},
{"Barack", ...}
},
{ // surnames:
{"Doe", "Duck", ...},
{"Obama", ...}
},
{ // job:
{"teacher", "jinx", ...},
{"president", ...}
},
{ // city:
{"New York", "Duckburg", ...},
{"Washington", ...}
}
};
我猜第二个数组的性能更高,因为它包含的嵌套数组总数较少,而第一个数组每个人都有一个数组!将其转移到更大的阵列上...
感谢您的回答!
更新:
一个更好(现实)的例子是一个数组,比方说,1000 x/y 坐标:
int[][] coordsA =
{
{0, 0},
{2, 7},
{8, 2},
{4, 2},
{-3, 15},
{1, 32},
// ...
};
int[][] coordsB =
{
{0, 2, 8, 4, -3, 1, ...}, // x values
{0, 7, 2, 2, 15, 32, ...} // y values
}
【问题讨论】:
-
数组少了怎么办?您的变量声明类型定义了有多少。无论如何,您有什么理由不为此使用课程?这就是他们的目的。
-
多维数组并不意味着它的元素是嵌套的,你总是可以直接访问它的属性,例如
a[1][2][3]。因此,在这种情况下,性能是您的访问模式的函数... -
我会说更少的数组可能会为您节省一些
length字段和指针占用的内存,但我不确定它是否会产生很大的不同。不过,由于缓存,我同意@home 关于访问模式的看法。你可以看看this,虽然我不完全确定它如何应用于移动设备上的Java。 -
@flo:如果您真的想将数组用于您需要做的事情并希望在 J2ME 上获得最佳性能(正如您在问题中所写),那么 the 技巧J2ME 曾经包括展平数组(当然这意味着可能有空单元格)并自己执行“数组索引算术”,节省数组绑定检查(在您的情况下,只进行一项这样的检查而不是三项) .如今,这些技巧不太可能提供可衡量的性能增益,但它曾经在这些旧的笨重 J2ME 手机上很重要:)
标签: java arrays performance multidimensional-array