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);
}
# 1 楼答案
不能修改现有数组的长度。因此,
paste
方法必须返回新数组:然后,在
main
方法中,将返回值分配给一个新变量并使用它:当然,您也可以将返回值分配给现有变量,即:
为什么它不能像你尝试过的那样工作:
如果在
paste
方法中重新分配arr1
,则不会影响调用方法。它只会更改方法中的局部变量(实际上是一个参数值)。调用方法(main
)中的引用不能从另一个方法中更改关于泛型数组的实例化:
可以使用反射实例化“正确”类型的数组(而不是
Object
数组):请注意,您仍然需要强制转换,但数组的运行时类型将与
arr1
的类型相同# 2 楼答案
当您传递
arr1
时,您传递的是数组指针的副本。在使用此指针副本的方法内部,而不是使用来自外部方法的原始指针。当您将temp分配给arr1
时,您是将其分配给副本而不是原始数组,原始数组仍然指向另一个数组如果您不想更改方法的签名,这是正确的做法。但如果我们出于某种原因假设你不想这么做。然后,需要改变作为参数传递的实际数组。在您的特定示例中,您不能这样做,因为arr1和arr2都没有足够的大小。但这将是一种更具程序性的解决方案
改变其参数的过程示例:
在这段代码中,如果我们从数组外部调用它,它的值将发生变化
更新:无需显式转换的解决方案。我相信这是更好的解决办法
首先,我们创建一个新数组,从arr1开始,大小等于两个数组。 然后我们将第二个数组从数组1的末端复制到另一端。因为Arrays类与泛型一起工作,所以我们不需要显式强制转换