题 如何在Java中声明和初始化数组?


如何在Java中声明和初始化数组?


1617
2017-07-29 14:22


起源


java 10是否允许通过声明数组 VAR? - gstackoverflow


答案:


您可以使用数组声明或数组文字(但只有在声明并立即影响变量时,才能使用数组文字重新分配数组)。

对于原始类型:

int[] myIntArray = new int[3];
int[] myIntArray = {1,2,3};
int[] myIntArray = new int[]{1,2,3};

例如,对于课程 String, 一样的:

String[] myStringArray = new String[3];
String[] myStringArray = {"a","b","c"};
String[] myStringArray = new String[]{"a","b","c"};

当您首先声明数组然后初始化它时,第三种初始化方法很有用。演员是必要的。

String[] myStringArray;
myStringArray = new String[]{"a","b","c"};

2192
2017-07-09 21:59



同时采用第二种和第三种方式的目的是什么? - Quazi Irfan
@iamcreasy看起来第二种方式不适用于return语句。 return {1,2,3} 给出错误,而 return new int[]{1,2,3} 工作得很好(当然假设你的函数返回一个整数数组)。 - Skylar Ittner
@SkylarMT但我们仍然可以使用第一种方式与return语句一起使用。 - Quazi Irfan
@iamcreasy我最近编写了一个返回一组int的函数。如果函数内部发生错误,我希望它返回一个特定的值,但函数需要返回一个数组。哪种方式适用于单行返回语句?只有第三个。 - Skylar Ittner
@apadana在第二种情况下,您将创建一个匿名对象,该对象仅在封闭范围(函数或其他)中定义。将其返回给调用者后,它将不再有效。使用new关键字从堆中分配新对象,它在定义范围之外有效。 - teukkam


有两种类型的数组。
 

一维数组

默认值的语法:

int[] num = new int[5];

或者(不太喜欢)

int num[] = new int[5];

给定值的语法(变量/字段初始化):

int[] num = {1,2,3,4,5};

或者(不太喜欢)

int num[] = {1, 2, 3, 4, 5};

注意:为了方便int [] num更可取,因为它清楚地告诉你这里是关于数组的。否则没什么区别。一点也不。

多维数组

宣言

int[][] num = new int[5][2];

要么

int num[][] = new int[5][2];

要么

int[] num[] = new int[5][2];

初始化

 num[0][0]=1;
 num[0][1]=2;
 num[1][0]=1;
 num[1][1]=2;
 num[2][0]=1;
 num[2][1]=2;
 num[3][0]=1;
 num[3][1]=2;
 num[4][0]=1;
 num[4][1]=2;

要么

 int[][] num={ {1,2}, {1,2}, {1,2}, {1,2}, {1,2} };

衣衫褴褛的阵列(或非矩形阵列)

 int[][] num = new int[5][];
 num[0] = new int[1];
 num[1] = new int[5];
 num[2] = new int[2];
 num[3] = new int[3];

所以我们在这里明确定义列。
其他方式: 

int[][] num={ {1}, {1,2}, {1,2,3,4,5}, {1,2}, {1,2,3} };

用于访问:

for (int i=0; i<(num.length); i++ ) {
    for (int j=0;j<num[i].length;j++)
        System.out.println(num[i][j]);
}

或者:

for (int[] a : num) {
  for (int i : a) {
    System.out.println(i);
  }
}

粗糙的数组是多维数组。
有关解释,请参阅多维数组详细信息 官方的java教程


222
2017-07-29 14:29



第一个不会导致null / empty数组,而不是带有默认值的数组吗? - vipin8169
我同意这一点,我们可以添加一个功能,我们可以动态更改大小。 - AdamIJK
我可能会争辩说多维数组是一个不同的“类型”数组。它只是一个术语,用于描述恰好包含其他数组的数组。外部数组和内部数组(以及它们之间的数组,如果它们存在)都只是常规数组。 - tradeJmark


Type[] variableName = new Type[capacity];

Type[] variableName = {comma-delimited values};



Type variableName[] = new Type[capacity]; 

Type variableName[] = {comma-delimited values};

也是有效的,但我更喜欢类型之后的括号,因为更容易看到变量的类型实际上是一个数组。


116
2017-07-29 14:28



我同意这一点。变量的类型不是“TYPE”,但实际上是TYPE [],因此以这种方式为我编写它是有意义的。 - Chet
谷歌风格 这也是建议。 - wener
注意 int[] a, b; 不会是一样的 int a[], b;,如果你使用后者的形式,这是一个容易犯的错误。 - Jeroen Vannevel


您可以通过多种方式在Java中声明数组:

float floatArray[]; // Initialize later
int[] integerArray = new int[10];
String[] array = new String[] {"a", "b"};

您可以在中找到更多信息 太阳教程 网站和 的JavaDoc


32
2017-07-29 14:29





我发现如果您理解每个部分会很有帮助:

Type[] name = new Type[5];

Type[] 是个 类型 的 变量 叫名字(“名字”叫做 识别码)。文字“Type”是基本类型,括号表示这是该基数的数组类型。数组类型依次​​是它们自己的类型,它允许您创建多维数组 Type[][] (Type []的数组类型)。关键字 new 说要为新阵列分配内存。括号之间的数字表示新数组的大小和分配的内存量。例如,如果Java知道基类型 Type 需要32个字节,并且您需要一个大小为5的数组,它需要在内部分配32 * 5 = 160个字节。

您还可以使用已存在的值创建数组,例如

int[] name = {1, 2, 3, 4, 5};

它不仅会创建空白空间,还会使用这些值填充它。 Java可以告诉基元是整数,并且它们中有5个,因此可以隐式确定数组的大小。


26
2018-06-04 06:02



所以没有必要包括 int[] name = new int[5] ? - Cookie Monster


以下显示了数组的声明,但未初始化该数组:

 int[] myIntArray = new int[3];

以下显示了数组的声明和初始化:

int[] myIntArray = {1,2,3};

现在,以下还显示了数组的声明和初始化:

int[] myIntArray = new int[]{1,2,3};

但是第三个显示了匿名数组对象创建的属性,它由引用变量“myIntArray”指向,所以如果我们只写“new int [] {1,2,3};”那么这就是如何创建匿名数组对象。

如果我们只写:

int[] myIntArray;

这不是数组的声明,但以下语句使上述声明完成:

myIntArray=new int[3];

26
2017-07-29 14:25



除了第二种方法之外,第二种和第三种方法之间绝对没有区别 只要 当你还声明一个变量时,它会起作用。目前还不清楚“显示匿名数组对象创建的属性”是什么意思,但它们实际上是等效的代码片段。 - Jon Skeet
另外,第一个片段 不 初始化数组 - 保证每个数组元素的值为0。 - Jon Skeet


或者,

// Either method works
String arrayName[] = new String[10];
String[] arrayName = new String[10];

那声明了一个名为的数组 arrayName 大小为10(你要使用0到9的元素)。


22
2017-07-29 15:56



使用的标准是什么?我刚刚发现了前者,我发现它具有可怕的误导性:| - Anti Earth
值得一提的是,我的教授说第二种方式在Java中更为典型,它更好地传达了正在发生的事情;作为与变量转换为类型相关的数组。 - Celeritas
旁注:一种语言具有多个语义,用于声明一个意味着糟糕语言设计的东西。 - Muhammad Suleman


此外,如果您想要更动态的东西,还有List接口。这不会表现得那么好,但更灵活:

List<String> listOfString = new ArrayList<String>();

listOfString.add("foo");
listOfString.add("bar");

String value = listOfString.get(0);
assertEquals( value, "foo" );

22
2018-01-28 19:19



您创建的列表中调用的“<>”是什么? - CyprUS


制作数组有两种主要方法:

这个,对于一个空数组:

int[] array = new int[n]; // "n" being the number of spaces to allocate in the array

而这一个,对于一个初始化的数组:

int[] array = {1,2,3,4 ...};

您还可以创建多维数组,如下所示:

int[][] array2d = new int[x][y]; // "x" and "y" specify the dimensions
int[][] array2d = { {1,2,3 ...}, {4,5,6 ...} ...};

12
2018-05-23 19:56





采用原始类型 int 例如。声明和声明有几种方法 int 数组:

int[] i = new int[capacity];
int[] i = new int[] {value1, value2, value3, etc};
int[] i = {value1, value2, value3, etc};

在所有这些中,你可以使用 int i[] 代替 int[] i

通过反射,您可以使用 (Type[]) Array.newInstance(Type.class, capacity);

请注意,在方法参数中, ... 指示 variable arguments。基本上,任何数量的参数都可以。使用代码更容易解​​释:

public static void varargs(int fixed1, String fixed2, int... varargs) {...}
...
varargs(0, "", 100); // fixed1 = 0, fixed2 = "", varargs = {100}
varargs(0, "", 100, 200); // fixed1 = 0, fixed2 = "", varargs = {100, 200};

在方法里面, varargs 被视为正常 int[]Type... 只能在方法参数中使用,所以 int... i = new int[] {} 不会编译。

通过时请注意 int[] 一种方法(或任何其他方法) Type[]),你不能使用第三种方式。在声明中 int[] i = *{a, b, c, d, etc}*,编译器假设 {...} 意思是 int[]。但那是因为你要声明一个变量。将数组传递给方法时,声明必须是 new Type[capacity] 要么 new Type[] {...}

多维数组

多维数组很难处理。本质上,2D数组是一个数组数组。 int[][] 意思是一个数组 int[]秒。关键是,如果一个 int[][] 被宣布为 int[x][y],最大指数是 i[x-1][y-1]。基本上,一个矩形 int[3][5] 是:

[0, 0] [1, 0] [2, 0]
[0, 1] [1, 1] [2, 1]
[0, 2] [1, 2] [2, 2]
[0, 3] [1, 3] [2, 3]
[0, 4] [1, 4] [2, 4]

9
2018-01-20 11:54