【问题标题】:How to code a swap() method, or alternatives? [duplicate]如何编写 swap() 方法或替代方法? [复制]
【发布时间】:2014-03-08 09:34:14
【问题描述】:

我知道在座的所有人都知识渊博,而且通常很擅长解释,所以我想请教一下。

我看过一些关于按值传递和按引用传递语言之间区别的帖子和文章,它们让我对如何实现交换方法感到非常好奇。这是特别有趣的,因为学校项目和个人项目都在/将使用交换方法来工作。我确实在 this question 中找到了 Marcus 提出的一个相当新颖的解决方案,如果我找不到另一个解决方案,我会使用它。


我的理解是不可能实现以下内容并因此产生x = 5, y = 10

int x = 10; int y = 5; 

swap(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
}

public static void main(String[] args) {
    swap(x, y);
    //x = 10, y = 5
    System.out.println("x was 10 and y was 5");
    System.out.println("Now x is " + x + ", and y is " + y);
}

但是,据我所知,以下将起作用,因为 x 和 y 未通过:

int x = 10; int y = 5;

swap() {
    int temp = x;
    x = y;
    y = temp;
}

public static void main(String[] args) {
    swap();
    //x = 5, y = 10
}

如何交换两个原语?那么同一个对象的两个实例呢(我只需要交换字段/变量)?在数组中交换时我必须考虑什么特别的事项吗?

【问题讨论】:

    标签: java swap


    【解决方案1】:

    如您所知,只有当它们在全局范围或类范围内时,通过方法交换到基元的唯一方法才有效。

    对于数组和对象,它们在Java中是通过引用传递的。因此,您所做的任何更改都会更改该方法的实际参数。另一方面,如果您正在寻找一种巧妙的方法来交换两个对象,只需在类中实现一个 swap 方法并调用它:

    anObject.swap(anotherObject);
    

    这样你就可以随心所欲地实现交换。

    【讨论】:

    • 好吧,如果我绝对需要交换原语,我会仔细检查它们是否总是全局声明的。我肯定会使用您的 Object.swap(Object) 建议。你完美地回答了我的问题,所以 +1 和最佳答案!
    • 数组和对象在 Java 中不是通过引用传递的。相反,对它们的引用是按值传递的。
    【解决方案2】:

    这样的交换原语不能在 Java 中完成。您可以获得的最接近的是交换对象中包含的信息,无论是数组还是保存值的常规对象。

    【讨论】:

      【解决方案3】:

      您可以通过将 2 个原语存储在一个对象(例如数组列表)中来交换它们。 对象存在于堆空间中,因此基本上将数组列表传递给 swap 方法就像传递对该数组列表的引用。

      希望对您有所帮助。

      编辑:需要注意的是,在 JAVA 中传递的所有参数都是按值,但是在传递对象时,您基本上是在传递指向在堆上分配的对象的对象引用值。

      【讨论】:

      • 这是一个相当肮脏的解决方法。
      • 啊,有趣的解决方案。可悲的是,我需要交换的值通常位于不同的类或变量中,因此在大多数情况下,这种解决方案是不可行的。不过对于我的学校项目来说它是完美的,它只是在 ArrayList 中交换值。谢谢! +1
      • @EnginKayraklioglu,这是一个适合面试的棘手问题,也需要一个棘手的答案。事实上,我在不久前的一次采访中被问到了这个问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-01
      相关资源
      最近更新 更多