Java数组


1、注意:int []  array  =  new int [-1]; 这样定义仍可以编译通过,只是在运行时会抛出java.lang.NegativeArraySizeException异常,这是一个运行时异常,通俗讲就是代码不运行到这一行就不会出现问题。

注:int[] array = newint[0];是合法的)

但C++类似的定义如int i[3][-1]则是会在编译期报错;

2、数组初始化方式:
1)静态初始化:显示指定每个元素初始值,由系统决定数组长度,例:String[] strs = {"aaa","bbb"};int[] irr = new int[]{1,2,3,4};
2)动态初始化:只指定数组长度,由系统为数组元素分配初始值,例:String[] strs = new String[5];
// 注意与C++数组初始化的区别:Java不存在静态动态初始化同时使用,即不存在C++中的int m[5] = {1,2,3};
2.使用Java数组之前一定要注意初始化
3.Java不允许直接访问堆内存中的数据
4.{1,2}类似于{}包含的形式,只适用于数组初始化,不可用于赋值。即 int[] a; a = {1,2};错误的用法。

3.多维数组,具可看做一维数组

public static void main(String[] args) {

        int[][] a = new int[4][5];

 

        a[0] = new int[2];//注意每个二维的维度都不相等

        a[1] = new int[3];

        a[2] = new int[4];

        a[3] = new int[5];

        a[0][0] = 5;

        a[0][1] = 7;

        for (int[] m : a) {

            for (int t : m) {

                System.out.print(t);

                System.out.print(" ");

            }

            System.out.println();

        }

 

       /* 下面代码会出错

         * for(int i = 0; i < a.length ; i++){

            for(int j = 0; j < a[3].length; i ++){

                System.out.print(a[i][j]);

            }

        }*/

 

        /*输出结果:

         * 5 7

         * 0 0 0

         * 0 0 0 0

         * 0 0 0 0 0

         */

    }


4、Array是一种对象
Java中的数组其实也是一个对象,但是确实是一个特殊的对象,实在是太特殊了,继承自Object, 多出一个属性length,改写了clone方法。
 
我debug了数组对象的运行时的Class对象,只有一个name属性,用[L开头,其他属性全是null。
调用 getDeclaredFields,getDeclaredMethods都没有数据。这就奇怪了,明明可以用的length属性在哪的呢
 
stackoverflow上有简单的解释:

Arrays are special objects in java, they have a simple attribute named length which is final.

There is no "class definition" of an array (you can't find it in any .class file), they're a part of the language itself.

看了上面英文我的理解是数组是java底层的类,可能是用c语言写的,所以在java语言Class类定义上,都找不到length属性和clone方法的声明。 这里强调一点数组的clone是浅复制,也就是多维数组的时候,只会克隆第一维,后面维的都是指向相同地址的指针。
 

It's "special" basically, with its own bytecode instruction: arraylength. So this method:

public static void  main ( String []  args ) {
int x = args.length;
}

is compiled into bytecode like this:
public static void main(java.lang.String[]);

Code:
  0: aload_0 1: arraylength 2: istore_1 3: return

通过javap更好的说明了数组的length属性,其实是一个单独的二进制指令:arraylength












你可能感兴趣的:(Java数组)