Java数组:Java通过引用传递并按值传递?

时间:2013-10-07 08:30:07

标签: java pass-by-reference pass-by-value

我试图反转一个Bitmap数组,而不修改源数组。但问题是源阵列也正在逆转。我做错了什么,或者我想以其他方式做错? 谢谢你的帮助。

private GalleryAdapter galleryAdapter;
private ReverseGalleryAdapter rGalleryAdapter;  

public void onCreate(Bundle savedInstanceState) {
    galleryAdapter = new GalleryAdapter(this, imageThumbnails, imagePaths,
            videoThumbnails, videoPaths);

    imagegrid.setAdapter(galleryAdapter);

    rGalleryAdapter = new ReverseGalleryAdapter(this, reverseBArray(videoThumbnails), reverseSArray(videoPaths),
            reverseBArray(imageThumbnails), reverseSArray(imagePaths));

    imagegrid2.setAdapter(rGalleryAdapter);
}

private Bitmap[] reverseBArray(Bitmap[] v){
    Bitmap[] bTemp;
    bTemp = v;
    int len = bTemp.length;
    Bitmap temp;
    for (int i = 0; i < len/2; i++)
    {
        temp = bTemp[i];
        bTemp[i] = bTemp[len-1 - i];
        bTemp[len-1 - i] = temp;
    }
    return bTemp;
}

private String[] reverseSArray(String[] s){
    String[] sTemp;
    sTemp =s;
    int len = sTemp.length;
    String temp;
    for (int i = 0; i < len/2; i++)
    {
        temp = sTemp[i];
        sTemp[i] = sTemp[len-1 - i];
        sTemp[len-1 - i] = temp;
    }
    return sTemp;
}

5 个答案:

答案 0 :(得分:3)

 Bitmap[] bTemp;
 bTemp = v;

当你这样做时,defenitley都引用同一个数组,因为你没有在那里创建一个新数组。

这里也发生了同样的事情

  String[] sTemp;
    sTemp =s;

可能的消息:Make copy of array Java(建议在阅读可能的方法后选择)。

我的建议来自Official docs :(请参阅复制数组部分)

  

System类有一个arraycopy()方法,可以用来有效地将数据从一个数组复制到另一个数组中:

public static void arraycopy(Object src, int srcPos,
                             Object dest, int destPos, int length)

答案 1 :(得分:2)

使用bTemp = v;,您指的是同一个Object

您可以使用clone()方法制作数组副本:

bTemp = v.clone();

然后你可以自由修改并返回它。

答案 2 :(得分:0)

记住数组是对象,在方法reverseArray中,你重新指定对temp的引用,所以现在你有2个引用(v和temp)到同一个对象。进行下面提到的适当更改

private Bitmap[] reverseBArray(Bitmap[] v){
    Bitmap[] bTemp;
    bTemp = v; // CHANGE IT to bTemp = new Bitmap[v.length]
    int len = bTemp.length;
    Bitmap temp;
    for (int i = 0; i < len/2; i++)
    {
        temp = bTemp[i];
        bTemp[i] = bTemp[len-1 - i];
        bTemp[len-1 - i] = temp;
    }
    return bTemp;
}

答案 3 :(得分:0)

我认为你想保持两个对象都正确吗? 如果是这样,我认为您可以使用clone()方法并将该克隆对象传递给方法而无需修改原始对象

答案 4 :(得分:-1)

Java没有按值传递对象。您将数组对象引用传递给您的方法,从而将数组本身传递给您。最好的方法是创建数组的副本并传递数组的副本。