Java基础——数组

文章目录

  • 含义
  • 元数据
  • 内存空间
  • 索引、数组大小
  • 创建
    • 先声明后初始化
    • 声明并初始化
    • arr[ ]和arr[ ]{}的区别
  • 打印数组
  • 二维数组

含义

一组类型相同的变量集合,数组属于引用数组类型,所以使用前必须实例化(开辟空间)。

元数据

跟标准Java对象差不多,但它多了一个元数据,用来表示数组大小;
数组最大尺寸是2^32 = 2147483648,但会拿8字节来存储长度等元数据,所以数组大小是Integer.MAX_VALUE-8,
元数据包括:
Class:描述对象类型的类信息的指针。
Flag:描述对象状态的标志集合,包括对象散列码、形状(对象是否是数组)。
Lock:对象同步信息(对象当前是否同步)。
Size:数组大小。

内存空间

简单复习一下,
堆:存储Java对象和数组,动态分配内存空间(因此存取慢)。
栈:存储基本数据类型和对象应用。(数据大小和作用范围明确,存取快,仅次于寄存器,但不灵活。)
Java基础——数组_第1张图片
声明了一个名为arr的int类型数组,并给数组赋值[6,3,5],

索引、数组大小

索引是从0开始的。
获取数组长度要通过:

	int len = arr.length;

如果试图访问范围以外的元素,会抛出异常:

	java.lang.ArrayIndexOutOfBoundsException

创建

数组一旦初始化后,其所占内存空间、数组长度都是不可变的。

先声明后初始化

声明了一个数组,并开辟了相应大小的空间。
这种方式创建的数组,其初始化又称为动态初始化,因为在声明语句中,系统为数组元素分配了默认值。

		int[] arr = new int[5];// 也是new int[5]{};
        arr[0]=3;
        arr[1]=9;
        System.out.println(Arrays.toString(arr));

        String[] arrS = new String[5];
        arrS[0]="h";
        arrS[1]="e";
        System.out.println(Arrays.toString(arrS));

我声明了一个int型数组跟一个String类型的数组,注意到并没有全部初始化,那么默认值会是什么呢:

[3, 9, 0, 0, 0]
[h, e, null, null, null]

我们看到打印结果,int的默认是0,String的默认是null,那么就是说默认初始化值跟数组元素的数据类型有关。

声明并初始化

这种方式的初始化又称为静态初始化,因为程序员显式的给每个元素指定初始值了,系统根据元素个数来确定数组长度。

	int[] a = new int[]{5, 4, 6, 9, 3, 1, 2, 8, 7, 9, 5};

arr[ ]和arr[ ]{}的区别

我们试着打印一下,两者都像使用默认值来初始化,但实际是什么样的呢?

int[] arr = new int[5];
int[] test = new int[]{};

输出:

[0, 0, 0, 0, 0]
[]

嗯?怎么区别还挺大,其实没什么神奇或者特别之处,第一个好理解,创建了大小为5的,元素类型是int的数组,默认值都是0,这没问题。
那么第二个呢?
我们看到它没有指定数组大小,因为这种写法,其实就是程序员自己指定数组元素,数组长度则是系统根据数组大小来定的,但我们看到了,没给数组指定有意义的元素,所以打印出来数组不是null,但是也没有东西,而且长度是0。

打印数组

1、

		for(int i = 0; i < a.length; i++){
            System.out.print(a[i] + ",");
        }

2、

		for(int i : a){
            System.out.print(i + ",");
        }

3、

	System.out.println(Arrays.toString(a));

二维数组

不常用,简单说下,其实跟一维数组很多东西都相似的。

		int[][] arr = new int[5][3];  // 5行 3列
        int[][] arr1 = new int[][]{{5}, {7, 9}, {0, 6, 8}};  // 3行 3列,但不完全是

0 0 0
0 0 0
0 0 0
0 0 0
0 0 0

5
7 9
0 6 8
如果尝试访问arr1[0][1]会抛出异常,提示下标越界。

你可能感兴趣的:(Java,java,数组,内存分配,元数据,初始化)