搜索

首页  >  问答  >  正文

赋值 - Java数组初始化,这三种方式有什么区别?

形式1:

Object[] params = null;
params = {1, 2, 3, 4};

形式2:

Object[] params = {1, 2, 3, 4};

形式3:

Object[] params = new Object[]{1, 2, 3, 4};

1.为什么第一种形式就是错的(编译阶段就报错),而第二种就可以呢?(第三种很显然)
2.第二种和第三种,哪种初始化方式更优呢?(或者有更好的?)

天蓬老师天蓬老师2828 天前981

全部回复(4)我来回复

  • 迷茫

    迷茫2017-04-18 09:51:39

    首先因为数组初始化要使用的时候必须确定数组的长度,也就是说数组的长度是不可变的。
    在JAVA中创建数组有两种方式 :
    (1)静态创建

    Object[] arr1 = {"a","b","c"}; 

    (2)动态创建
    1

        Object[] arr3 = new Object[]{"a","b","c"};

    2

        Object[] arr2 = new Object[3];  
                arr2[1] = "a";
                arr2[2] = "b";
                arr2[3] = "c";
                //先确认元素个数,一般情况下习惯使用动态创建方式 比较灵活 可以先规定元素个数 后对每个元素进行赋值

    3

        Object[] arr4 = null;  
        arr4 = new Object[3];
                arr4[1] = "a";
                arr4[2] = "b";
                arr4[3] = "c";
                //直接给arr4初始化为null,然后要使用的时候再创建一个新的数组new Object[3],让arr4指向新数组的地址,然后再依次赋值

    而题主说的那种方法:

    Object[] params = null;
    params = {1, 2, 3, 4};

    错误一:你这是直接创建一个空数组params,也就是他就是空了,数组的长度不可改变,你这时候往里面加数据,一个空数组自然加不了任何东西,所以编译时就会出错。你应该跟我上面所说的第二种方法一样,重新创建一个长度为4的数组,把新数组的地址给params,也就是Object[] params = null; params = new Object[4];这样就可以创建。
    错误二:数组的初始化只有在定义的时候可以连续添加,定义完

    Object[] params = null;
    params = new Object[4];

    之后,你要向里面添加数据,就只能对着数组下标,一个一个添加。

    params[1] = 1;
    params[2] = 2;
    params[23 = 3;
    params[4] = 4;

    而不能直接params = {1, 2, 3, 4};

    回复
    0
  • 迷茫

    迷茫2017-04-18 09:51:39

    形式1

    Object[] params = {1, 2, 3, 4};

    这种声明方式其实只是Java初始化数组的语法糖,所谓语法糖只是为了方便码农,在实际执行中,Java会把它变成形式3,即

    Object[] params = new Object[]{1, 2, 3, 4};

    而Java并没有提供类似形式2的这种语法糖,所以这样使用是非法了。

    回复
    0
  • 迷茫

    迷茫2017-04-18 09:51:39

    Object[] params = null;
    params = new Object[]{1, 2, 3, 4};

    A. 语法规定楼主不需要太纠结
    B. 如果你预先知道数组元素,使用第Object[] params = {1, 2, 3, 4};声明数组代码更简洁,没有更优的说法。

    回复
    0
  • 巴扎黑

    巴扎黑2017-04-18 09:51:39

    第一种的声明方式就是不正确的
    应该是Object[] params = new Object[length]

    我常用的是第二种

    回复
    0
  • 取消回复