java 的参数传递
一、疑惑引入
首先,我们从一个例子来引出这个问题:
public static void main(String[] args) throws IOException {List<String> mockList = Lists.newArrayList("a", "b");System.out.println("1: " + mockList);List<String> result = change(mockList);System.out.println("3: " + mockList);System.out.println("4: " + result);
}
public static List<String> change(List<String> input){List<String> result = input.stream().sorted(Comparator.comparing(String::valueOf).reversed()).collect(Collectors.toList());System.out.println("2: " + result);return result;
}
请问,1,2,3,4 处分别输出的应该是什么?
答案是:
1: [a, b]
2: [b, a]
3: [a, b]
4: [b, a]
看到这里,同学对 1,2,4 的结果肯定是不会有疑问,可能会有一部分同学会对 3 的输出有些疑问,change方法不是对序列进行了倒排,为啥3 处mockList 的序列没变,如果有这个疑问的同学,那么你有必要要认真看下本文;
常见大家理解的误区可能有以下几点:
- 值传递和引用传递,区分的条件是传递的内容,如果是个值,就是值传递。如果是个引用,就是引用传递。
- Java是引用传递。
- 传递的参数如果是普通类型,那就是值传递,如果是对象,那就是引用传递
二、概念理解
首先,要理解这个问题,我们先来了解下几个概念
2.1、形参、实参
在编程中,参数(parameters)是指在函数定义中声明的占位符,用于接收传递给函数的值。
- 形参(formal parameters)是函数定义中使用的参数名称,它们在函数定义时被声明。
- 实参(actual parameters)是在函数调用时传递给函数的实际值。
具体来说,形参是函数定义时使用的变量名,用于表示函数内部使用的值。它们在函数定义的括号内列出,并且可以有一个或多个。形参是函数内部的局部变量,只在函数内部可见和使用。
下面是一个示例函数定义,其中x和y是形参:
def add_numbers(x, y):sum = x + yreturn sum
在这个例子中,add_numbers函数接受两个形参x和y,并返回它们的和。
实参是在函数调用时传递给函数的具体值。它们是实际用于执行函数操作的值。在函数调用时,实参被传递给函数,填充形参,并在函数体内使用。
下面是调用上述函数并传递实参的示例:
result = add_numbers(3, 5)
在这个例子中,3和5是传递给add_numbers函数的实参。函数将使用这些实参来执行计算并返回结果。
以上解释来自chatGpt
显然可能有点啰嗦,喜欢直接一点的同学直接看红框
[图片]
2.2、值传递和引用传递
值传递(pass by value)是指在函数调用时,将实参的值复制一份给形参,函数内部对形参的修改不会影响到原始实参的值。
引用传递(pass by reference)是指在函数调用时,将实参的引用(地址)传递给形参,函数内部对形参的修改会影响到原始实参的值。
简单来说,值传递是对实参进行拷贝,函数内部的操作不会影响到原始实参;而引用传递是对实参的引用进行操作,函数内部的修改会影响到原始实参。
以上解释来自chatGpt
值传递和引用传递的对比如下:

三、实操
例子一
上个例子:
public static void main(String[] args) throws IOException {int i = 1;change(i);System.out.println(i);
}
public static void change(int a){a = 10;
}
输出:
1
图例:

由这个例子可见,i 的值还是1,change 方法并没有更改 i 的值,所以是不是可以得出 java 的方法传递是值传递?
那我们开始看下面这个
例子二
public static void main(String[] args) throws IOException {User user = new User();user.setName("yy");change(user);System.out.println(user.getName());
}
public static void change(User a){a.setName("xx");
}
同样是一个change方法,同样是在change方法内修改参数的值,输出:
xx
图例:

经过change方法执行后,实参的值被改变了,那按照上面2.2的引用传递的定义,实际参数的值被改变了,这不就是引用传递了么。那根据上面的两段代码,可以得出新的结论:Java的方法中,在传递普通类型的时候是值传递,在传递对象类型的时候是引用传递,真的是这样吗?其实这个表述还是有误的,不信看下面这个
例子三
public static void main(String[] args) throws IOException {String name = "yy";change(name);System.out.println(name);
}
public static void change(String input){input = "xx";
}
输出结果是:
yy
这个结果好像和上面的 在传递对象类型的时候是引用传递 的结论不符合。同样传递了一个对象,但是对象的原始值却没有改变;name为什么会是这样的呢,我们先来看下图例:
图例:

what?形参input 为啥会是新的内存地址呢?
其实,我们在change(name) 方法中想去修改name 的值,其实阴差阳错的直接修改了input 的应用地址,因为
input = “xx” 的背后是 会 new 一个 string ,把新的引用交给 input,等价于 input = new String(“xx”) 。原来的 “yy” 这个字符串还是由name 持有着,并没有修改到实际参数的值;所以 java 还是值传递,只不过对于对象参数,值是对象的引用地址;
好了,经过上面的概念理解和三个例子,大家应该基本了解了java 的参数传递,那我们把文章开头的例子改一下,输出会是什么样子呢?
public static void main(String[] args) throws IOException {List<String> mockList = Lists.newArrayList("a", "b");System.out.println("1: " + mockList);List<String> result = change(mockList);System.out.println("3: " + mockList);System.out.println("4: " + result);
}public static List<String> change(List<String> input){Collections.sort(input, Comparator.reverseOrder());System.out.println("2: " + input);List<String> result = input;return result;
}
输出:
1: [a, b]
2: [b, a]
3: [b, a]
4: [b, a]
有些同学可能会疑惑,为啥这里 3 输出的又是[b, a]呢,不是说java 是值传递, input 形参的修改不会影响到原来的 mockList 的内容吗?
其实 这里 Collections.sort(input, Comparator.reverseOrder()); 的问题,这个和 input.stream().sorted(Comparator.comparing(String::valueOf).reversed()).collect(Collectors.toList()); 的区别是:
- stream() 不会影响到原来集合的内容;Stream API 不会改变数据源,所有操作的最终结果会保存到另外一个对象中。(peek 方法除外,它会修改流中的元素)
- sort 却会改变原来内存地址指向的集合内容(本质是对List 内部的数组进行排序);
相关文章:
java 的参数传递
一、疑惑引入 首先,我们从一个例子来引出这个问题: public static void main(String[] args) throws IOException {List<String> mockList Lists.newArrayList("a", "b");System.out.println("1: " mockList);L…...
【面试长文】HashMap的数据结构和底层原理以及在JDK1.6、1.7和JDK8中的演变差异
文章目录 HashMap的数据结构和底层原理以及在JDK1.6、1.7和JDK8中的演变差异HashMap的数据结构和原理JDK1.6、1.7和1.8中的HashMap源码演变JDK1.6JDK1.7JDK1.8 总结自己实现一个简单的HashMapHashMap的时间复杂度分析HashMap的空间复杂度分析HashMap的应用场景HashMap的弊端及解…...
【25】linux进阶——网络文件系统NFS
大家好,这里是天亮之前ict,本人网络工程大三在读小学生,拥有锐捷的ie和红帽的ce认证。每天更新一个linux进阶的小知识,希望能提高自己的技术的同时,也可以帮助到大家 另外其它专栏请关注: 锐捷数通实验&…...
JAVA入坑之JAVADOC(Java API 文档生成器)与快速生成
目录 一、JAVADOC(Java API 文档生成器) 1.1概述 1.2Javadoc标签 1.3Javadoc命令 1.4用idea自带工具生成API帮助文档 二、IDEA如何生成get和set方法 三、常见快捷方式 3.1快速生成main函数 3.2快速生成println()语句 3.3快速生成for循环 3.4“…...
React | React组件化开发
✨ 个人主页:CoderHing 🖥️ React .js专栏:React .js React组件化开发 🙋♂️ 个人简介:一个不甘平庸的平凡人🍬 💫 系列专栏:吊打面试官系列 16天学会Vue 11天学会React Node…...
云计算的优势与未来发展趋势
一、前言二、云计算的基础概念2.1 云计算的定义2.2 云计算的发展历程2.3 云计算的基本架构2.4 云计算的主要服务模式 三、企业采用云计算的优势3.1 降低成本3.2 提高效率和灵活性3.3 提升信息系统的安全性和可靠性3.4 拥有更加丰富的应用和服务 四、行业应用案例4.1 金融行业4.…...
shell编程lesson01
命令行和脚本关系 命令行:单一shell命令,命令行中编写与执行; 脚本:众多shell命令组合成一个完成特定功能的程序,在脚本文件中进行编写维护。 脚本是一个文件,一个包含有一组命令的文件。 编写一个shel…...
看看人家的MyBatis批量插入数据优化,从120s到2.5s,那叫一个优雅!
粗略的实验 最后 最近在压测一批接口的时候,我发现接口处理速度比我们预期的要慢。这让我感到有点奇怪,因为我们之前已经对这些接口进行了优化。但是,当我们进行排查时,发现问题出在数据库批量保存这块。 我们的项目使用了 myb…...
软件和信息服务业专题讲座
软件和信息服务业专题讲座 单选题(共 10 题,每题 3 分) 1、根据本讲,我国要加强物联网应用领域()开发和应用。 A、大数据 2、根据本讲,要充分发挥软件对城市管理和惠民服务的(&am…...
由 ChatGPT 团队开发,堪称辅助神器!IntelliJ IDEA 神级插件
什么是Bito? 为什么要使用Bito? 如何安装Bito插件 如何使用Bito插件 什么是Bito? Bito是一款由ChatGPT团队开发的IntelliJ IDEA编辑器插件,旨在提高开发人员的工作效率。此插件强大之处在于它不仅可以帮助开发人员更快地提交…...
spass modeler
课时1:SPSS Modeler 简介 本课时一共分为五个模块,分别是Modeler概述、工具安装、窗口说明以及功能介绍和应用案例。相信通过本课时内容的学习,大家将会对SPSS Modeler有个基础的了解. 在学习本节课内容之前,先来看看本节课我们究…...
kafka的push、pull分别有什么优缺点
文章目录 kafka的push、pull分别有什么优缺点Push 模式优点缺点 Pull 模式优点缺点 实践操作 kafka的push、pull分别有什么优缺点 Kafka 是由 Apache 软件基金会开发的一个开源流处理平台,广泛应用于各大互联网公司的消息系统中。在 Kafka 中,生产者使用…...
【Canvas入门】从零开始在Canvas上绘制简单的动画
这篇文章是观看HTML5 Canvas Tutorials for Beginners教程做的记录,所以代码和最后的效果比较相似,教程的内容主要关于这四个部分: 创建并设置尺寸添加元素让元素动起来与元素交互 设置Canvas的大小 获取到canvas并设置尺寸为当前窗口的大…...
【技术整合】各技术解决方案与对应解决的问题
文章目录 基本实现性能安全 本文将框架分为三大类: 基本实现:包括某个供能或者提供web、移动端、桌面端、或者上述端上的某种功能性能:提升高可用、高并发的框架安全:包括网络安全、权限与容灾等 基本实现 .NET CORE、.NET web基…...
公网远程访问公司内网象过河ERP系统「内网穿透」
文章目录 概述1.查看象过河服务端端口2.内网穿透3. 异地公网连接4. 固定公网地址4.1 保留一个固定TCP地址4.2 配置固定TCP地址 5. 使用固定地址连接 概述 ERP系统对于企业来说重要性不言而喻,不管是财务、生产、销售还是采购,都需要用到ERP系统来协助。…...
Win11的两个实用技巧系列之修改c盘大小方法、功能快捷键大全
Win11 c盘无法更改大小什么原因?Win11修改c盘大小方法 有不少朋友反应Win11 c盘无法更改大小是怎么回事?本文就为大家带来了详细的更改方法,需要的朋友一起看看吧 Win11 c卷无法更改大小什么原因?有用户电脑的系统盘空间太小了,…...
离散数学下--- 代数系统
代数系统 定义: 代数系统是用代数运算构造数学模型的方法。 • 通过构造手段生成,所以也称代数结构 • 代数运算:在集合上建立满足一定规则的运算系统 (一)二元运算 二元运算的定义 二元运算需要满足的两个条件&a…...
java基础入门-04
Java基础入门-04 11、集合&学生管理系统11.1.ArrayList集合和数组的优势对比:11.1.1 ArrayList类概述11.1.2 ArrayList类常用方法11.1.2.1 构造方法11.1.2.2 成员方法11.1.2.3 示例代码 11.1.3 ArrayList存储字符串并遍历11.1.3.1 案例需求11.1.3.2 代码实现 11…...
《面试1v1》java反射
我是 javapub,一名 Markdown 程序员从👨💻,八股文种子选手。 面试官: 你好,请问你对 Java 反射有了解吗? 候选人: 是的,我了解一些。 面试官: 那你能简单…...
【C语言】struct结构体
文章目录 一. 结构体简述二. 结构体的声明和定义1、简单地声明一个结构体和定义结构体变量2、声明结构体的同时也定义结构体变量3、匿名结构体4、配合typedef,声明结构体的同时为结构体取别名5、在声明匿名结构体时,使用typedef给这个匿名结构体取别名 三…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
前言:本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中,跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南,你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案,并结合内网…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...
