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


2052

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


4
在发布新答案之前,请考虑该问题已经有25个以上的答案。请确保您的答案提供的信息不属于现有答案。
janniks

Answers:


2681

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

对于原始类型:

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

// Since Java 8. Doc of IntStream: https://docs.oracle.com/javase/8/docs/api/java/util/stream/IntStream.html

int [] myIntArray = IntStream.range(0, 100).toArray(); // From 0 to 99
int [] myIntArray = IntStream.rangeClosed(0, 100).toArray(); // From 0 to 100
int [] myIntArray = IntStream.of(12,25,36,85,28,96,47).toArray(); // The order is preserved.
int [] myIntArray = IntStream.of(12,25,36,85,28,96,47).sorted().toArray(); // Sort 

例如,对于类,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"};

33
同时拥有第二种和第三种方式的目的是什么?
Quazi Irfan 2015年

123
@iamcreasy看起来第二种方法不适用于return语句。 return {1,2,3}给出一个错误,而return new int[]{1,2,3}工作正常(当然,假设您的函数返回一个整数数组)。
Skylar Ittner 2015年

1
@SkylarMT但是我们仍然可以使用第一种方法与return语句一起使用。
Quazi Irfan 2015年

6
@iamcreasy我最近编写了一个返回整数数组的函数。如果函数内部发生错误,我希望它返回某个值,但是函数需要返回一个数组。哪种方法适用于单线退货声明?只有第三个。
Skylar Ittner

5
@apadana在第二种情况下,您将创建一个仅在封闭范围(函数或其他内容)中定义的匿名对象。将其返回给调用方后,它不再有效。使用new关键字可以从堆中分配新对象,并且该对象在定义范围之外有效。
teukkam

280

有两种类型的数组。

一维阵列

默认值的语法:

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教程中的多维数组详细信息。


第一个不会导致一个null / empty数组,而不是具有默认值的数组吗?
vipin8169 '17

我同意这一点,我们可以添加另一个功能,可以动态更改大小。
AdamIJK

我可能会与您争论多维数组是数组的另一种“类型”。它只是一个术语,用于描述恰好包含其他数组的数组。外部数组和内部数组(以及两者之间的数组,如果存在的话)都是常规数组。
Tim M.

127
Type[] variableName = new Type[capacity];

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



Type variableName[] = new Type[capacity]; 

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

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


22
我同意这一点。变量的类型不是“ TYPE”,实际上是TYPE [],因此对我来说以这种方式编写是有意义的。
切特

3
Google风格也建议这样做。
Wener 2014年

11
请注意,这int[] a, b;将与相同int a[], b;,如果您使用后一种形式,则会容易出错。
Jeroen Vannevel 2015年

39

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

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

您可以在Sun教程站点和JavaDoc中找到更多信息。


31

如果您了解每个部分,我会发现它会有所帮助:

Type[] name = new Type[5];

Type[]是称为名称的变量类型(“名称”称为标识符)。文字“ Type”是基础类型,方括号表示这是该基础的数组类型。数组类型又是它们自己的类型,它使您可以制作多维数组,例如(Type []的数组类型)。关键字表示为新数组分配内存。括号之间的数字表示新数组的大小以及要分配的内存量。例如,如果Java知道基本类型占用32个字节,并且您想要一个大小为5的数组,则它需要在内部分配32 * 5 = 160个字节。Type[][]newType

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

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

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


所以没有必要包括int[] name = new int[5]吗?
Cookie怪物

31

下面显示了一个数组的声明,但是该数组未初始化:

 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];

2
第二种方法和第三种方法之间绝对没有区别,除了第二种方法在声明变量时才起作用。尚不清楚“显示匿名数组对象创建的属性”的含义,但它们实际上是等效的代码。
乔恩·斯基特

4
另外,第一个代码段确实初始化了数组-确保每个数组元素的值都为0。
乔恩·斯基特

第二和第三种方法之间真的没有区别吗?
typelogic

27

或者,

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

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


7
使用什么标准?我只是发现了前者,而我发现它令人误解:|
Anti Earth

2
值得我教授说的是,第二种方法在Java中更为典型,它可以更好地传达正在发生的事情。作为与变量强制转换类型相关的数组。
Celeritas

2
附带说明:一种语言具有多种语义,可以声明一件事意味着不良的语言设计。
穆罕默德·苏莱曼

26

另外,如果您想要更动态的东西,还有List界面。这样做的效果不佳,但更加灵活:

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

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

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

2
在您创建的列表中调用的“ <>”是什么?
塞浦路斯

@CyprUS List是一个泛型类,它具有一个类型作为参数,并包含在中<>。这很有用,因为您只需定义一次泛型类型,然后就可以将其用于多种不同类型。有关更详细的说明,请访问docs.oracle.com/javase/tutorial/java/generics/types.html
Heimdall,

15

创建数组有两种主要方法:

这是一个空数组:

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 ...} ...};

11

以原始类型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[] {...}

多维数组

多维数组更难处理。本质上,二维数组是数组的数组。int[][]表示int[]s 的数组。关键是如果将an 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

如果要使用反射创建数组,则可以执行以下操作:

 int size = 3;
 int[] intArray = (int[]) Array.newInstance(int.class, size ); 

您为什么要以这种方式创建数组?
多里安·格雷

9

声明对象引用的数组:

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
    }
}

7

数组是项目的顺序列表

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 }
};

如果是一个对象,那就是相同的概念

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() }
};

对于对象,您需要null使用new Type(..),类之类StringInteger是特殊情况,将其分配给它们进行初始化,如下所示

String [] a = { "hello", "world" };
// is equivalent to
String [] a = { new String({'h','e','l','l','o'}), new String({'w','o','r','l','d'}) };

Integer [] b = { 1234, 5678 };
// is equivalent to
Integer [] b = { new Integer(1234), new Integer(5678) };

通常,您可以创建M维数组

int [][]..[] array =
//  ^ M times [] brackets

    {{..{
//  ^ M times { bracket

//            this is array[0][0]..[0]
//                         ^ M times [0]

    }}..}
//  ^ M times } bracket
;

值得注意的M是,就空间而言,创建维数组是昂贵的。由于当您创建一个M包含N所有维度的维数组时,该数组的总大小大于N^M,因为每个数组都有一个参考,并且在M维处有一个(M-1)维的参考数组。总尺寸如下

Space = N^M + N^(M-1) + N^(M-2) + .. + N^0
//      ^                              ^ array reference
//      ^ actual data


6

要创建类Object的数组,可以使用java.util.ArrayList。定义一个数组:

public ArrayList<ClassName> arrayName;
arrayName = new ArrayList<ClassName>();

给数组赋值:

arrayName.add(new ClassName(class parameters go here);

从数组中读取:

ClassName variableName = arrayName.get(index);

注意:

variableName是对数组的引用,表示操作variableName将进行操作arrayName

for循环:

//repeats for every value in the array
for (ClassName variableName : arrayName){
}
//Note that using this for loop prevents you from editing arrayName

for循环,允许您进行编辑arrayName(传统的for循环):

for (int i = 0; i < arrayName.size(); i++){
    //manipulate array here
}

5

为Java 8及更高版本声明和初始化。创建一个简单的整数数组:

int [] a1 = IntStream.range(1, 20).toArray();
System.out.println(Arrays.toString(a1));
// Output: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

为[-50,50]之间的整数和双精度[0,1E17]创建一个随机数组:

int [] a2 = new Random().ints(15, -50, 50).toArray();
double [] a3 = new Random().doubles(5, 0, 1e17).toArray();

2的幂次幂:

double [] a4 = LongStream.range(0, 7).mapToDouble(i -> Math.pow(2, i)).toArray();
System.out.println(Arrays.toString(a4));
// Output: [1.0, 2.0, 4.0, 8.0, 16.0, 32.0, 64.0]

对于String [],您必须指定一个构造函数:

String [] a5 = Stream.generate(()->"I will not squeak chalk").limit(5).toArray(String[]::new);
System.out.println(Arrays.toString(a5));

多维数组:

String [][] a6 = List.of(new String[]{"a", "b", "c"} , new String[]{"d", "e", "f", "g"})
    .toArray(new String[0][]);
System.out.println(Arrays.deepToString(a6));
// Output: [[a, b, c], [d, e, f, g]]

实际包含-50和/或+50吗?也就是说,内部是一端开放还是两端开放?
彼得·莫滕森

1
包括-50,不包括+50。此信息来自java api “给定的起源(包括)和绑定的(排除)”。我使用Wiki中的间隔声明 。所以我认为这将是更正确的[
-50,50

3

声明和初始化ArrayList的另一种方法:

private List<String> list = new ArrayList<String>(){{
    add("e1");
    add("e2");
}};

2

这里有很多答案。我添加了一些技巧来创建数组(从考试的角度来看,很高兴知道这一点)

  1. 声明并定义一个数组

    int intArray[] = new int[3];

    这将创建一个长度为3的数组。由于它拥有基本类型int,因此默认情况下所有值都设置为0。例如,

    intArray[2]; // Will return 0
  2. 在变量名称前使用方括号[]

    int[] intArray = new int[3];
    intArray[0] = 1;  // Array content is now {1, 0, 0}
  3. 初始化并将数据提供给阵列

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

    这次,您无需在方括号中提及尺寸。甚至一个简单的变体是:

    int[] intArray = {1, 2, 3, 4};
  4. 长度为0的数组

    int[] intArray = new int[0];
    int length = intArray.length; // Will return length 0

    与多维数组相似

    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

在变量之前使用方括号:

    int[][] intArray = new int[2][3];

如果在末尾放一个盒子支架,那绝对没问题:

    int[] intArray [] = new int[2][4];
    int[] intArray[][] = new int[2][3][4]

一些例子

    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}}

每个内部元素的大小不必相同。

    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.

您必须确保如果使用上述语法,则必须在正向方向上在方括号中指定值。否则它将无法编译。一些例子:

    int [][][] intArray = new int[1][][];
    int [][][] intArray = new int[1][2][];
    int [][][] intArray = new int[1][2][3];

另一个重要特征是协变

    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

重要说明:对于引用的类型,存储在数组中的默认值为null。


2

您也可以使用java.util.Arrays

List<String> number = Arrays.asList("1", "2", "3");

Out: ["1", "2", "3"]

这个非常简单明了。


我没有在其他答案中看到它,所以我想可以添加它。
Sylhare

1
列表不是数组
Tirno

有时人们想要数组时就表示数组。
Sylhare


1

数组有两种基本类型。

静态数组:固定大小的数组(其大小应在开始时声明,以后不能更改)

动态数组:对此不考虑大小限制。(Java中不存在纯动态数组。因此,建议使用List)

要声明一个整数,字符串,浮点数等的静态数组,请使用下面的声明和初始化语句。

    int[] intArray = new int[10]; 
    String[] intArray = new int[10]; 
    float[] intArray = new int[10]; 
    
   // here you have 10 index starting from 0 to 9

要使用动态功能,必须使用List ... List是纯动态数组,无需在开始时声明大小。贝娄是在JAVA中声明列表的正确方法

        ArrayList<String> myArray = new ArrayList<String>();
        myArray.add("Value 1: something");
        myArray.add("Value 2: something more");


1
谢谢@Matheus改进了我的答案。我要求您对此进行投票,以便可以吸引更多用户。
齐亚·穆罕默德

0

声明数组: int[] arr;

初始化数组:int[] arr = new int[10];10表示数组中允许的元素数

声明多维数组: int[][] arr;

初始化多维数组:int[][] arr = new int[10][17];10行17列和170个元素,因为10乘以17就是170。

初始化数组意味着指定其大小。


0

声明和初始化数组非常容易。例如,您要在数组中保存五个整数元素,它们分别是1、2、3、4和5。您可以通过以下方式进行操作:

一个)

int[] a = new int[5];

要么

b)

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

所以基本模式是通过方法a)进行初始化和声明的:

datatype[] arrayname = new datatype[requiredarraysize];

datatype 应该小写。

因此,基本模式是通过方法a进行初始化和声明的:

如果是字符串数组:

String[] a = {"as", "asd", "ssd"};

如果是字符数组:

char[] a = {'a', 's', 'w'};

对于float double,数组的格式将与整数相同。

例如:

double[] a = {1.2, 1.3, 12.3};

但是,当您通过“方法a”声明并初始化数组时,您将必须手动或通过循环或其他方式输入值。

但是,当您通过“方法b”进行操作时,则不必手动输入值。


0

数组可以包含基本数据类型以及类的对象,具体取决于数组的定义。对于基元数据类型,实际值存储在连续的存储位置中。对于类的对象,实际对象存储在堆段中。


一维数组:
一维数组声明的一般形式是

type var-name[];
OR
type[] var-name;

用Java实例化数组

var-name = new type [size];

例如

    int intArray[];    //declaring array
    intArray = new int[20];  // allocating memory to array
    // the below line is equals to line1 + line2
    int[] intArray = new int[20]; // combining both statements in one
     int[] intArray = new int[]{ 1,2,3,4,5,6,7,8,9,10 }; 
    // accessing the elements of the specified array
    for (int i = 0; i < intArray.length; i++)
    System.out.println("Element at index " + i + " : "+ intArray[i]);

参考:https : //www.geeksforgeeks.org/arrays-in-java/


0

电影类another的另一个完整示例

public class A {

        public static void main(String[] args) {

                class Movie{

                    String movieName;
                    String genre;
                    String movieType;
                    String year;
                    String ageRating;
                    String rating;

                    public Movie(String [] str)
                    {
                        this.movieName = str[0];
                        this.genre = str[1];
                        this.movieType = str[2];
                        this.year = str[3];
                        this.ageRating = str[4];
                        this.rating = str[5];    
                    }

                }

                String [] movieDetailArr = {"Inception", "Thriller", "MovieType", "2010", "13+", "10/10"};

                Movie mv = new Movie(movieDetailArr);

                System.out.println("Movie Name: "+ mv.movieName);
                System.out.println("Movie genre: "+ mv.genre);
                System.out.println("Movie type: "+ mv.movieType);
                System.out.println("Movie year: "+ mv.year);
                System.out.println("Movie age : "+ mv.ageRating);
                System.out.println("Movie  rating: "+ mv.rating);


            }

        } 

-1
int[] x=new int[enter the size of array here];

例:

int[] x=new int[10];

要么

int[] x={enter the elements of array here];

例:

int[] x={10,65,40,5,48,31};

-7
int[] SingleDimensionalArray = new int[2]

int[][] MultiDimensionalArray = new int[3][4]

6
尽管此代码可以回答问题,但最好在不介绍其他方法的情况下解释它如何解决该问题以及为什么要使用它。从长远来看,纯代码答案没有用。
博诺2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.