目录
1.数组的初始化
数组的初始化主要分为动态初始化以及静态初始化
1.1 动态初始化
在创建数组时,直接指定数组中元素的个数
int[] array = new int[5];
1.2 静态初始化
在创建数组时不直接指定数据元素个数,而直接将具体的数据内容进行指定
int[] array = {1, 2, 3};
两种初始化方式没有本质区别,只是书写上的差异。
【注意事项】
- 静态初始化虽然没有指定数组的长度,编译器在编译时会根据{}中元素个数来确定数组的长度。
- 静态初始化时, {}中数据类型必须与[]前数据类型一致。
- 静态初始化可以简写,省去后面的new 类型[]。
2. 数组遍历的方法
数组的长度该如何求解?
如果是C语言的话,需要调用strlen库函数,但是Java不需要。Java中计算数组长度的方法是 数组名 + .length
使用 for-each 遍历数组
for each:又叫增强for循环,for each在遍历的时候无法拿到数组的下标。
public static void main(String[] args) {
int[] arr = {10, 20, 30};
for (int x: arr) {
System.out.println(x + " ");
}
}
3. 数组转字符串
这里需要用到 Arrays 这个方法,而 Arrays 是Java里自带的一个方法。
这个方法在使用的时候需要提供一个包:
import java.util.Arrays;
public static void main(String[] args) {
int[] arr = {10, 20, 30};
String ret = Arrays.toString(arr);
System.out.println(ret);
}
4. 理解数组是一种引用数据类型
4.1 引用类型
引用数据类型创建出来的变量,称为对象的引用,引用中存储了对象的地址。
public static void main(String[] args) {
int a = 1;
int b = 2;
int[] array = {1, 2, 3};
}
array 是一个引用。array 这个引用,指向一个对象,并且存了一个对象的地址。
从上图可以看到,引用变量并不直接存储对象本身,可以简单理解成存储的是对象在堆中空间的起始地址。通过该地址,引用变量便可以去操作对象。
4.2 空引用 null
null 在 Java 中表示 "空引用" , 也就是一个不指向对象的引用
null 的作用类似于 C 语言中的 NULL (空指针), 都是表示一个无效的内存位置. 因此不能对这个内存进行任何读写操作。在一些程序中要判断是不是空引用来防止报错。
5.数组的应用场景
作为函数的参数
public static void func1(int[] arr) {
arr = new int[10];
}
public static void func2(int[] arr) {
arr[0] = 99;
}
public static void main(String[] args) {
int[] array = {1,2,3,4};
func1(array);
System.out.println(Arrays.toString(array));
func2(array);
System.out.println(Arrays.toString(array));
}
func1方法:改指向的对象
array 传给func1后,本来arr也会指向array,arr中存放的也会是array的地址;但是func1重新开辟了一块新的空间,arr也就指向了这块空间。由于是两块不同的空间,形参指向的改变不会影响实参的打印,数组的值不会改变,输出 1 2 3 4。
func2方法:改指向对象的内容
func2改变了指向的内容(数组下标为0的值),指向并没有改变,这个时候输出数组,值也会改变。输出 99 2 3 4
总结:
所谓的 "引用" 本质上只是存了一个地址. Java 将数组设定成引用类型, 这样的话后续进行数组参数传参, 其实只是将数组的地址传入到函数形参中. 这样可以避免对整个数组的拷贝(数组可能比较长, 那么拷贝开销就会很大).
6.二维数组
6.1 理解二维数组是特殊的一维数组
二维数组的每一个元素都是一个一位数组。
public class Exercise {
public static void main(String[] args) {
int[][] array = { {1, 2, 3}, {4, 5, 6} };
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
System.out.print(array[i][j] + " ");
}
System.out.println();
}
}
}
6.2 理解不规则数组
不规则数组指的是二维数组的列可以省略,行不可以省略。
public class Exercise {
public static void main(String[] args) {
int[][] array = new int[2][];//数组有两行
array[0] = new int[20];//第一行有20个元素
array[1] = new int[10];//第二行有10个元素
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
System.out.print(array[i][j] + " ");
}
System.out.println();
}
}
}
可以看到当二维数组的列省略后,可以对列进行指定大小。这就造成了每一行的元素可以是不同的数量,也就是每一行列的数量不同。视觉上看上去就是一种不规则的二维数组。