【问题标题】:Passing variables to static methods in java ends unexpectedly将变量传递给java中的静态方法意外结束
【发布时间】:2016-03-06 17:20:48
【问题描述】:

我只是想知道当方法选择、插入、气泡返回无效时,这段代码如何仍然有效。 是因为方法是静态的还是什么?

另外,如何在不进行异或操作的情况下交换变量?

public class Sorts {

static int[] a = { 100, 90, 70, 60, 50, 40, 30, 20, 10, 7, 6, 5, 4, 3, 2, -1 };

public static void main(String[] args) {
    // TODO Auto-generated method stub

    bubbleSort(a);// Worst one
    print(a);

    int[] b = {100, 90, 70, 60, 50, 40, 30, 20, 10, 7, 6, 5, 4, 3, 2, -1};

    MY_SEMI_SELECTION_Sort(b);
    print(b);

    int[] e = { 100, 90, 70, 60, 50, 40, 30, 20, 10, 7, 6, 5, 4, 3, 2, -1};
    selectionSort2(e);
    print(e);

    int[] c = {100, 90, 70, 60, 50, 40, 30, 20, 10, 7, 6, 5, 4, 3, 2, -1};
    insertionSort(c); // The best so far
    print(c);

}

static void insertionSort(int[] arr) {

    int len = arr.length;

    for (int i = 1; i < len; ++i) {

        int j = i;

        while (j > 0 && arr[j] < arr[j - 1]) {
            // Swap
            arr[j] ^= arr[j - 1] ^= arr[j];
            arr[j - 1] ^= arr[j];

            --j;
        }
    }

}

static void MY_SEMI_SELECTION_Sort(int[] arr) {

    int len = arr.length;

    for (int i = 0; i < len; ++i) {

        for (int k = i; k < len - 1; ++k) {

            if (arr[i] > arr[k + 1]) {
                // Swapping........
                arr[i] ^= arr[k + 1] ^= arr[i];
                arr[k + 1] ^= arr[i];

            }

        }

    }

}

static void selectionSort2(int[] arr) {

    int len = arr.length;

    for (int i = 0; i < len; ++i) {

        int k;
        int minIndex = i;

        for (k = i; k < len - 1; ++k) {

            if (arr[minIndex] > arr[k + 1]) {
                minIndex = k + 1;
            }

        }

        if (arr[minIndex] != arr[i]) {
            arr[minIndex] ^= arr[i] ^= arr[minIndex];
            arr[i] ^= arr[minIndex];
        }

    }

}

static void bubbleSort(int[] arr) {

    int len = arr.length;

    for (int i = 0; i < len; ++i) {

        for (int k = 0; k < len - 1; ++k) {

            if (arr[k] > arr[k + 1]) {
                // Swapping........
                arr[k] ^= arr[k + 1] ^= arr[k];
                arr[k + 1] ^= arr[k];

            }

        }

    }

}

static void swap(int a, int b) {

    int temp = b;
    b = a;
    a = temp;
}

static void print(int[] arr) {

    int len = arr.length;

    for (int i = 0; i < len; ++i) {
        System.out.print(arr[i] + " ");
    }
    System.out.println();
  }

}

【问题讨论】:

  • 为什么你会惊讶它正在工作返回 void...?
  • Java 中Object(s) 的值是引用。因此,在数组中传递的值(数组本身就是Objects),可以在方法中进行修改。
  • 可能我说的不够清楚,数组是在方法做一些改变之后改变的,毕竟是传值,对吧? @LuigiCortese
  • @ElliottFrisch 那么方法交换呢? int 不是对象?!
  • @Razorbolt 正确。但数组arr 与传递给方法的数组相同。

标签: java reference static


【解决方案1】:

为什么我的方法即使返回 void 也能正常工作?

Java 总是按值传递。但我们在谈论什么价值?传递给函数的值是参考值,想象它像数组所在的地址。所以,你总是在你的方法内部和外部引用同一个数组。

如何在不异或的情况下交换元素?

将变量想象成桶,你不能在不丢失其先前内容的情况下填充一个。你需要使用一个临时变量

int a=1,b=2;
int tmp=a;
a=b;    //without the previous line of code you'd have lost the value of 'a'
b=tmp;

【讨论】:

  • 我的意思是通过一种方法让我的代码整洁,因为我经常使用它。有什么想法吗?
  • 真的需要用函数来代替两行代码吗?
  • 从长远来看,绝对是的。
  • @Razorbolt 它会比你想象的要长,你正在交换原语。对于原语,值是......原始值,而不是参考值。我的意思是,在您的辅助方法中,您将获得原始变量的副本,您将无法交换函数外部原始变量的值。阅读this
  • 将数组作为第一个参数传递给swap 方法。然后你可以用temp交换任意索引值。
【解决方案2】:

是不是因为方法是静态的 不,因为 int array a 仅供参考。在调用不同的方法时,相同的引用作为参数传递。如果 int 数组 a 是 main 的局部变量,即使结果也是一样的。

如何在不异或的情况下交换元素 交换变量的最佳方式是通过 XOR。

a = a ^ b;
b = a ^ b;
a = a ^ b;

另一种方法是使用临时变量。

【讨论】:

  • 没有异或他们。
  • 是的,没有异或。
  • 还值得注意的是,第一个可能会在某些时候导致整数溢出。
  • 好主意,@ElliottFrisch 先生,但我最感兴趣的是通过一种使代码整洁的方法来做到这一点,因为我经常使用交换。
  • 第二个很好(使用 t)。但是第一个有缺陷,当 a + b 与 Integer.MAX_,VALUE 交叉时
猜你喜欢
  • 2012-02-09
  • 1970-01-01
  • 2012-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多