Java - 通过方法重新引用数组

时间:2011-10-23 14:30:16

标签: java arrays pointers

:)

我遇到的问题:这是我正在尝试做的非常简化的版本,因为我实际上需要重新计算大量的颜色(取自Color对象),并且需要排序它们,并删除和计算2个数组中的重复项。 (或者我应该使用的任何数据模型,我选择了2个数组)。 我遇到的问题是我不能在方法中重新引用数组,就像它之后停留在那里一样。

public class Algos2 {

  private int[] b1 = null;

  public void relink(int[] a1, int[] a2) {
    a2 = a1;
  }

  public Algos2() {
    int[] a1 = { 0, 5, 5, 5, 3, 3, 0, 0, 1, 2, 1, 5};
    relink(a1, b1);
    System.out.println("a1 " + a1); // whatever, working
    System.out.println("b1 " + b1); // still null 
}

  public static void main(String[] args) {
      new Algos2();

  }
}

b1之后应返回与a1相同的指针。我需要在一个方法中做到这一点。 :/

编辑:我也不能直接做,通过方法返回一个数组。所以没有:public int[] relink(int[] a1) {return a1;}因为我也需要在另一种方法中调用它,这也导致null

2 个答案:

答案 0 :(得分:2)

这不起作用,因为Java按值传递参数(即使该值是引用,例如对数组的引用)。它无法更改b1relink的值 - 因为它收到的只是b1值的副本。 (好吧,在这种情况下,它可以直接将分配给b1,因为它是一个实例方法而b1是一个实例变量,但我怀疑这只是巧合,可能不是在您的真实代码中有效。)

如果你想让两个变量引用同一个数组,你为什么不在调用方法中使用赋值运算符?

b1 = a1;

或者,如果您还有其他工作要做,您可以使方法返回对相应数组的引用:

b1 = relink(a1);

很难确切地知道什么是最合适的,因为你还没有真正告诉我们你想要做什么。如果您希望能够删除元素,那么数组很可能是错误的数据结构,正是因为您无法从中删除元素。您是否考虑过使用List<E>实施,例如ArrayList<E>

答案 1 :(得分:0)

如果使用方法完成swap ,则可以将句柄包装到“holder”对象中的数组中,以模拟通过引用传递它们。但是,这会增加另一层间接性,这会降低性能。

示例:

class Ref<T>{
    public T obj;
    public Ref(T obj){this.obj = obj;}

    public static <T> void swap(Ref<T> a, Ref<T> b){
        T aux = a.obj;
        a.obj = b.obj;
        b.obj = aux;
    }
}

class test{
    public static void main(String[]args){
        Ref<int[]> a1, b1;
        a1 = new Ref<int[]>(new int[]{1,2,3});
        b1 = new Ref<int[]>(new int[]{4,5,6});

        System.out.println(java.util.Arrays.toString(a1.obj));
        System.out.println(java.util.Arrays.toString(b1.obj));

        System.out.println("Swap.");
        Ref.swap(a1, b1);

        System.out.println(java.util.Arrays.toString(a1.obj));
        System.out.println(java.util.Arrays.toString(b1.obj));
    }
}