29

我正在阅读一本关于Java的书,遇到了一个示例,其中 double 类型的数组以我以前从未见过的方式初始化。它是什么类型的初始化,它还能在哪里使用?

double m[][]={
    {0*0,1*0,2*0,3*0},
    {0*1,1*1,2*1,3*1},
    {0*2,1*2,2*2,3*2},
    {0*3,1*3,2*3,3*3}
};
4

5 回答 5

38

这是数组初始值设定项语法,它只能在声明数组类型变量时用在右侧。例子:

int[] x = {1,2,3,4};
String[] y = {"a","b","c"};

如果您不在变量声明的 RHS 上,请改用数组构造函数:

int[] x;
x = new int[]{1,2,3,4};
String[] y;
y = new String[]{"a","b","c"};

这些声明具有完全相同的效果:分配并使用指定内容构造一个新数组。

在您的情况下,以编程方式指定表实际上可能更清晰(重复性更少,但不太简洁):

double[][] m = new double[4][4];

for(int i=0; i<4; i++) {
    for(int j=0; j<4; j++) {
        m[i][j] = i*j;
    }
}
于 2013-09-02T18:25:53.943 回答
3

您可以通过在右侧的花括号中写入实际值来初始化数组,例如:

String[] strArr = { "one", "two", "three"};
int[] numArr = { 1, 2, 3};

以同样的方式,二维数组或数组数组将数组保存为 value,因此:

String strArrayOfArrays = { {"a", "b", "c"}, {"one", "two", "three"} };

你的例子正好表明

double m[][] = {
    {0*0,1*0,2*0,3*0},
    {0*1,1*1,2*1,3*1},
    {0*2,1*2,2*2,3*2},
    {0*3,1*3,2*3,3*3}
};

但也将执行数字的乘法,其与以下相同:

double m[][] = { {0, 0, 0, 0}, {0, 1, 2, 3}, {0, 2, 4, 6}, {0, 3, 6, 9} };
于 2017-10-31T14:52:16.200 回答
1

double m[][]声明一个数组数组,即所谓的多维数组。

m[0]指向一个大小为4的数组,包含0*0,1*0,2*0,3*0。简单的数学表明这些值实际上是 0,0,0,0。

第二行也是大小为 4 的数组,包含 0、1、2、3。

等等...

我猜你书中的这种多重格式是为了表明 0*0 是第 0 行第 0 列,0*1 是第 0 行第 1 列,依此类推。

于 2013-09-02T18:25:05.480 回答
1

它被称为数组初始化器,可以在Java 规范 10.6中进行解释。

这可用于初始化任何数组,但它只能用于初始化(不能分配给现有数组)。它的独特之处之一是数组的尺寸可以从初始化程序中确定。创建数组的其他方法需要您手动插入数字。在许多情况下,这有助于最大限度地减少程序员修改初始化程序并且未能更新维度时发生的琐碎错误。

基本上,初始化程序分配一个正确大小的数组,然后从左到右评估列表中的每个元素。规范还指出,如果元素类型是一个数组(例如对于您的情况......我们有一个 double[] 数组),那么每个元素本身可能是一个初始化列表,这就是为什么您会看到一个外大括号,每行都有内大括号。

于 2013-09-02T18:26:56.700 回答
1

如果您可以接受 Double Objects,那么这篇文章会很有帮助: Initialization of an ArrayList in one line

List<Double> y = Arrays.asList(null, 1.0, 2.0);
Double x = y.get(1);
于 2017-10-31T13:26:54.030 回答