Java基础面试题02:简述什么是值传递和引用传递?
面试题:简述什么是值传递和引用传递?
什么是值传递?
值传递(pass by value)是指在调用函数时,把实际参数的值复制一份传递给函数。换句话说,函数内部对参数的任何修改,都不会影响到原始的实际参数。这是因为传递的是“副本”,跟原值没直接联系。
举个例子:
func GetA(b int) int {b++ // 改的是 b 的副本return b
}func main() {a := 1resultA := GetA(a) // a 的值被复制到 bfmt.Println(resultA) // 输出 2fmt.Println(a) // a 还是 1
}
在这个例子中,a的值被复制了一份传给函数GetA,所以函数内部的修改不会影响到外面的a。
什么是引用传递?
引用传递(pass by reference)是指直接将实际参数的“地址”传递给函数。函数内的参数变动,会直接影响到实际参数的值,因为函数操作的是原始的“引用”而不是副本。
然而!许多编程语言(比如 Java 和 Go)其实并不是严格意义上的引用传递。它们传递的依然是“值”,只不过这个“值”可能是对象的引用(也就是内存地址的副本)。这点是很多人容易误解的地方。
常见误解,别踩坑!
-
“值传递是传值,引用传递是传引用。”
误!问题的关键不在传的是什么,而在于“传递的值有没有被复制”。 -
“Java 是引用传递。”
错!Java 传的是引用的副本,是“值传递”。复制了引用,实际参数地址不会被直接修改。 -
“传递基本类型是值传递,传递对象是引用传递。”
依然错!语言本质还是值传递,传对象时是引用的值被复制,而不是直接传递引用。
再补充点知识:特殊的“传共享对象调用”
传共享对象有点像引用传递的“拐弯版”。实际参数的地址被复制一份传给函数,操作的是复制后的地址,最后依然指向原始的值。你要改这个值完全没问题,但如果试图改引用本身的指向,就没用。
求值策略的简单解释
求值策略决定了参数在函数调用时是怎么被处理的。这里补充一下最常见的几种:
-
传值调用(值传递):
直接复制参数的值,函数内部改动对实际参数无影响。 -
传引用调用(引用传递):
传的是参数的引用,函数内改动会直接反映到原始参数上。 -
传共享对象调用(共享对象传递):
传递对象的引用副本,操作引用指向的值有效,改引用本身无效。
编程语言中的值传递 VS 引用传递
Go 语言的例子
package mainimport "fmt"func GetB(b int) {b++ // 改的是 b 的副本
}func main() {b := 1GetB(b)fmt.Println(b) // b 还是 1,因为改的是副本
}
还有字符串的例子:
func subString(str string, start int, end int) (*string, string) {var s = &strsubStr := str[start:end]return s, subStr
}func main() {str := "123,我们"_, result := subString(str, 0, 3)fmt.Println(result) // 输出 "123"
}
Go 永远是值传递,哪怕传递的是引用,还是复制了引用的副本。
Java 的例子
public class Main {public static void main(String[] args) {int a = 1;int b = getA(a);System.out.println(b); // 输出 2System.out.println(a); // a 还是 1}public static int getA(int b) {b++; // 改的是 b 的副本return b;}
}
字符串的例子:
public class Main {public static void main(String[] args) {String s = "123,我们";String result = subString(s);System.out.println(result); // 输出 "123"}public static String subString(String str) {return str.substring(0, 3); // 截取字符串,返回一个新字符串}
}
Java 的参数传递本质也是值传递,传递对象时传的是“引用的副本”。
小总结
- 值传递:传递的是参数的值,函数内修改对实际参数无影响。
- 引用传递:传递的是参数的引用,函数内修改直接影响实际参数。
- **Java 和 Go 的参数传递:**都是值传递。传递的可能是值的副本,也可能是引用的副本,但一定是“复制”过的东西。
记住这个逻辑,搞清“传的内容有没有被复制”,以后面试再也不慌啦!
最后说一句(求关注,求赞,别白嫖我)
最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。
这是大佬写的 7701页的BAT大佬写的刷题笔记,让我offer拿到手软
本文,已收录于,我的技术网站 cxykk.com:程序员编程资料站,有大厂完整面经,工作技术,架构师成长之路,等经验分享
求一键三连:点赞、分享、收藏
点赞对我真的非常重要!在线求赞,加个关注我会非常感激!
相关文章:
Java基础面试题02:简述什么是值传递和引用传递?
面试题:简述什么是值传递和引用传递? 什么是值传递? 值传递(pass by value)是指在调用函数时,把实际参数的值复制一份传递给函数。换句话说,函数内部对参数的任何修改,都不会影响到…...
【STL】10.set与map的模拟实现
一、源码及框架分析 SGI-STL30版本源代码,map和set的源代码在map/set/stl_map.h/stl_set.h/stl_tree.h等及个头文件中。 map和set的实现结构框架核心部分截取出来如下: // set #ifndef __SGI_STL_INTERNAL_TREE_H #include <stl_tree.h> #endif …...
Playwright(Java版) - 8: Playwright 元素交互的高级应用
在自动化测试中,处理复杂的页面交互是常见的需求。例如,应对动态加载的元素、处理弹窗与对话框、模拟拖放操作,甚至在绘图板上进行绘图操作。 1 动态元素与弹窗处理 1.1 动态元素的加载与等待 动态页面可能会导致元素在操作时尚未完全加载&…...
播放器开发之ffmpeg 硬件解码方案
硬件编解码的概念 硬件编解码是⾮CPU通过烧写运⾏视频加速功能对⾼清视频流进⾏编解码,其中⾮CPU可包括GPU、FPGA或者 ASIC等独⽴硬件模块,把CPU⾼使⽤率的视频解码⼯作从CPU⾥分离出来,降低CPU的使⽤负荷,使得平台能 ⾼效且流畅…...
n、nvm、nrm、pnpm、yarn各种指令大全
n mac的版本管理工具(可能与nvm冲突) 安装 # 使用 npm / yarn npm i -g n yarn global add n # 使用 brew brew install n环境变量 export PATH"/usr/local/n/versions/node:$PATH"命令详解 版本查看 # 查看 n 版本 n --version/-V # 查…...
数据库管理-根据日期字段进行数据筛选更新数据
项目场景 数据插入、更新、查询 数据库中一张审计表格用来记录数据的操作包括数据的id,数据名称sjmc,数据状态sjzt,数据创建时间createtime,数据更新时间updatetime。 具体需求如下: 根据数据名称更新sjzt和update…...
03. 运算符
一、运算符与表达式 运算符 就是对字面量或者变量进行操作的符号;表达式 是指用运算符把字面量或者变量连接起来,符合 Python 语法的式子。不同运算符连接的表达式体现的是不同类型的表达式;Python 中的运算符主要包括 算术运算符、赋值运算符…...
【最优清零方案——贪心+滑动窗口+线段树】
题目 代码 #include <bits/stdc.h> using namespace std; using ll long long; const int N 1e6 10; int a[N]; struct node {int l, r;int m, p, lazy; } tr[4 * N]; void pushup(node &u, node &l, node &r) {if (l.m r.m){u.m l.m;u.p max(l.p, r.…...
一个点绕任意点旋转后的点的坐标
在平面坐标上,任意点P(x1,y1),绕一个坐标点Q(x2,y2)逆时针旋转θ角度后,新的坐标设为(x, y)的计算公式: x (x1 - x2)*cos(θ) - (y1 - y2)*sin(θ) x2 ; y (x1 - x2)*sin(θ) (y1 - y2)*cos(θ) y2 ; 另一个场景应用,坐标轴绕…...
大数据面试题每日练习--HDFS是如何工作的?
HDFS(Hadoop Distributed File System)是一个分布式文件系统,设计用于存储非常大的文件。它的主要工作原理如下: NameNode:管理文件系统的命名空间,维护文件目录树和文件元数据信息。NameNode记录每个文件…...
Python的3D可视化库 - vedo (2)visual子模块 基本可视化行为
文章目录 1. visual模块的继承关系2. 基类CommonVisual的方法2.1 获取对象信息2.1.1 对象本身信息2.1.2 对象的查找表2.1.3 对象标量范围2.1.4 对象缩略图 2.2 呈现对象2.2.1 在窗口显示1.2.2 对象可见性 2.2.3 对象颜色2.2.4 对象透明度 2.3 添加标度条2.3.1 2D标度条2.3.2 3D…...
Java AIO(NIO.2)
Java AIO(Asynchronous I/O,异步I/O),也被称为NIO.2,是Java平台提供的一种处理异步输入/输出操作的机制。作为Java NIO(New I/O)的扩展,AIO引入了一些新的API和特性,旨在…...
Flink 常用问题及常用配置(有用)
一、Flink 常用问题及常用配置 参数 示例 说明 execution.checkpointing.interval 3min Checkpoint 触发间隔 state.backend rocksdb / filesystem 用于设置statebackend类型, 默认会以内存为statebackend(无法支持大状态) taskmanager.memory.jvm-overhead.max 204…...
RocketMQ: 消息过滤,通信组件,服务发现
消息过滤 1 ) 简单消息过滤 /*** 订阅指定topic下tags分别等于 TagA 或 TagC 或 TagD */consumer.subscribe("TopicTest1", "TagA || TagC || TagD");如以上代码所示,简单消息过滤通过指定多个 Tag 来过滤消息,过滤的动作在服务器进…...
linux ubuntu的脚本知
目录 一、变量的引用 二、判断指定的文件是否存在 三、判断目录是否存在 四、判断最近一次命令执行是否成功 五、一些比较符号 六、"文件"的读取和写入 七、echo打印输出 八、ubuntu切换到root用户 N、其它可以参考的网址 脚本功能强大,用起来也…...
HTTP有哪些风险?是怎么解决的?
一、风险 HTTP是通过明文传输的,存在窃听风险、篡改风险以及冒充风险。 二、如何解决 HTTPS在HTTP的下层加了一个SSL/TLS层,保证了安全,通过混合加密解决窃听风险、数字签名解决篡改风险、数字证书解决冒充风险。 (1࿰…...
3.12MayBeSomeLinearAlgebra
X是M*(D1),XT为(D1)*M Ω是一行D1列,X乘以欧米噶是M行D1列 行是说样本个数,列是特征数量 如果是小样本,那么可能会出现特征数量大于样本个数 如果MD*DM就是M*M,...
学习日志015--python单链表
创建 class Node:def __init__(self,data):# 数据域self.data data# 链接域self.next Noneclass LinkList:def __init__(self,):# 初始化头节点self.head None# 记录链表的长度self.size 0 增加 #头插def insert_head(self,value):# 创建新节点node Node(value)q self…...
如何在Windows右键新建菜单中添加自定义项
Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\.py] "Python.File"[HKEY_CLASSES_ROOT\.py\ShellNew] "NullFile"""[HKEY_CLASSES_ROOT\Python.File] "FriendlyTypeName""文本.py"[HKEY_CLASSES_ROOT\Python.Fil…...
Spring Boot 3.0废弃了JavaEE,改用了Jakarta EE
Spring Boot 3.0废弃了JavaEE,改用了Jakarta EE 历史背景 javax变成Jakarta的主要原因是因为Java EE项目从Oracle转移到了Eclipse Foundation,并改名为Jakarta EE。 JavaEE是从Java 1.2版本开始推出的Java企业级开发平台,最初的名称是J2EE(J…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化
是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可,…...
FFmpeg avformat_open_input函数分析
函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...
