什么是在java中传递数组的最佳方法

时间:2012-10-30 19:50:23

标签: java arrays reference

我想将数组传递给方法,但我知道数组是通过引用传递的,因此原始数组会被修改。我找到的解决方法是在方法内创建数组的副本然后修改副本,但是传递数组副本的最佳方法是什么,或者最好在方法内创建副本。这是我的代码 看一下ArrayUtils类中的reverse方法

package com.javablackbelt.utils;

import java.util.ArrayList;
import java.util.Arrays;

public class ListUtils {

    public static void main(String arg[]) {
        String[] arr = {"one", "two", "three", "four", "five"};
        ArrayUtils.print(arr);

        System.out.println();

        String [] reversedArr = ArrayUtils.reverse(arr);
        ArrayUtils.print(reversedArr);

        System.out.println();

        ArrayList<String> list = ArrayUtils.toArrayList(arr);
        ListUtils.print(list);      

    }

    public static void print(ArrayList<String> aStr) {
        System.out.print("list: [ ");
        for(String l: aStr)
            System.out.print(l+" ");
        System.out.println(" ] size: "+aStr.size());
    }

}

package com.javablackbelt.utils;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.ArrayList;

public class ArrayUtils {

    public static void print(String[] arr) {
        System.out.print("Array: [ ");
        for(String str: arr) {
            if(str != null) 
                System.out.print(str.toString()+" ");
        }
        System.out.print(" ] size: "+arr.length);
    }

    public static String[] reverse(String[] arr) {
        String[] a = arr;

        List<String> list = Arrays.asList(a);

        Collections.reverse(list);

        String[] newArr = (String[]) list.toArray();

        return newArr;
    }

    public static ArrayList<String> toArrayList(String[] arr) {

        ArrayList<String> arrList = new ArrayList<String>();

        for(int i = arr.length-1; i >= 0; i--)
            arrList.add(arr[i]);
        return arrList;     
    }

}

3 个答案:

答案 0 :(得分:1)

您可以创建数组的副本,因此可以保存以免编辑原始数组

  1. System.arraycopy(srcArray,0,destArray 0,srcArray.length);
  2. srcArray.clone()

答案 1 :(得分:1)

没有最好的答案。有时修改传递的数组是正常的(例如,Arrays.sort()),有时则不是。关键是记录方法,让呼叫者尊重合同。

我会发现一个方法返回一个输入数组的转换数组以保持输入数组不被修改是正常的,我发现在将数组传递给这样一个方法之前必须创建副本是不好的,以防万一。有了清晰的文档,毫无疑问。

集合通常应优先于数组。使用集合,您不必创建副本来保护自己。您可以将集合包装在未经修改的集合中:Collections.unmodifiableList(list)

答案 2 :(得分:0)

您必须复制数组。有几种方法可以实现,但由于这个原因,使用实际对象(如ArrayList对象而不是'原始'数组)通常更容易:

String[] myPrimitiveArrayOfStrings;
ArrayList<String> myObjectArrayOfStrings = new ;

后一种方法(使用'generics')在您使用阵列方面提供了很大的灵活性。它使排序,搜索,扩展数组中的对象以及其他许多事情变得更加容易。

也就是说,Array类为您提供了一些实用程序。

对于记录,Java对象不是通过引用传递,而是通过引用值传递。这意味着复制了指向对象的指针。如果删除原始指针,则该指针仍然存在。只有删除了所有指针后,才会对对象进行垃圾回收。