今天,在编写一个简单的程序时,我发现了一些奇怪的行为。 我编写了简单的排序方法,其中返回另一个排序数组。
public double[] sortMe(double[] array)
{
double[] narray=new double[array.length];
narray=array;
for(int i=0;i<narray.length;i++)
{
for(int j=0;j<narray.length;j++)
{
if(narray[i]<narray[j])
{
double temp=narray[i];
narray[i]=narray[j];
narray[j]=temp;
}
}
}
// TODO Auto-generated method stub
return narray;
}
在我的驱动程序类中,当我调用此sortMe方法时,它也更新了我的testArray。由于testArray超出了sortMe方法的范围,那么当testArray被排序?
double [ ] testArray = {3, 6, 2, 5, 8, 4, 1, 7};
double [ ] results;
results = af.sortMe(testArray);
af.printMe(results);
答案 0 :(得分:0)
在sortMe
方法中,您使用array
将narray
的引用分配给narray=array;
。
这意味着现在narray
指向与array
相同的数组,因此如果修改narray
,数组也会更改,因为数组只引用{{1}传递给方法,testArray
也被排序。
如果您不想更改testArray,则在将testArray
分配给array
时,请使用narray
将System.arraycopy()
的值复制到array
。如下所示进行更改。
narray
答案 1 :(得分:0)
您认为这些界限如何:
double[] narray=new double[array.length];
narray=array;
它创建一个新数组,然后立即将其丢弃,并为参数数组分配相同的实例。
如果要返回一个新数组,可以在构造函数中使用它,也可以手动将数组A中的字段复制到数组B.由于您正在进行排序,您甚至可能根本不需要这样做。