文章目录
- 含义
- 元数据
- 内存空间
- 索引、数组大小
- 创建
-
- 先声明后初始化
- 声明并初始化
- arr[ ]和arr[ ]{}的区别
- 打印数组
- 二维数组
含义 一组类型相同的变量集合,数组属于引用数组类型,所以使用前必须实例化(开辟空间)。
元数据 跟标准Java对象差不多,但它多了一个元数据,用来表示数组大小;
数组最大尺寸是2^32 = 2147483648,但会拿8字节来存储长度等元数据,所以数组大小是Integer.MAX_VALUE-8,
元数据包括:
Class:描述对象类型的类信息的指针。
Flag:描述对象状态的标志集合,包括对象散列码、形状(对象是否是数组)。
Lock:对象同步信息(对象当前是否同步)。
Size:数组大小。
内存空间 简单复习一下,
堆:存储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]会抛出异常,提示下标越界。
推荐阅读
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])