How do I declare and initialize an array in Java?
如何在Java中声明和初始化数组?
您可以使用数组声明或数组文字(但只有当您立即声明并影响变量时,数组文字才能用于重新分配数组)。
对于基元类型:
1 2 3 | int[] myIntArray = new int[3]; int[] myIntArray = {1, 2, 3}; int[] myIntArray = new int[]{1, 2, 3}; |
对于类,例如
1 2 3 |
当您首先声明数组,然后初始化它时,第三种初始化方法很有用。这里需要石膏。
数组有两种类型。
默认值的语法:
1 | int[] num = new int[5]; |
或(较低优先)
1 | int num[] = new int[5]; |
给定值的语法(变量/字段初始化):
1 | int[] num = {1,2,3,4,5}; |
或(较低优先)
1 | int num[] = {1, 2, 3, 4, 5}; |
注意:为了方便起见,最好使用int[]num,因为它清楚地告诉您这里谈论的是数组。否则没有区别。完全没有。
1 | int[][] num = new int[5][2]; |
或
1 | int num[][] = new int[5][2]; |
或
1 | int[] num[] = new int[5][2]; |
初始化
1 2 3 4 5 6 7 8 9 10 | 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; |
或
1 | int[][] num={ {1,2}, {1,2}, {1,2}, {1,2}, {1,2} }; |
不规则阵列(或非矩形阵列)
1 2 3 4 5 | 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]; |
因此,我们在这里明确定义列。
另一种方式:
1 | int[][] num={ {1}, {1,2}, {1,2,3,4,5}, {1,2}, {1,2,3} }; |
访问:
1 2 3 4 | for (int i=0; i<(num.length); i++ ) { for (int j=0;j<num[i].length;j++) System.out.println(num[i][j]); } |
可选地:
1 2 3 4 5 |
不规则数组是多维数组。
为了解释,请参见官方Java教程中的多维数组细节
1 2 3 4 5 6 7 8 9 | Type[] variableName = new Type[capacity]; Type[] variableName = {comma-delimited values}; Type variableName[] = new Type[capacity]; Type variableName[] = {comma-delimited values}; |
也是有效的,但我更喜欢类型后面的括号,因为更容易看到变量的类型实际上是一个数组。
有多种方法可以在Java中声明数组:
1 2 3 |
您可以在Sun教程站点和JavaDoc中找到更多信息。
下面显示了数组的声明,但数组未初始化:
1 | int[] myIntArray = new int[3]; |
下面显示了数组的声明和初始化:
1 | int[] myIntArray = {1,2,3}; |
现在,下面还显示了数组的声明和初始化:
1 | int[] myIntArray = new int[]{1,2,3}; |
但是第三个例子显示了匿名数组对象创建的属性,它由一个引用变量"myIntaray"指向,所以如果我们只写"new int[]1,2,3",那么匿名数组对象就是这样创建的。
如果我们只是写:
1 | int[] myIntArray; |
这不是数组的声明,但以下语句使上述声明完成:
1 | myIntArray=new int[3]; |
如果你能理解每一部分,我觉得这很有帮助:
1 | Type[] name = new Type[5]; |
您还可以使用已经存在的值创建数组,例如
1 | int[] name = {1, 2, 3, 4, 5}; |
它不仅创建空白空间,而且用这些值填充它。Java可以告诉基元是整数,并且有5个元素,所以数组的大小可以隐式地确定。
或者,
它声明一个名为
另外,如果您想要更动态的东西,可以使用列表界面。这将不会表现得很好,但更灵活:
1 2 3 4 5 6 7 | List<String> listOfString = new ArrayList<String>(); listOfString.add("foo"); listOfString.add("bar"); String value = listOfString.get(0); assertEquals( value,"foo" ); |
创建数组有两种主要方法:
对于空数组:
1 | int[] array = new int[n]; //"n" being the number of spaces to allocate in the array |
对于一个初始化的数组:
1 | int[] array = {1,2,3,4 ...}; |
您还可以制作多维数组,如下所示:
1 2 | int[][] array2d = new int[x][y]; //"x" and"y" specify the dimensions int[][] array2d = { {1,2,3 ...}, {4,5,6 ...} ...}; |
以原始类型
1 2 3 | int[] i = new int[capacity]; int[] i = new int[] {value1, value2, value3, etc}; int[] i = {value1, value2, value3, etc}; |
在所有这些情况下,您可以使用
通过反射,可以使用
注意,在方法参数中,
1 2 3 4 | 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}; |
在该方法中,
注意,当将
多维数组更难处理。实际上,二维数组是数组的数组。
1 2 3 4 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] |
如果要使用反射创建阵列,可以这样做:
1 2 |
声明对象引用数组:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | class Animal {} class Horse extends Animal { public static void main(String[] args) { /* * Array of Animal can hold Animal and Horse (all subtypes of Animal allowed) */ Animal[] a1 = new Animal[10]; a1[0] = new Animal(); a1[1] = new Horse(); /* * Array of Animal can hold Animal and Horse and all subtype of Horse */ Animal[] a2 = new Horse[10]; a2[0] = new Animal(); a2[1] = new Horse(); /* * Array of Horse can hold only Horse and its subtype (if any) and not allowed supertype of Horse nor other subtype of Animal. */ Horse[] h1 = new Horse[10]; h1[0] = new Animal(); // Not allowed h1[1] = new Horse(); /* * This can not be declared. */ Horse[] h2 = new Animal[10]; // Not allowed } } |
在Java 9中
使用不同的
1 2 3 4 5 6 7 8 | int[] a = IntStream.iterate(10, x -> x <= 100, x -> x + 10).toArray(); Out: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100] int[] b = IntStream.iterate(0, x -> x + 1).takeWhile(x -> x < 10).toArray(); Out: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] |
在Java 10中
使用局部变量类型推断:
1 |
数组是项目的顺序列表
1 2 3 4 5 6 7 8 9 10 11 | int item = value; int [] one_dimensional_array = { value, value, value, .., value }; int [][] two_dimensional_array = { { value, value, value, .. value }, { value, value, value, .. value }, .. .. .. .. { value, value, value, .. value } }; |
如果它是一个物体,那么它是相同的概念
1 2 3 4 5 6 7 8 9 10 11 | Object item = new Object(); Object [] one_dimensional_array = { new Object(), new Object(), .. new Object() }; Object [][] two_dimensional_array = { { new Object(), new Object(), .. new Object() }, { new Object(), new Object(), .. new Object() }, .. .. .. { new Object(), new Object(), .. new Object() } }; |
在对象的情况下,您需要将其分配给
1 2 3 4 5 6 7 |
一般来说,您可以创建
1 2 3 4 5 6 7 8 9 10 11 12 | int [][]..[] array = // ^ M times [] brackets {{..{ // ^ M times { bracket // this is array[0][0]..[0] // ^ M times [0] }}..} // ^ M times } bracket ; |
值得注意的是,创建一个
1 2 3 | Space = N^M + N^(M-1) + N^(M-2) + .. + N^0 // ^ ^ array reference // ^ actual data |
为了创建类对象数组,可以使用
1 2 | public ArrayList<ClassName> arrayName; arrayName = new ArrayList<ClassName>(); |
为数组赋值:
1 | arrayName.add(new ClassName(class parameters go here); |
从数组中读取:
1 | ClassName variableName = arrayName.get(index); |
注:
for循环:
1 2 3 4 | //repeats for every value in the array for (ClassName variableName : arrayName){ } //Note that using this for loop prevents you from editing arrayName |
允许您编辑
1 2 3 | for (int i = 0; i < arrayName.size(); i++){ //manipulate array here } |
在Java 8中,你可以这样使用。
1 2 3 |
为Java 8和以后声明和初始化。创建一个简单的整数数组:
1 2 3 |
为介于[-50,50]和double[0,1E17]之间的整数创建随机数组:
1 2 |
两个序列的功率:
1 2 3 |
对于字符串[],必须指定一个构造函数:
1 2 |
多维数组:
1 2 3 4 |
你也可以用
1 2 3 |
这个很简单也很简单。我没有在其他答案中看到它,所以我想我可以添加它。
声明和初始化arraylist的另一种方法:
1 2 3 4 | private List<String> list = new ArrayList<String>(){{ add("e1"); add("e2"); }}; |
使用局部变量类型推断,只需指定一次类型:
1 | var values = new int[] { 1, 2, 3 }; |
或
1 | int[] values = { 1, 2, 3 } |
这里有很多答案。添加一些复杂的方法来创建数组(从检查的角度来看,了解这一点很好)
声明和定义数组
1 | int intArray[] = new int[3]; |
这将创建一个长度为3的数组。因为它保存了基元类型int,所以默认情况下所有值都设置为0。
1 | intArray[2]; // will return 0 |
在变量名之前使用方括号[]
1 2 | int[] intArray = new int[3]; intArray[0] = 1; // array content now {1,0,0} |
初始化并向数组提供数据
1 | int[] intArray = new int[]{1,2,3}; |
这一次无需提及框中括号的大小。即使是简单的变种
1 | int[] intArray = {1,2,3,4}; |
长度为0的数组
1 2 | int[] intArray = new int[0]; int length = intArray.length; // will return length 0 |
类似于多维阵列
1 2 3 4 5 6 | int intArray[][] = new int[2][3]; // This will create an array of length 2 and //each element contains another array of length 3. // { {0,0,0},{0,0,0} } int lenght1 = intArray.length; // will return 2 int length2 = intArray[0].length; // will return 3 |
在变量前使用方括号
1 | int[][] intArray = new int[2][3]; |
如果你把一个盒子支架放在末端,那就太好了
1 2 | int[] intArray [] = new int[2][4]; int[] intArray[][] = new int[2][3][4] |
一些实例
1 2 3 4 5 | int [] intArray [] = new int[][] {{1,2,3},{4,5,6}}; int [] intArray1 [] = new int[][] {new int[] {1,2,3}, new int [] {4,5,6}}; int [] intArray2 [] = new int[][] {new int[] {1,2,3},{4,5,6}} // All the 3 arrays assignments are valid //Array looks like {{1,2,3},{4,5,6}} |
每个内部元素的大小不一定相同。
1 2 3 4 5 6 | int [][] intArray = new int[2][]; intArray[0] = {1,2,3}; intArray[1] = {4,5}; //array looks like {{1,2,3},{4,5}} int[][] intArray = new int[][2] ; // this won't compile keep this in mind. |
如果使用上述语法,必须确保正向,必须在方括号中指定值,否则将无法编译。一些例子:
1 2 3 | int [][][] intArray = new int[1][][]; int [][][] intArray = new int[1][2][]; int [][][] intArray = new int[1][2][3]; |
另一个重要特征是协变
1 2 3 4 5 6 7 8 | Number[] numArray = {1,2,3,4}; // java.lang.Number numArray[0] = new Float(1.5f); // java.lang.Float numArray[1] = new Integer(1); // java.lang.Integer //You can store a subclass object in an array that is declared // to be of the type of its superclass. // Here Number is the superclass for both Float and Integer. Number num[] = new Float[5]; // this is also valid |
imp:对于引用的类型,存储到数组的默认值为空。
1 2 3 | int[] SingleDimensionalArray = new int[2] int[][] MultiDimensionalArray = new int[3][4] |