java中可以使用引用传递吗?如果否 java.util.Arrays.sort 如何工作?

2024-02-10

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

  1. Java 总是按值传递,无一例外。 https://stackoverflow.com/a/40499/3651739
  2. Java 总是按值传递 https://stackoverflow.com/a/40523/3651739
  3. Java 总是按值而不是按引用传递参数。 https://stackoverflow.com/a/12429953/3651739
  4. Java 按值传递引用。因此您无法更改传入的引用。 https://stackoverflow.com/a/40501/3651739

如果java只支持传值
如何java.util.Array.sort() or Collections.sort(unsortList) work?

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);
}

Update:传递引用(按值)实际上意味着什么?它与 C 或 C++ 中数组的引用传递行为有何不同?

Update: Please correct me if I am wrong. In C we pass the address of variables when passing by reference.In Java we pass the reference to the object (or value).As long as the variable in the method is pointing to the Object the value of the object changes with the varible in the method invoked. Java Pass by reference There is no copy of Object or reference made!, I could see only 2 different variables pointing to the same Object as in pass by reference.Similar in C++ pass by reference two different variables points to the same address.


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

换句话说,当你打电话时

Arrays.sort(iArr);

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


来自评论:

传递引用(按值)实际上意味着什么?

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


关于。第二次更新:

从你的形象来看,我认为你已经非常了解情况了,我认为这可以归结为术语。

If we 忘记 C++有一段时间,它是really简单的。您需要记住的是 (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当方法返回时仍然指向原始数组。

If we do用 C++ 的方式思考事情往往有点复杂; C++ 的引用概念略有不同。通过 C++ 参考,您实际上可以实现一个真正的swap:

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

IE。您可以传入“变量”(而不是仅传递变量的内容)。我喜欢将其视为您与所调用的方法共享变量的范围。这在 Java 中是做不到的。

因此,考虑到这一点,我想说 Java 引用更像是 C++ 指针,只不过它们受到限制,因为您不能使用*运算符,就像在 C++ 中一样(你不能这样做*person在Java中,尽管person存储对应于指向人的指针的内容)并且您无法使用以下方式获取对象的地址&操作员。而且你不能做任何指针算术。例如你不能这样做iArr + 3到达数组的第四个元素。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java中可以使用引用传递吗?如果否 java.util.Arrays.sort 如何工作? 的相关文章

  • 是否可以使用 Flying Saucer (XHTML-Renderer) 将 css 解析为类路径资源?

    我正在尝试将资源打包到 jar 中 但我无法让 Flying Saucer 在类路径上找到 css 我无法轻松构建 URL 来无缝解决此问题 https stackoverflow com questions 861500 url to l
  • 大数据使用什么数据结构

    我有一个包含一百万行的 Excel 工作表 每行有 100 列 每行代表一个具有 100 个属性的类的实例 列值是这些属性的值 哪种数据结构最适合在这里使用来存储数百万个数据实例 Thanks 这实际上取决于您需要如何访问这些数据以及您想要
  • Kotlin 未解决的参考:CLI 上 gradle 的 println

    放一个printlnkotlin 函数返回之前的语句会崩溃 堆栈跟踪 thufir dur NetBeansProjects kotlin thufir dur NetBeansProjects kotlin gradle clean bu
  • 当客户端关闭连接时,Spring StreamingResponseBody 请求线程未清理

    我在控制器中有一个端点 它返回一个StreamingResponseBody 用于向客户端发送文件 其代码大致如下 RestController RequestMapping value api public class Controlle
  • 需要使用 joda 进行灵活的日期时间转换

    我想使用 joda 解析电子邮件中的日期时间字符串 不幸的是我得到了各种不同的格式 例如 Wed 19 Jan 2011 12 52 31 0600 Wed 19 Jan 2011 10 15 34 0800 PST Wed 19 Jan
  • 自动生成Flyway的迁移SQL

    当通过 Java 代码添加新模型 字段等时 JPA Hibernate 的自动模式生成是否可以生成新的 Flyway 迁移 捕获自动生成的 SQL 并将其直接保存到新的 Flyway 迁移中 以供审查 编辑 提交到项目存储库 这将很有用 预
  • 是否可以通过编程方式查找 logback 日志文件?

    自动附加日志文件以支持电子邮件会很有用 我可以以编程方式设置路径 如以编程方式设置 Logback Appender 路径 https stackoverflow com questions 3803184 setting logback
  • 从 GitHub 上托管的 Spring Cloud Config Server 访问存储库的身份验证问题

    我在 GitHub 上的存储库中托管配置 如果我将回购公开 一切都好 但如果我将其设为私有 我将面临 org eclipse jgit errors TransportException https github com my user m
  • 如何在 Spring 属性中进行算术运算?

  • 流中的非终结符 forEach() ?

    有时 在处理 Java Stream 时 我发现自己需要一个非终端 forEach 来触发副作用但不终止处理 我怀疑我可以用 map item gt f item 之类的方法来做到这一点 其中方法 f 执行副作用并将项目返回到流中 但这似乎
  • HashMap 值需要不可变吗?

    我知道 HashMap 中的键需要是不可变的 或者至少确保它们的哈希码 hashCode 不会改变或与另一个具有不同状态的对象发生冲突 但是 HashMap中存储的值是否需要与上面相同 为什么或者为什么不 这个想法是能够改变值 例如在其上调
  • 在 SWT/JFace RCP 应用程序中填充巨大的表

    您将如何在 SWT 表中显示大量行 巨大是指超过 20K 行 20 列的东西 不要问我为什么需要展示那么多数据 这不是重点 关键是如何让它尽可能快地工作 这样最终用户就不会厌倦等待 每行显示某个对象的实例 列是其属性 一些 我想使用 JFa
  • 如何在 Java 中创建接受多个值的单个注释

    我有一个名为 Retention RetentionPolicy SOURCE Target ElementType METHOD public interface JIRA The Key Bug number JIRA referenc
  • JMenu 中的文本居中

    好吧 我一直在网上寻找有关此问题的帮助 但我尝试的任何方法似乎都不起作用 我想让所有菜单文本都集中在菜单按钮上 当我使用setHorizontalTextPosition JMenu CENTER 没有变化 事实上 无论我使用什么常量 菜单
  • 是否可以使用 Java Guava 将函数应用于集合?

    我想使用 Guava 将函数应用于集合 地图等 基本上 我需要调整 a 的行和列的大小Table分别使所有行和列的大小相同 执行如下操作 Table
  • 在 Google App-Engine JAVA 中将文本转换为字符串,反之亦然

    如何从字符串转换为文本 java lang String to com google appengine api datastore Text 反之亦然 Check Javadoc http code google com appengin
  • OpenCSV:将嵌套 Bean 映射到 CSV 文件

    我正在尝试将 bean 映射到 CSV 文件 但问题是我的 bean 具有其他嵌套 bean 作为属性 所发生的情况是 OpenCSV 遍历属性找到一个 bean 然后进入其中并映射该 bean 内的所有数据 如果找到另一个 bean 它就
  • 如何重新启动死线程? [复制]

    这个问题在这里已经有答案了 有哪些不同的可能性可以带来死线程回到可运行状态 如果您查看线程生命周期图像 就会发现一旦线程终止 您就无法返回到新位置 So 没有办法将死线程恢复到可运行状态 相反 您应该创建一个新的 Thread 实例
  • Java中HashMap和ArrayList的区别?

    在爪哇 ArrayList and HashMap被用作集合 但我不明白我们应该在哪些情况下使用ArrayList以及使用时间HashMap 他们两者之间的主要区别是什么 您具体询问的是 ArrayList 和 HashMap 但我认为要完
  • 在浏览器刷新中刷新检票面板

    我正在开发一个付费角色系统 一旦用户刷新浏览器 我就需要刷新该页面中可用的统计信息 统计信息应该从数据库中获取并显示 但现在它不能正常工作 因为在页面刷新中 java代码不会被调用 而是使用以前的数据加载缓存的页面 我尝试添加以下代码来修复

随机推荐

  • 排序忽略标点符号 (Objective-C)

    我正在尝试对 iOS UITableView 对象进行排序 我目前正在使用以下代码 Sort terms alphabetically ignoring case self termsList sortUsingSelector selec
  • 如何查找映射驱动器的可用空间百分比?

    是否可以以编程方式查找映射驱动器中的可用空间 如何使用 ms dos 查找驱动器中可用空间的百分比 在硬盘中找到驱动器的可用空间可能很容易 但我需要找到映射驱动器的可用空间 我已经在我的系统中映射了一些文件服务器 可以在 我的电脑 中看到它
  • Octave并行计算

    我在网上找到了一些资料 表明 Octave 有一些工具可以并行化算法 但找不到任何细节或如何获取和使用它们 对此的任何帮助 见解都会很棒 http octave sourceforge net parallel http octave so
  • VSO 和单个产品团队的多个项目

    我们有一个由大约 10 名开发人员组成的团队正在开发新产品 我们已将此产品拆分为 Visual Studio Online 上的两个团队项目 开发人员可以在任何一个冲刺期间同时处理这两个项目 尽管我们有两个团队项目 但整个团队作为一个敏捷单
  • 如何解决:引用的 AMP URL 不是 AMP

    搜索控制台添加了一系列 引用的 AMP URL 不是 AMP 的问题 如果我使用 I get 然而 当我登记入住时https validator ampproject org https validator ampproject org 表
  • R 的同比百分比变化

    虽然我发现了几个类似的问题 但我无法在基础 R 中找到解决我的问题的简单方法 我想计算一组数据 此处为 y 值 的同比百分比变化 并将此 Delta 系列作为新列添加到我的数据框中 例如 gt x c 2000 2001 2002 2003
  • 我可以使用 Objective-C 将块作为 @selector 传递吗?

    是否可以传递一个 Objective C 块 selector论证中的一个UIButton 即 有什么办法可以让以下工作发挥作用吗 closeOverlayButton addTarget self action anotherIvarLo
  • 调用 SelectAll() 后,文本框的光标如何移动到文本的开头?

    在某些情况下 当焦点设置到特定文本框时 光标会自行停在文本之前 如下所示 然而 TextBox 有一个 GotFocus 处理程序 可以显式选择所有文本 private void txtQty GotFocus object sender
  • 如何在乘以 pandas DataFrame 时将 NaN 或未对齐的值视为 1 或 0

    我想将未对齐或缺失 NaN Inf Inf 值视为 1 或 0 df1 pd DataFrame x 1 2 3 4 5 y 3 4 5 6 7 index a b c d e df2 pd DataFrame y 1 NaN 3 4 5
  • 使用子进程获取实时输出[重复]

    这个问题在这里已经有答案了 我正在尝试为命令行程序 svnadmin verify 编写一个包装脚本 它将显示一个很好的操作进度指示器 这要求我能够在包装程序输出后立即看到输出的每一行 我想我只需使用以下命令执行该程序subprocess
  • HashSet什么时候调用equal方法? [复制]

    这个问题在这里已经有答案了 我在一个教程中找到了这个例子 当我运行这个时 我得到 hs size 值为 2 并且 equals 方法仅被调用一次 任何人都可以解释一下当 equal 方法在 HashSet 中调用时 import java
  • 如何在 Xcode 中查看打印消息?

    如何在 Xcode 中查看运行时打印的消息 例如以下行 print Testing 按 Y 或选择 视图 gt 调试区域 gt 显示调试区域 以显示控制台输出 或 C 激活控制台 通常 当程序产生输出时 此窗口会自动打开 这是由 Xcode
  • 如何更改高图中所选点的样式?

    我想更改所选点的样式 当我选择点时 它是灰色的 我希望所有选定的点都是红色的 您设置的样式markers state select as plotOptions series allowPointSelect true marker sta
  • 如何在 f# 中将记录字段定义为数组?

    我想创建一个包含 8 个元素的字节数组类型的记录字段 但无法找出正确的语法 我做了类似的事情 let dataRecord id int data byte array let dataValues byte array Array zer
  • 如果 Rubocop 规则被内联禁用,是否需要重新启用

    If you 禁用内联 Rubocop 规则 http rubocop readthedocs io en latest configuration disabling cops within source code并且不重新启用它 是否会
  • 如果我在 Web Worker 仍在使用时继续使用 postMessage() 会发生什么?

    我对网络工作者来说还很陌生 但我有一个问题是 考虑到以下情况 我生成一个网络工作者并设置onmessageWorker 中的处理程序 然后我用postMessage 在主线程中触发Worker的onmessage 我立即打电话给另一个人po
  • 无法将 Xcode 存档提交到 Itunes Connect。 “上传存档:将 API 使用情况发送到 Itunes Connect”

    您好 我一周前通过 Xcode 6 发送了我的应用程序的一个版本 它没有任何问题 今天 我尝试通过 Xcode 上传我的应用程序的新版本 上传时 进度条停留在 将 API 使用情况发送到 Itunes Connect 它不会给我任何错误 也
  • SSL 通信中的 Apache CXF 异常:SocketTimeOut

    所以这就是交易 我有一个 Web 服务 WSDL 需要对公司网络外部进行 SOAP 调用 Web 服务是 HTTPS SOAP 并且需要客户端证书 我已经用 Java 生成了客户端代码wsdl2java 事情似乎进展顺利 我现在无法做的是通
  • 如何避免 Racket 中的加载循环?

    我有一套非常简单的 rkt来源 例如其中的 a rkt 和 b rkt 我希望能够写 require a rkt 在 b rkt 中 反之亦然 现在我面临有关 加载周期 的错误 我可以在不添加单元的情况下使用裸模块解决这个问题吗 Racke
  • java中可以使用引用传递吗?如果否 java.util.Arrays.sort 如何工作?

    我曾经认为 Java 支持按值传递和按引用传递 但我遇到了很多讨论 例如 Java 总是按值传递 无一例外 https stackoverflow com a 40499 3651739 Java 总是按值传递 https stackove