Java 将一个数组指向函数中的另一个数组
我有一个关于编辑数组的问题: 如果我调用一个编辑数组元素的函数,例如将所有值加倍,我知道不必从函数返回新的、编辑过的数组,因为调用函数时,我传递的不是数组本身,而是内存地址。因此,当函数编辑数组时,它编辑原点:Java 将一个数组指向函数中的另一个数组,java,arrays,Java,Arrays,我有一个关于编辑数组的问题: 如果我调用一个编辑数组元素的函数,例如将所有值加倍,我知道不必从函数返回新的、编辑过的数组,因为调用函数时,我传递的不是数组本身,而是内存地址。因此,当函数编辑数组时,它编辑原点: public static void Main(String[] args) { int[] myArray = {1, 2, 3}; // myArray is now {1, 2, 3} arrayDouble(myArray); // myArra
public static void Main(String[] args)
{
int[] myArray = {1, 2, 3};
// myArray is now {1, 2, 3}
arrayDouble(myArray);
// myArray is now {2, 4, 6}, exactly what I want
}
public static void arrayDouble(int[] arr)
{
for (int i = 0; i < arr.length; i++)
arr[i] *= 2;
}
目前我已经用这种方式解决了这个问题,但我觉得它看起来很丑,不干净:
public static void Main(String[] args)
{
int[] myArray = {1, 2, 3};
// myArray is now {1, 2, 3}
myArray = arrayReset(myArray); // I assign the return value to my array
// myArray is now {0}, just as I want
}
public static int[] arrayReset(int[] arr)
{
int[] newArr = new int[1];
return newArr;
}
首先,您应该遵循最佳实践 最佳做法是不更改方法的输入元素,即您的方法不应更改输入数组,而应始终创建一个新数组。因此,您的
丑陋的解决方案是最正确的
public static int[] arrayReset(int[] arr) {
int[] res = new int[1];
// ...
return res;
}
当然,您可以修改给定阵列,例如,如果您不想/无法装箱阵列的新副本。在这种情况下,您不必检索数组(但可以),因为正如您正确提到的,客户机已经有了对该数组的引用。以下代码段是相等的:
public static void arrayReset(int[] arr) {
// ...
}
public static int[] arrayReset(int[] arr) {
// ...
return arr;
}
最后。java
中的数组是不可变的对象(我的意思是不能更改它的大小)。如果您真的需要它,您必须使用List
或数组包装器
public static void arrayReset(List<Integer> arr) {
arr.clear();
}
int[] arr = new int[3];
int[][] wrapper = {arr};
arrayReset(wrapper);
arr = wrapper[0];
// wrapper[0] contains an original array
public static void arrayReset(int[][] wrapper) {
int[] arr = arrWrapper[0];
arr = new int[1]; // change array size
// do smth
wrapper[0] = arr;
}
publicstaticvoidarrayreset(列表arr){
arr.clear();
}
int[]arr=新的int[3];
int[][]包装器={arr};
arrayReset(包装器);
arr=wrapper[0];
//包装器[0]包含原始数组
公共静态void arrayReset(int[]]wrapper){
int[]arr=arrWrapper[0];
arr=new int[1];//更改数组大小
//做smth
包装器[0]=arr;
}
正如您所知,函数中的Main
应该是一个实际上看起来非常干净的Main
,您要查找的是java.util.ArrayList
类作为一个提示,java数组有一个固定的长度。它们不能在大小上生长或收缩。正如@MadPhysician所说,你想要一个ArrayList
@null\u awe sry,这是一个打字错误。@MadPhysician@ElliottFrisch我问答案是“否”,然后=)我来看看ArrayList
。谢谢大家!谢谢奥列格!这个主意真聪明=D
public static void arrayReset(List<Integer> arr) {
arr.clear();
}
int[] arr = new int[3];
int[][] wrapper = {arr};
arrayReset(wrapper);
arr = wrapper[0];
// wrapper[0] contains an original array
public static void arrayReset(int[][] wrapper) {
int[] arr = arrWrapper[0];
arr = new int[1]; // change array size
// do smth
wrapper[0] = arr;
}