Java|Java基础——数组


文章目录

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

含义 一组类型相同的变量集合,数组属于引用数组类型,所以使用前必须实例化(开辟空间)。
元数据 跟标准Java对象差不多,但它多了一个元数据,用来表示数组大小;
数组最大尺寸是2^32 = 2147483648,但会拿8字节来存储长度等元数据,所以数组大小是Integer.MAX_VALUE-8,
元数据包括:
Class:描述对象类型的类信息的指针。
Flag:描述对象状态的标志集合,包括对象散列码、形状(对象是否是数组)。
Lock:对象同步信息(对象当前是否同步)。
Size:数组大小。
内存空间 简单复习一下,
堆:存储Java对象和数组,动态分配内存空间(因此存取慢)。
栈:存储基本数据类型和对象应用。(数据大小和作用范围明确,存取快,仅次于寄存器,但不灵活。)
Java|Java基础——数组
文章图片

声明了一个名为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
【Java|Java基础——数组】5
7 9
0 6 8
如果尝试访问arr1[0][1]会抛出异常,提示下标越界。