问题描述
public class Arraytest{ public static void main( String[] args) { String[] str1 = new String[3]; str1[0] = new String("tian"); str1[1] = new String("kong"); str1[2] = new String("nan"); String[] str2 = new String[3]; System.arraycopy( str1, 0, str2, 0, str1.length); str2[2] = "fengyun"; //这一行 System.out.println(str1[2]); System.out.println(str2[2]); }}刚学java, 学到了数组这个程序我是这样理解的, 见图那么我觉得复制了之后str1[2]和str2[2]应该指向同一个位子nan那里呀,为什么改变了 str2[2]的值,str1[1]的值没有变呢 ,求帮忙解解惑,
解决方案
[size=xx-large][size=x-large][size=large][size=medium]arraycopy是对数组进行浅拷贝,因此str2拷过去的是str1里面的引用,但是当给str2[2]赋值时,那时候str2[2]里面的引用改变了,然而str1[2]的引用依然是之前copy过去的引用。[/size][/size][/size][/size]
解决方案二:
引用复制了之后,str1[2]和str2[2]指向同一个引用不是指向同个引用,是两个引用指向同个String。str2[2] = "fengyun"; 这句,只是把str2中引用指向了新的String。所以str1的没有变化。
解决方案三:
arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。你的代码System.arraycopy( str1, 0, str2, 0, str1.length); 是把str1[] 从0开始复制到str2[]0结束str2[2]的值改变了是因为:str2[2] = "fengyun"; str1[1]没有任何操作,是不会变的