有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何保存函数内部的数组更改?

我需要创建一个使用静态泛型方法处理数组的类。例如,在这个函数中,我需要将一个数组(arr2)粘贴到另一个数组(arr1)的某个索引(位置)中

public static<T> void paste(T[] arr1, int place, T[] arr2) {
        Object[] temp = new Object[arr1.length + arr2.length];
        System.arraycopy(arr1, 0, temp, 0, place);
        System.arraycopy(arr2, 0, temp, place, arr2.length);
        System.arraycopy(arr1, place, temp, place+arr2.length, arr1.length-place);

        arr1 = (T[])temp;
    }

该功能工作正常,但我看不到主功能的变化。结果始终保留在粘贴函数中。在这种情况下我能做什么

public static void main(String[] args) {
        Integer arr[] = {1 ,2 ,3 ,4, 5};
        Integer arr2[] = {11 ,22 ,33 ,44, 55};

        paste(arr, 2, arr2);
        show(arr);

    }

共 (2) 个答案

  1. # 1 楼答案

    不能修改现有数组的长度。因此,paste方法必须返回新数组:

    public static<T> T[] paste(T[] arr1, int place, T[] arr2) {
        ...
    
        return temp;
    }
    

    然后,在main方法中,将返回值分配给一个新变量并使用它:

    T[] result = paste(arr, 2, arr2);
    show(result);
    

    当然,您也可以将返回值分配给现有变量,即:

    arr = paste(arr, 2, arr2);
    show(arr);
    

    为什么它不能像你尝试过的那样工作:

    如果在paste方法中重新分配arr1,则不会影响调用方法。它只会更改方法中的局部变量(实际上是一个参数值)。调用方法(main)中的引用不能从另一个方法中更改


    关于泛型数组的实例化:

    可以使用反射实例化“正确”类型的数组(而不是Object数组):

    T[] temp = (T[]) Array.newInstance(arr1.getClass().getComponentType(), arr1.length + arr2.length);
    

    请注意,您仍然需要强制转换,但数组的运行时类型将与arr1的类型相同

  2. # 2 楼答案

    当您传递arr1时,您传递的是数组指针的副本。在使用此指针副本的方法内部,而不是使用来自外部方法的原始指针。当您将temp分配给arr1时,您是将其分配给副本而不是原始数组,原始数组仍然指向另一个数组

    public static<T> T[] paste(T[] arr1, int place, T[] arr2) {
      // your code here
    return temp;
    }
    

    如果您不想更改方法的签名,这是正确的做法。但如果我们出于某种原因假设你不想这么做。然后,需要改变作为参数传递的实际数组。在您的特定示例中,您不能这样做,因为arr1和arr2都没有足够的大小。但这将是一种更具程序性的解决方案

    改变其参数的过程示例:

    public void mutationProcedure(int array[],int position, int changeToValue) {
        array[position] = changeToValue;
    }
    

    在这段代码中,如果我们从数组外部调用它,它的值将发生变化

    更新:无需显式转换的解决方案。我相信这是更好的解决办法

    public static<T> T[] paste(T[] arr1, int place, T[] arr2) {
            T[] temp = Arrays.copyOf(arr1, arr1.length + arr2.length);
            System.arraycopy(arr2, 0, temp, place, arr2.length);
            return temp;
    }
    

    首先,我们创建一个新数组,从arr1开始,大小等于两个数组。 然后我们将第二个数组从数组1的末端复制到另一端。因为Arrays类与泛型一起工作,所以我们不需要显式强制转换