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