在编程中,了解基本数据类型和引用数据类型的区别是非常重要的,这有助于我们更好地理解变量的存储方式和数据操作过程。数组作为一种常见的数据结构,在Java中扮演着重要的角色,掌握数组的基本用法和应用场景有助于我们更高效地处理数据和进行程序设计。此外,二维数组作为数组的延伸,也具有自己的特点和用法,深入理解二维数组可以拓展我们对数组的认识和应用能力。
基本数据类型创建的变量:称为基本变量,该变量空间中直接存放的是其所对应的值;
引用数据类型创建的变量:一般称为对象的引用,其空间中存储的是对象所在空间的地址。
public static void main() {
int a = 10;
int b = 20;
int[] arr = new int[]{1,2,3};
}
在上述代码中,a、b、arr,都是函数内部的变量,因此其空间都在main方法对应的栈帧中分配。a、b是内置类型的变量,因此其空间中保存的就是给该变量初始化的值。
array是数组类型的引用变量,其内部保存的内容可以简单理解成是数组在堆空间中的首地址。
引用变量并不直接存储对象本身,可以简单理解成存储的是对象在堆中空间的起始地址。通过该地址,引用变量便可以去操作对象。有点类似C语言中的指针,但是Java中引用要比指针的操作更简单。
public static void func() {
int[] array1 = new int[3];
array1[0] = 10;
array1[1] = 20;
array1[2] = 30;
int[] array2 = new int[]{1,2,3,4,5};
array2[0] = 100;
array2[1] = 200;
array1 = array2;
array1[2] = 300;
array1[3] = 400;
array2[4] = 500;
for (int i = 0; i < array2.length; i++) {
System.out.println(array2[i]);
}
}
null 在 Java 中表示 “空引用” , 也就是一个不指向对象的引用
int[] arr = null;
System.out.println(arr[0]);
// 执行结果
Exception in thread "main" java.lang.NullPointerException
at Test.main(Test.java:6)
null 的作用类似于 C 语言中的 NULL (空指针), 都是表示一个无效的内存位置. 因此不能对这个内存进行任何读写操作. 一旦尝试读写, 就会抛出 NullPointerException.
public static void main(String[] args) {
int[] array = {1, 2, 3};
for(int i = 0; i < array.length; ++i){
System.out.println(array[i] + " ");
}
}
传参基本数据类型:
public static void main(String[] args) {
int num = 0;
func(num);
System.out.println("num = " + num);
}
public static void func(int x) {
x = 10;
System.out.println("x = " + x);
} // 执行结果
x = 10
num = 0
在func方法中修改形参 x 的值, 不影响实参的 num 值
传参数组类型(引用类型)
public static void main(String[] args) {
int[] arr = {1, 2, 3};
func(arr);
System.out.println("arr[0] = " + arr[0]);
}
public static void func(int[] a) {
a[0] = 10;
System.out.println("a[0] = " + a[0]);
} // 执行结果
a[0] = 10
arr[0] = 10
func方法内部修改数组的内容, 方法外部的数组内容也发生改变.
因为数组是引用类型,按照引用类型来进行传递,是可以修改其中存放的内容的。
作为函数的返回值:
//斐波那契数组
public static int[] fib(int n){
if(n <= 0){
return null;
} int[] array = new int[n];
array[0] = array[1] = 1;
for(int i = 2; i < n; ++i){
array[i] = array[i-1] + array[i-2];
}
return array;
}
public static void main(String[] args) {
int[] array = fib(10);
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
所谓的 “引用” 本质上只是存了一个地址. Java 将数组设定成引用类型, 这样的话后续进行数组参数传参, 其实只是将数组的地址传入到函数形参中. 这样可以避免对整个数组的拷贝(数组可能比较长, 那么拷贝开销就会很大)
二维数组本质上也就是一维数组, 只不过每个元素又是一个一维数组。可以理解成二维数组是一维数组的数组。
数据类型[][] 数组名称 = new 数据类型 行数{ 初始化数据 }; 行数不可省略,列数可以省略
二维数组的用法和一维数组并没有明显差别
public static void main(String[] args) {
int[][] array = new int[2][3];
array[0] = new int[] {1,2,3};
array[1] = new int[] {4,5,6};
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[0].length; j++) {
System.out.print(array[i][j]+" ");
}
System.out.println();
}
for (int[] num : array) {
for (int x: num) {
System.out.print(x+" ");
}
}
System.out.println();
System.out.println(Arrays.deepToString(array));
}
通过学习基本数据类型和引用数据类型的区别,我们能够更清晰地理解变量在内存中的存储方式,以及对数据的操作方式。数组作为一种重要的数据结构,在不同场景下具有不同的应用方式,包括保存数据、作为方法参数传递和作为函数返回值等。二维数组则是一种在一维数组基础上延伸出的数据结构,通过理解二维数组的概念和基本语法,我们可以更灵活地处理多维数据。