为什么不能在 Java 中通过引用调整数组大小?
Why can't arrays be resized by reference in Java?
我在玩数组并以不同的方式操纵它们,我偶然发现了一些非常奇怪的行为!我最初关心的是将一个数组替换为另一个大小可能不同也可能不同的数组,因为它将从任意长度的文件中读取。我决定尝试不同的东西,看看会发生什么。我的第一次尝试是这样的:
public class RewriteArray {
public static void main(String[] args) {
String[] arr = { "1", "2", "3"};
System.out.print("Before rewrite: ");
for (String str : arr)
System.out.print(str + " ");
System.out.println();
changeArr(arr);
System.out.print("After rewrite: ");
for (String str : arr)
System.out.print(str + " ");
System.out.println();
}
private static void changeArr(String[] arr) {
arr[0] = "3";
arr[1] = "2";
arr[2] = "1";
}
}
这符合我的预期,通过引用对象证明了更改,并给出了输出:
Before rewrite: 1 2 3
After rewrite: 3 2 1
然后我尝试在 changeArr
方法中调整数组的大小,那时事情变得很奇怪。
public class RewriteArray {
public static void main(String[] args) {
String[] arr = { "1", "2", "3"};
System.out.print("Before rewrite: ");
for (String str : arr)
System.out.print(str + " ");
System.out.println();
changeArr(arr);
System.out.print("After rewrite: ");
for (String str : arr)
System.out.print(str + " ");
System.out.println();
}
private static void changeArr(String[] arr) {
arr = new String[4];
arr[0] = "3";
arr[1] = "2";
arr[2] = "1";
arr[3] = "0";
}
}
我原以为 arr
会被新大小的新对象替换,然后重写。相反,我得到了:
Before rewrite: 1 2 3
After rewrite: 1 2 3
没有错误或任何错误,但数组没有任何变化!然后我尝试通过创建一个临时数组并重新分配指针来调整初始数组的大小。
private static void changeArr(String[] arr) {
String[] tempArr = new String[4];
tempArr[0] = "3";
tempArr[1] = "2";
tempArr[2] = "1";
tempArr[3] = "0";
arr = tempArr;
}
同样,输出与以前的版本相同!没有错误,但也没有变化。为了完全确定至少可以调整数组大小,我尝试在单独的方法中创建一个临时数组并 returning 数组。
public class RewriteArray {
public static void main(String[] args) {
String[] arr = { "1", "2", "3"};
System.out.print("Before rewrite: ");
for (String str : arr)
System.out.print(str + " ");
System.out.println();
arr = loadArr();
System.out.print("After rewrite: ");
for (String str : arr)
System.out.print(str + " ");
System.out.println();
}
private static String[] loadArr() {
String[] tempArr = new String[4];
tempArr[0] = "3";
tempArr[1] = "2";
tempArr[2] = "1";
tempArr[3] = "0";
return tempArr;
}
}
这次终于成功了!我得到以下输出:
Before rewrite: 1 2 3
After rewrite: 3 2 1 0
目前看来,最好必须在单独的方法中创建新的临时数组和 return 该数组,然后将 returned 数组分配给原始数组。我只是不明白为什么它不能在内部使用 changeArr
方法。这不是在内部传递引用吗?如果不是,为什么我的第一次尝试成功而其他人却失败了?
Java 按值传递引用
更改参数以引用新实例不会影响您作为参数传递的表达式。
在您的 changeArr()
方法中,当您进行以下初始化时
arr = new String[4];
你实际上分配了一个 local 变量来指向一个新分配的数组。传入的原始数组不受影响
您无法在 Java 中调整数组的大小。最接近实现这一目标的方法是使用 java.lang.System.arraycopy()
之类的东西,其中 returns 是原始数组的放大副本。或者您可以尝试使用专为此目的而设计的 ArrayList
。
我在玩数组并以不同的方式操纵它们,我偶然发现了一些非常奇怪的行为!我最初关心的是将一个数组替换为另一个大小可能不同也可能不同的数组,因为它将从任意长度的文件中读取。我决定尝试不同的东西,看看会发生什么。我的第一次尝试是这样的:
public class RewriteArray {
public static void main(String[] args) {
String[] arr = { "1", "2", "3"};
System.out.print("Before rewrite: ");
for (String str : arr)
System.out.print(str + " ");
System.out.println();
changeArr(arr);
System.out.print("After rewrite: ");
for (String str : arr)
System.out.print(str + " ");
System.out.println();
}
private static void changeArr(String[] arr) {
arr[0] = "3";
arr[1] = "2";
arr[2] = "1";
}
}
这符合我的预期,通过引用对象证明了更改,并给出了输出:
Before rewrite: 1 2 3
After rewrite: 3 2 1
然后我尝试在 changeArr
方法中调整数组的大小,那时事情变得很奇怪。
public class RewriteArray {
public static void main(String[] args) {
String[] arr = { "1", "2", "3"};
System.out.print("Before rewrite: ");
for (String str : arr)
System.out.print(str + " ");
System.out.println();
changeArr(arr);
System.out.print("After rewrite: ");
for (String str : arr)
System.out.print(str + " ");
System.out.println();
}
private static void changeArr(String[] arr) {
arr = new String[4];
arr[0] = "3";
arr[1] = "2";
arr[2] = "1";
arr[3] = "0";
}
}
我原以为 arr
会被新大小的新对象替换,然后重写。相反,我得到了:
Before rewrite: 1 2 3
After rewrite: 1 2 3
没有错误或任何错误,但数组没有任何变化!然后我尝试通过创建一个临时数组并重新分配指针来调整初始数组的大小。
private static void changeArr(String[] arr) {
String[] tempArr = new String[4];
tempArr[0] = "3";
tempArr[1] = "2";
tempArr[2] = "1";
tempArr[3] = "0";
arr = tempArr;
}
同样,输出与以前的版本相同!没有错误,但也没有变化。为了完全确定至少可以调整数组大小,我尝试在单独的方法中创建一个临时数组并 returning 数组。
public class RewriteArray {
public static void main(String[] args) {
String[] arr = { "1", "2", "3"};
System.out.print("Before rewrite: ");
for (String str : arr)
System.out.print(str + " ");
System.out.println();
arr = loadArr();
System.out.print("After rewrite: ");
for (String str : arr)
System.out.print(str + " ");
System.out.println();
}
private static String[] loadArr() {
String[] tempArr = new String[4];
tempArr[0] = "3";
tempArr[1] = "2";
tempArr[2] = "1";
tempArr[3] = "0";
return tempArr;
}
}
这次终于成功了!我得到以下输出:
Before rewrite: 1 2 3
After rewrite: 3 2 1 0
目前看来,最好必须在单独的方法中创建新的临时数组和 return 该数组,然后将 returned 数组分配给原始数组。我只是不明白为什么它不能在内部使用 changeArr
方法。这不是在内部传递引用吗?如果不是,为什么我的第一次尝试成功而其他人却失败了?
Java 按值传递引用
更改参数以引用新实例不会影响您作为参数传递的表达式。
在您的 changeArr()
方法中,当您进行以下初始化时
arr = new String[4];
你实际上分配了一个 local 变量来指向一个新分配的数组。传入的原始数组不受影响
您无法在 Java 中调整数组的大小。最接近实现这一目标的方法是使用 java.lang.System.arraycopy()
之类的东西,其中 returns 是原始数组的放大副本。或者您可以尝试使用专为此目的而设计的 ArrayList
。