gpt4 book ai didi

java - 我们可以在java中使用引用传递吗?如果否,java.util.Arrays.sort 是如何工作的?

转载 作者:搜寻专家 更新时间:2023-11-01 01:02:51 25 4
gpt4 key购买 nike

我曾经认为 Java 支持按值传递和按引用传递,但我遇到了很多讨论,例如

  1. Java is always pass by value, with no exceptions, ever .
  2. Java is always pass-by-value
  3. Java always passes arguments by value NOT by reference.
  4. Java passes references by value.So you can't change the reference that gets passed in.

如果 java 只支持按值传递
java.util.Array.sort()Collections.sort(unsortList) 如何工作?

int iArr[] = {2, 1, 9, 6, 4};// sorting array

Arrays.sort(iArr);

System.out.println("The sorted int array is:");
for (int number : iArr) {
System.out.println("Number = " + number);
}

更新:传递引用(按值)到底是什么意思?它与 C 或 C++ 中数组的引用传递行为有何不同?

更新:如果我错了,请纠正我。在 C 中,我们通过引用传递变量的地址。在 Java 中,我们将引用传递给对象(或值)。只要方法中的变量指向对象,对象的值就会随着变量的变化而变化调用的方法。 Java Pass by reference没有创建对象或引用的副本!我只能看到 2 个不同的变量指向同一个对象,就像通过引用传递一样。类似于 C++ 中的引用传递,两个不同的变量指向同一个地址。

最佳答案

数组是引用类型,因此 iArr 变量包含对数组的引用。

换句话说,当你调用

Arrays.sort(iArr);

您正在将引用(按值)传递给 sort 方法,该方法对 iArr 引用的数组进行排序。


来自评论:

What does passing a reference (by value) actually mean?

按引用传递的意思是您基本上是将变量本身传递给方法。即,方法对变量所做的任何事情都会影响外部变量。在 Java 中从来没有这种情况。 (尝试实现交换方法,您就会明白我的意思。)按值传递意味着您传递存储在变量中的值。在这种情况下,该值是一个引用,因此它按值传递一个引用。


回复。第二次更新:

从你的形象来看,我认为你已经很好地了解了情况,我认为这归结为术语。

如果我们暂时忘记 C++,它真的很简单。您需要记住的是 (A) 当您调用 method(var) 时,参数是 var 包含的任何内容的副本,以及 (B)非原始变量是一个引用(如果您愿意,可以是一个“指针”)。

请注意,在您的问题中您有

int iArr[] = {2, 1, 9, 6, 4};

相当于

int[] iArr = new int[] { 2, 1, 9, 6, 4 };

所以这一切都检查出来了:iArr 持有一个引用,new 返回一个引用。

当您调用 Arrays.sort(iArr) 时,将传递 iArr 的内容(即对数组的引用)。这仍然不是按引用传递,因为传递的是值,而不是变量本身。如果您将方法内部的形式参数重新分配为指向某个其他数组,则当方法返回时,iArr 仍将指向原始数组。

如果我们确实从 C++ 的角度思考,事情往往会更复杂一些; C++ 的引用概念略有不同。使用 C++ 引用,您实际上可以实现真正的 swap:

void swap(int &x, int &y)
{
int temp = x;
x = y;
y = temp;
}

即您可以传入“变量”(而不是仅仅传递变量的内容)。我喜欢这样想,因为您正在与正在调用的方法共享变量的范围。这不能用 Java 完成。

考虑到这一点,我想说 Java 引用更像是 C++ 指针,除了它们的局限性在于您不能像在C++(你不能在 Java 中执行 *person,即使 person 存储了对应于指向一个人的指针的内容)并且你无法获取对象的地址使用 & 运算符。你也不能做任何指针运算。例如,您不能执行 iArr + 3 来获取数组的第四个元素。

关于java - 我们可以在java中使用引用传递吗?如果否,java.util.Arrays.sort 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30393159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com