卤煮,你的代码里呢不是数组的长度变化的问题,而是各个数组地址指针变化的问题。
先说明一下数组初始化的问题:比如语句 String[] a = new String[]{"Hello","World","Yes"};
首先,声明数组引用变量,即String[] a,此时的a并不是一个数组对象,而只是一个相当于指针的变量;
然后,当我们执行new String[]{"Hello","World","Yes"}以后才真正创建了一个数组对象,此时变量a 才指向了堆内存里面的数组对象。- String[] books=new String[]{"java","Java EE","Ajax","XML"};
- String[] names={"孙悟空","猪八戒","唐僧"};
- String[] strArr = new String[5];
复制代码 在你的代码中,数组books和数组strArr都在内存中的站空间中有了指针变量来指向在内存堆空间中实例化了的对象,且指针变量中的值是实例化后的数组对象在内存堆空间中的数组首地址。所以要明确,books,names,strArr中存放的都是指针地址。但是names数组由于没有进行new操作,所以它的数组数据都是在栈空间中的。通过以下代码你可以查看出三个数组的指针地址是不一样的:- String[] books=new String[]{"java","Java EE","Ajax","XML"};
- System.out.println("booksAdressbefore:"+books);//结果:[Ljava.lang.String;@263c8db9
- String[] names={"孙悟空","猪八戒","唐僧"};
- System.out.println("namesAdress:"+names);//结果:[Ljava.lang.String;@517c804b
- String[] strArr = new String[5];
- System.out.println("strArrAdressbefore:"+strArr);<span style="line-height: 1.5;">//结果:</span>[Ljava.lang.String;@44cae5b8
复制代码 如果打印数组内容的话呢,此时的三个数组显示的都是各自指针变量指向的地址的内容。当你添加了语句 books=names; strArr=names;时,相当于你把数组names的指针变量中的地址值赋值给了books和strArr这两个地址指针变量,所以它们都指向了栈内存中的names数组,而它们原来指向的存在于堆内存中的数组是没有改变的,只不过是没有的地址指向,成了暂时的垃圾内存。所以这与不是原来的数组长度变化了,而是指针地址发生了变化。- System.out.println("namesAdress:"+names);//结果:[Ljava.lang.String;@517c804b
- books=names;
- System.out.println("booksAdressafter:"+books);//结果:[Ljava.lang.String;@517c804b
- strArr=names;
- System.out.println("strArrAdressafter:"+strArr);<span style="line-height: 1.5;">//结果:[Ljava.lang.String;@517c804b</span>
复制代码 通过这几条语句可以证实现在三个数组指针地址都一样,所以它们现在输出的数组内容也肯定是一样的,都是names的数组元素,现在当你修改books数组中的元素时,但books现在指向的是names数组的元素,所以你修改实际上是原来names数组中的元素。
|