Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';在java中传递数组的最佳方法是什么_Java_Arrays_Reference - Fatal编程技术网

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

什么';在java中传递数组的最佳方法是什么,java,arrays,reference,Java,Arrays,Reference,我想把一个数组传递给一个方法,但我知道数组是通过引用传递的,所以原始数组会被修改。我发现的一个解决方法是在方法内创建数组的副本,然后修改副本,但是传递数组副本的最佳方法是什么,或者最好在方法内创建副本。这是我的密码 看看ArrayUtils类中的反向方法 package com.javablackbelt.utils; import java.util.ArrayList; import java.util.Arrays; public class ListUtils { publ

我想把一个数组传递给一个方法,但我知道数组是通过引用传递的,所以原始数组会被修改。我发现的一个解决方法是在方法内创建数组的副本,然后修改副本,但是传递数组副本的最佳方法是什么,或者最好在方法内创建副本。这是我的密码 看看ArrayUtils类中的反向方法

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;     
    }

}
package com.javablackbelt.utils;
导入java.util.ArrayList;
导入java.util.array;
公共类列表{
公共静态void main(字符串arg[]){
字符串[]arr={“一”、“二”、“三”、“四”、“五”};
ArrayUtils.打印(arr);
System.out.println();
字符串[]reversedArr=ArrayUtils.reverse(arr);
ArrayUtils.打印(反转DARR);
System.out.println();
ArrayList=ArrayUtils.toArrayList(arr);
ListUtils.print(列表);
}
公共静态无效打印(ArrayList aStr){
系统输出打印(“列表:[”);
用于(字符串l:aStr)
系统输出打印(l+“”);
System.out.println(“]size:+aStr.size());
}
}
包com.javablackbelt.utils;
导入java.util.array;
导入java.util.Collections;
导入java.util.List;
导入java.util.ArrayList;
公共类数组{
公共静态无效打印(字符串[]arr){
System.out.print(“数组:[”);
用于(字符串str:arr){
如果(str!=null)
System.out.print(str.toString()+);
}
系统输出打印(“]尺寸:“+arr.length”);
}
公共静态字符串[]反向(字符串[]arr){
字符串[]a=arr;
List=Arrays.asList(a);
收款。反向(列表);
String[]newArr=(String[])list.toArray();
返回newArr;
}
公共静态ArrayList到ArrayList(字符串[]arr){
ArrayList arrList=新的ArrayList();
对于(int i=arr.length-1;i>=0;i--)
添加(arr[i]);
返回列表;
}
}

您必须复制阵列。有两种方法可以实现,但由于这个原因,使用实际对象(如对象)通常比使用“基本”数组更容易:

String[] myPrimitiveArrayOfStrings;
ArrayList<String> myObjectArrayOfStrings = new ;
String[]MyPrimitiveArrayOfString;
ArrayList myObjectArrayOfString=新建;
后一种方法(使用“泛型”)在如何利用数组方面为您提供了很大的灵活性。它使排序、搜索、扩展数组中的对象以及其他许多事情变得更加容易

也就是说,这门课提供了一些实用程序


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

您可以创建数组的副本,从而保存对原始数组的编辑

  • System.arraycopy(srcArray,0,destArray 0,srcArray.length)
  • srcArray.clone()

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

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


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

    您的要求是什么,不想修改原始数组吗?您的方式似乎很好。并且可能会缩短代码(对我们来说)。顺便说一句,数组不是通过引用传递的。它们是通过参考值传递的
    。请记住,Java中的所有内容都是按值传递的。@Rohit Jain我是这么想的,但对于数组,b/c的情况并非如此,原始数组正在被修改。。。。所以我要么传递引用的副本,要么传递对数组的引用引用引用没有改变,但是引用所持有的值正在改变。因此,最好在您的案例中创建数组的副本。