1

我想将一个数组传递给一个方法,但我知道数组是通过引用传递的,所以原始数组被修改了。我发现的一种解决方法是在方法内创建数组的副本,然后修改副本,但是传递数组副本的最佳方法是什么,或者在方法内创建副本会更好。这是我的代码,看看 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;     
    }

}
4

3 回答 3

1

您可以创建数组的副本,从而避免编辑原始数组,

  1. System.arraycopy(srcArray, 0, destArray 0, srcArray.length);
  2. srcArray.clone()
于 2012-10-30T19:57:20.567 回答
1

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

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

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

于 2012-10-30T19:58:51.133 回答
0

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

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

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

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

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

于 2012-10-30T19:55:53.847 回答