Java数组详解
以下内容为本人学习数组时的一些理解,如有错误,请大佬指正
Java虽然去除了C语言的指针,但在数组中依然能见到一些指针的影子
- **Java中数组是一个对象,一定要与保存数组的空间分开看待。**可以理解为数组名就是C语言中的指针,声明数组视为创建这样一个指针,创建内存空间为把这个指针指向这个保存数组的地址。这样理解的话就可以比较容易的理解以下Java数组的一些特性。
int[] a;//声明一个数组
a=new int[4];//给这个数组创建一个内存空间
- Java中数组作为方法参数时为引用传参,即在方法中操作数组会影响到实参数组
可以理解为传参时创建的形式参数类似与指针,指向实参传过来的数组地址
public static void test(int[] a){//可以理解为与C语言一样,此处的形参a为一个指针,传参后该指针指向传过来的实参数组地址
}
- Java数组作为方法的返回值时返回的也是“指针”而非地址
public static void test(int[] a){
return a;//此处返回的a相当于返回a指针
}
如果把这个函数返回值赋给一个数组则该数组会指向函数返回值指向的地址:以上方所写函数为例:
int[] a={1,2,3};
int[] b={4,5,6,7};
b=test(a);//此时b指向了a的地址
此时test(a)返回了指向a地址的“指针”,这个返回值赋给了b,故数组b也指向了数组a的地址,即没有任何引用(数组)指向原来b的地址。此时a与b指向相同的数组地址,若改变数组a的元素,数组b也会随之改变(因为a与b指向相同的数组地址)
- Java空间的回收机制:这里只讨论与数组有关的
Java每隔一段时间就会检查一遍内存空间,没有引用(数组)指向的空间会被回收(如3中的数组b原先指向的空间)
详见JVM GC回收机制
- Java中在方法中创建的内存空间(此处仅针对数组)是真实存在的,虽然真实原理比较复杂,但其机制可以理解为:方法中创建了一个数组,方法中为这个数组创建了一个内存空间,方法结束后这个数组(引用)被回收,而这个空间由于没有引用指向它,一段时间后会被JVM GC机制回收。但若这个空间作为返回值,则会有实参的数组(引用)指向它,那么这个空间就不会被回收,而可以继续在实参中被调用。以下给出实验步骤作为参考:
public class Demo {
public static void main(String[] args) {
int[] a=new int[4];
a=test(a);
}
public static int[] test(int[] a){
int[] b=new int[6];
return b;
}
}
上述程序中test(a)返回了一个新的地址(即方法中新创建的b的空间),此时a会指向新返回的空间(可以通过a.length检验)a原来的空间就没有被引用指向了,一段时间后会被回收
上述原理仅便于理解,细节难免会有错误,烦请大佬指正
- Java数组的互换:一样可以用“指针”来理解其中的原理
Java中可以直接对两个数组进行赋值操作,原理与3中的原理类似
int[] a={1,2,3};
int[] b={4,5,6,7};
b=a;//此时b指向了a的地址(把a,b都视为指针就十分便于理解了)
此时a和b指向了同一地址,原来b的地址就没有被引用指向了
由此可以简单的交换数组:
int[] a={1,2,3};
int[] b={4,5,6,7};
int[] c;//c可以只声明,不分配空间,相当于只创建了一个指针
c=a;
a=b;
b=c;
上述程序通过中间数组c可以交换a与b数组(无论a,b数组空间大小)
- Java中数组的比较:
对于数组a和b,只能有如下比较
a==b
若a和b指向同一地址,则返回true,否则返回false
- Java字符串String类型本质为字符数组,后期被人为封装成一个数据类型。Java中String类型没有结束符,大小会自动计算。