本文讨论Java数组中的赋值问题。 在讨论这个问题之前必须了解一件事。 Java的数组到底是什么? 是班级,对象,还是什么其他奇怪的东西? 答案是Java中的数组本质上是对象但这个对象不是由类实例化的,而是由JVM创建的。 也就是说,很容易说明可以通过arr.length直接访问数组对象arr的数组长度。
因为Java发现数组本质上是一个对象,所以让我们来看看这样的代码是否合理。
int [ ] a={ 1,2,3 }; int[] b=new int[3]; b=a; for(intI=0; i a.length; I ) a(I )=0;
我们本来的想法是将a数组的值代入b,将a数组设为零,但我们看到a、b数组都设为零。
数组的本质是对象,所以让我们分析一下这两个代码在Java内存模型中的作用。
int [ ] a={ 1,2,3 }; 时,将生成与堆中的对象相对应的对象,其中a指向该对象,int[] b=new int[3]; 的时候,b也指向这个对象。 例如,当我们对a[0]进行修改时,实际上我们对堆中的对象进行了修改。 b数组指向此堆中的对象。 当然,b数组的值也发生了变化。
如这里所表明的,这样实际上不太合理,比较两个引用指向同一个堆中的对象,一个修改必然导致另一个修改。
那么数组赋值该怎么办呢?
一、使用for循环
int [ ] a={ 1,2,3 }; int[] b=new int[3]; for(intI=0; ia.length; I ) b(I )=a(I ); 这样可以代入操作,虽然柔软性好,但是效率是个问题。
二、使用Object的clone()
既然数组的本质是对象,他就有clone ()方法。 clone (可以使用方法复制。
int [ ] a={ 1,2,3 }; int[]b=(int[] ) a.clone ); //strong制类型转换三、使用System的静态方法arraycopy()
System提供了以下静态方法arraycopy () :
publicstaticvoidarraycopy (对象src、int srcPos、对象dest、int destPos、int length ) )。
src:源数组
srcPos:源数组的复制开始位置
dest:数组
destPos:排列配置的开始位置
长度:复制长度
你可以用它在数组之间复制:
int [ ] a={ 1,2,3 }; int[] b=new int[3]; system.arraycopy(a,0,b,0,3 ); 该方法效率高,且具有一定的灵活性。 基于数组实现的Java集合类的基础大多在复制数组时使用此方法。