【问题标题】:How does Arrays.sort() change the variable passed to it? [duplicate]Arrays.sort() 如何改变传递给它的变量? [复制]
【发布时间】:2012-05-25 15:08:19
【问题描述】:

可能重复:
Is Java pass-by-reference?

我在这里有点困惑。 Arrays.sort(a) 如何修改a的值?

int[] a = {9,8,7,6,5,4,3,2,1};
Arrays.sort(a);
System.out.println(Arrays.toString(a));

我以为java是按值传递的……

【问题讨论】:

  • 另外,jdk自带源码,想了解的可以看一下。
  • 只是为了扩展答案:这只是因为 sort 不会改变数组的大小。如果你想这样做,你必须分配一个新数组,而不能只修改现有数组。

标签: java arrays sorting


【解决方案1】:

是的,Java 是按值传递的。然而,这里通过值传递的是数组的引用,而不是数组本身。

【讨论】:

  • 因此,如果您不想在不更改原始数组的情况下以另一种方法更改数组,则应该复制它。对吗?
  • @Josh:正确。您可以使用a.clone() 进行复制。
【解决方案2】:

Java 中的对象是通过引用值传递的。所以如果你传入一个对象,它会得到一个引用的副本(如果你把那个引用赋值给别的东西,只修改参数,原来的对象仍然存在并被主程序引用)。

This link demonstrates a bit about passing by value of reference.

public void badSwap(Integer var1, Integer var2)
{
  Integer temp = var1;
  var1 = var2;
  var2 = temp;
}

这些是对对象的引用,但它们不会被交换,因为它们只是函数范围内的内部引用。但是,如果您这样做:

var1.doubleValue();

它将使用对原始对象的引用

【讨论】:

  • +1 重要的是要记住:只有引用是“克隆”的,而不是引用的对象。在大多数情况下,我们认为这是理所当然的,但由于某种原因,它会导致与数组混淆。
  • Java 中的对象永远不会通过引用传递。当您将对象传递给函数时,您会传递对象的引用(其值),例如在 C++ 中你传递引用并且可以做指针运算,在 Java 中你不能这样做。
  • @LuiggiMendoza 我更喜欢将其视为“伪引用”。您可以使用它来访问对象及其字段,但它无法与 C 风格的指针相提并论。
  • 你可以随心所欲地理解这个概念,但不要去那里说Java通过引用传递,而实际上它不是。 @aix answer 以一种简单的方式解释了这一点。
  • @LuiggiMendoza 恐怕我不明白。我明确指出它是按引用的值传递的。您对我的回答的哪一部分有疑问?
【解决方案3】:

Arrays.sort 不修改变量,它修改变量指向的数组对象。

【讨论】:

    【解决方案4】:

    没错,Java 总是按值传递,而对于对象,对象的引用 是按值传递的。因此,您的数组的引用是按值传递的。

    【讨论】:

      【解决方案5】:
      1. 它对其进行排序。
      2. 对数组的引用是按值传递的。不是数组本身。

      【讨论】:

        【解决方案6】:

        对数组的引用是按值传递的,所以sort 方法有自己的引用,它仍然引用与a 引用相同的数组。这意味着sort 可以更改a 引用的同一数组的内容。

        【讨论】:

          猜你喜欢
          • 2020-03-08
          • 2012-04-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-07
          • 2015-03-21
          • 2017-02-28
          • 1970-01-01
          相关资源
          最近更新 更多