面试官:String是值传递还是引用传递

Java 中的参数传递是按值还是按引用? Java 中,所有方法参数都是值传递。String的不可变性进一步确保了它的原始值不会被修改。理解String的不可变性和值传递的机制,有助于更好地编写和调试代码。类型传递方式方法内操作对原变量的影响基本数据类型值传递不会影响原变量不可变类引用值的副本传递不会影响原变量可变引用类型引用值的副本传递可能通过引用修改原变量指向对象的内部状态。 阅读详情

本文已收录GitHub,更有互联网大厂面试真题,面试攻略,高效学习资料等

把一个String类型的参数传入方法,并在方法内改变了引用的值。 然后在方法外使用这个值,发现这个String还是之前的值,并没有改变。

这里要向大家介绍一下,大家都知道java在传参时分为值 传递 和 引用传递 。参数为基本类型时是值传递, 参数为封装类型时是引用传递。例如:

基本类型参数

public class Test {
    public static void main(String[] args) {
        int num = 0 ;
        changeNum(num);
        System.out.println("num="+num);
    }
 
    private static void changeNum(int num) {
        num = 1;
    }
}

打印的结果是num=0。

封装类型参数

public class Test {
    public static void main(String[] args) {
        Product p = new Product();
        p.setProName("before");
        p.setNum(0);
        changeProduct(p);
        System.out.println("p.proName="+p.getProName());
        System.out.println("p.num="+p.getNum());
    }
 
    private static void changeProduct(Product p) {
        p.setProName("after");
        p.setNum(1);
    }
}
 
class Product {
    private int num;
    private String proName;
 
    public int getNum() {
        return num;
    }
 
    public void setNum(int num) {
        this.num = num;
    }
 
    public String getProName() {
        return proName;
    }
 
    public void setProName(String proName) {
        this.proName = proName;
    }
}

运行的结果是:p.proName=after和p.num=1 。

上面的两个例子是明显的值传递和引用传递。但是如果参数是String类型呢?我们看一下具体的例子:

public class Test {
    public static void main(String[] args) {
        String str = "ab";
        changeString(str);
        System.out.println("str="+str);
    }
 
    private static void changeString(String str) {
        str = "cd";
    }
}

大家猜一下运行结果是什么呢?按照前面的例子,String应该是一个封装类型,它应该是引用传递,是可以改变值得, 运行的结果应该是”cd”。我们实际运行一下看看,

str=ab,这如何解释呢?难道String是基本类型?也说不通呀。

这就要从java底层的机制讲起了,java的内存模型分为 堆 和 栈 。

  1. 基本类型的变量放在栈里;
  2. 封装类型中,对象放在堆里,对象的引用放在栈里。

java在方法传递参数时,是将变量复制一份,然后传入方法体去执行。 这句话是很难理解的,也是解释这个 问题的精髓。我们先按照这句话解释一下基本类型的传递

  • 虚拟机分配给num一个内存地址,并且存了一个值0.
  • 虚拟机复制了一个num,我们叫他num’,num’和num的内存地址不同,但存的值都是0。
  • 虚拟机讲num’传入方法,方法将num’的值改为1.
  • 方法结束,方法外打印num的值,由于num内存中的值没有改变,还是0,所以打印是0.

我们再解释封装类型的传递:

  • 虚拟机在堆中开辟了一个Product的内存空间,内存中包含proName和num。
  • 虚拟机在栈中分配给p一个内存地址,这个地址中存的是1中的Product的内存地址。
  • 虚拟机复制了一个p,我们叫他p’,p和p’的内存地址不同,但它们存的值是相同的,都是1中Product的内存地址。
  • 将p’传入方法,方法改变了1中的proName和num。
  • 方法结束,方法外打印p中变量的值,由于p和p’中存的都是1中Product的地址,但是1中Product里的值发生了改变, 所以,方法外打印p的值,是方法执行以后的。我们看到的效果是封装类型的值是改变的。

最后我们再来解释String在传递过程中的步骤:

  • 虚拟机在堆中开辟一块内存,并存值”ab”。
  • 虚拟机在栈中分配给str一个内存,内存中存的是1中的地址。
  • 虚拟机复制一份str,我们叫str’,str和str’内存不同,但存的值都是1的地址。
  • 将str’传入方法体
  • 方法体在堆中开辟一块内存,并存值”cd”
  • 方法体将str’的值改变,存入5的内存地址
  • 方法结束,方法外打印str,由于str存的是1的地址,所有打印结果是”ab”

这样我们理解了java在方法传参的整个过程。其实还是上面那句比较重要的话 java在方法传递参数时,是将变量复制一份,然后传入方法体去执行。

时序基础模型Timer-S1:十亿参数如何革新时间序列预测 时间序列预测是数据分析与机器学习中的核心任务,旨在基于历史数据预测未来趋势。其原理在于捕捉数据中的趋势、周期性和季节性等时序依赖关系。这项技术的价值在于赋能业务决策,广泛应用于金融风控、能源管理、物联网监控和供应链优化等关键场景。传统方法依赖针对特定任务的专用模型,面临泛化能力弱和开发成本高的挑战。本文聚焦的时序基础模型,通过在海量跨领域数据上进行预训练,学习时序通用模式,并结合十亿级参数带来的强大容量,实现了性能的显著突破。这种范式转变,使得模型能够像“全科医生”一样,通过少量数据微调即可快速适应新任务, 阅读详情

相关推荐

[南大ICS]PA1 - 开天辟地的篇章: 最简单的计算机

task PA1.1: 实现单步执行, 打印寄存器状态, 扫描内存 task PA1.2: 实现算术表达式求值 task PA1.3: 实现所有要求, 提交完整的实验报告

qq_42474104的博客 1570

C++——结构里引用string

C++——结构里引用string 在写练习题时,开头定义结果就遇到了问题 #include<iostream> #include<string> struct CandyBar { string brand; double weight; int cal; }; 这里的string发生了错误,于是我查找了资料 在关于struct结构体中string的问题这篇文章中说 “string是对象,不是一段内存,不适合放在结构体中” 但以我现在的水平还无法理解(等以后回来打

梁翊洲的学习体会 1658

Eureka自我保护机制

Eureka自我保护机制 默认情况下,当eureka server在一定时间内没有收到实例的心跳,便会把该实例从注册表中删除(默认是90秒),但是,如果短时间内丢失大量的实例心跳,便会触发eureka server的自我保护机制,比如在开发测试时,需要频繁地重启微服务实例,但是我们很少会把eureka server一起重启(因为在开发过程中不会修改eureka注册中心),当一分钟内收到的心跳数大量减少时,会触发该保护机制。可以在eureka管理界面看到Renews threshold和Renews(last

Soul_Ming的博客 543

结构体中存在string类型成员

#include #include #include using namespace std; typedef struct node{ string str; }NODE; int main(){ string var = "lirao"; NODE * node = (NODE *)malloc (sizeof(NODE)

从今以后... 9822

macOS Jdk1.8安装(目前主流版本的jdk)

添加环境环境变量,类似于windows的高级设置中path配置的环境变量。查看 JAVA_HOME 目录。查看 JDK 版本信息。一直下一步安装就好了。在终端的根目录下运行。

m0_50207524的博客 9353

数理统计四大分布---正态分布、卡方分布、学生t分布和F分布

在统计学上,我们会遇到一些常见的分布,除了正态分布外,,如t检验对应的t分布,检验对应的分布,方差分析对应的F分布等。这些分布是统计学的基础,在假设检验、方差分析等领域都起着至关重要的作用。在此,我们对这四种分布做详细的介绍,并附上MATLAB代码。 四种分布的讲解摘自MATLAB 2016的统计学和机器学习工具箱,有兴趣的可以去查看英文原版。 另外,为了方便,上传文档为图片格式,可能有些模糊...

suncangan的博客 5万+

string与参数引用传递

编者语:书上都说string是引用类型,但事实上我所看到的string和所谓的值类型没有什么区别,但通过看以下的文章,明白了:1、string a="abc";之后,如果a="xy",则是a并没有改变内存中已经存在的"abc",而是又创建了另外一个实例。实际上相当于:string a=new String("abc");a=new String("xy");但如果是StringBuffer,则

阿龙的专栏 1万+

MOS管开关设计知识-(五种MOS管开关电路图方式)

在使用MOS管设计开关电源或者马达驱动电路的时候,大部分人都会考虑MOS的导通电阻,最大电压等,最大电流等,也有很多人仅仅考虑这些因素。这样的电路也许是可以工作的,但并不是优秀的,作为正式的产品设计也是不允许的。 下面是我对MOSFET及MOSFET驱动电路基础的一点总结,其中参考了一些资料,非全部原创。包括MOS管的介绍,特性,驱动以及应用电路。 1、MOS管种类和结构 MOSFET管是FET的...

树卡花 7万+

String 是值传递还是引用传递

String是引用类型,只是编译器对其做了特殊处理。 string最为显著的一个特点就是它具有恒定不变性:我们一旦创建了一个string,在managed heap 上为他分配了一块连续的内存空间,我们将不能以任何方式对这个string进行修改使之变长、变短、改变格式。所有对这个string进行各项操作(比如调用ToUpper获得大写格式的string)而返回的string,实际上另一个重新创建的string,其本身并不会产生任何变化。 string 对象称为不可变的(只读),因为一旦创建了该对象,就不能修

qq_42360413的博客 1465

CarSim仿真高级进阶---VS 命令行

仿真软件作为一种强大的工具,被广泛应用于汽车工程领域,本文将介绍如何使用VS命令行进行CarSim仿真的高级进阶操作,我们将结合相关的源代码和描述,帮助读者更好地理解和应用这一功能。打开Visual Studio,在“文件”菜单下选择“新建”->“项目”,然后选择“控制台应用程序”模板,填写项目名称和位置,点击“确定”按钮创建项目。保存源代码后,点击菜单中的“生成”->“生成解决方案”来构建项目,确保构建成功,没有任何错误。点击“编辑”按钮,在弹出的窗口中点击“新建”按钮。,并拥有有效的许可证。

weixin_50547796的博客 308

CloudCompare 二次开发(41)——点云重建三维凸包并计算体积

本文介绍了如何结合PCL与CloudCompare实现点云三维凸包的构建与可视化。通过代码集成,在CloudCompare界面添加功能按钮,实现点云数据转换、凸包构建、体积计算以及可视化显示。具体步骤包括:1) 在UI中添加功能按钮;2) 将点云数据转换为PCL格式;3) 使用PCL的ConvexHull算法构建三维凸包;4) 计算并显示凸包体积;5) 将结果以点云和网格形式可视化显示。最终实现了点云凸包的自动构建与体积计算功能,为点云处理提供了实用工具。

点云侠的博客 193

String是值传递还是引用传递

String是值传递还是引用传递 首先:java在方法传递参数时,是将变量复制一份,然后传入到方法体内去执行! 基本数据类型:将值复制一份,传入到方法体 引用数据类型:栈中存放内存地址,堆中存放实际的值。我理解为钥匙和门。这里复制的实际是钥匙的值,比如OX123456,在方法体内,如果不new 一个新的对象(新建一个带钥匙的房子),直接改变值(set方法),就成功改变对象的值 @Test public void testStr(){ //单元测试不能是静态的static String str="123";

qingyuanww的博客 1652

信奥赛csp初赛高频考点【位运算】(详细解析)

信奥赛csp初赛高频考点【位运算】(详细解析)

王老师青少年编程 371

当面试官问我————Java是值传递还是引用传递?

面试官:你好,你能说出下面个程序的执行结果吗? public class Test { public static void main(String[] args) { String name = "Scott"; int age = 5; User user = new User(); user.setName(name); user.setAge(age); S...

Morty的技术乐园 7815

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

面试官刁难:Java字符串可以引用传递吗?

老读者都知道了,六年前,我从苏州回到洛阳,抱着一幅“海归”的心态,投了不少简历,也“约谈”了不少面试官,但仅有两三个令我感到满意。其中有一位叫老马,至今还活在我的手机通讯录里。他当时扔了一个面试题把我砸懵了:“王二,Java 字符串可以引用传递吗?” 我当时二十三岁,正值青春年华,从事 Java 编程已有 N 年经验(N < 4),自认为所有的面试题都能对答如流,结果没想到啊,被“刁难”了—...

沉默王二 1万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java 到底是值传递还是引用传递?

先说下答案: Java中其实还是值传递的,只不过对于对象参数,值的内容是对象的引用。 如果参数是基本类型,传递的是基本类型的字面量值的拷贝。 如果参数是引用类型,传递的是该参量所引用的对象在内存中地址值的拷贝。 一句话概括值传递和引用传递的区别: 值传递是传递实参副本,函数修改不会影响实参;引用传递是传递实参地址,函数修改会影响实参。 下面一个简单的面试题解释下: 面试官:你好,你能说出下面个程序的执行结果吗? public class Test { public static

水逆呱的博客 2392

integer是值传递还是引用传递_面试官:Java为什么只有值传递?

面试官爱问的一个基础问题:Java是值传递还是引用传递?想必大家都对这个问题都有自己的看法,那到底事实是怎样的,我们又该如何回答面试官这个问题呢?今天咱们就来好好分析一波值传递?引用传递?首先,我们得先知道什么叫值传递,什么叫引用传递,知道这个才能理解Java到底如何做的。若想理解这两种传递需要先理解形式参数和实际参数两个概念形式参数:定义函数时使用的参数,用来接收函数传入参数,比如我们...

weixin_39680380的博客 111

面试官:Java 到底是值传递还是引用传递?

点击上方 "程序员小乐"关注,星标或置顶一起成长后台回复“大礼包”有惊喜礼包!关注订阅号「程序员小乐」,收看更多精彩内容每日英文When you are free fr...

程序员小乐 326

C# 值传递和引用传递

一、首先介绍一下值类型和引用类型:值类型:int ,double,char,decimal,bool,enum,struct类型都是值类型。 引用类型:string ,数组,自定义类,集合,object,接口都是引用类型。二、两者在内存的区别:值类型存在堆上,引用类型存在栈上。三、值传递和引用传递。static void Main(string[] args) {

iilegend的博客 2311

面试官:Java为什么只有值传递

面试官爱问的一个基础问题:Java是值传递还是引用传递? 想必大家都对这个问题都有自己的看法,那到底事实是怎样的,我们又该如何回答面试官这个问题呢?今天咱们就来好好分析一波 值传递?引用传递? 首先,我们得先知道什么叫值传递,什么叫引用传递,知道这个才能理解Java到底如何做的。若想理解这两种传递需要先理解形式参数和实际参数两个概念 形式参数: 定义函数时使用的参数,用来接收函数传入参数,比如我们写个函数,函数中的参数为形式参数 public void test(String str) { //str为.

100

面试官:Java为什么只有值传递?

面试官爱问的一个基础问题:Java是值传递还是引用传递?想必大家都对这个问题都有自己的看法,那到底事实是怎样的,我们又该如何回答面试官这个问题呢?今天咱们就来好好分析一波值传递?引用传递...

互扯程序的博客 102

integer是值传递还是引用传递_Java只有值传递!为什么?

面试官爱问的一个基础问题:Java是值传递还是引用传递?想必大家都对这个问题都有自己的看法,那到底事实是怎样的,我们又该如何回答面试官这个问题呢?今天咱们就来好好分析一波值传递?引用传递?首先,我们得先知道什么叫值传递,什么叫引用传递,知道这个才能理解Java到底如何做的。若想理解这两种传递需要先理解形式参数和实际参数两个概念形式参数: 定义函数时使用的参数,用来接收函数传入参数,比如我...

weixin_39886841的博客 196

面试官:兄弟,说说Java到底是值传递还是引用传递?

01、值传递 VS 引用传递 首先,我们必须要搞清楚,到底什么是值传递,什么是引用传递,否则,讨论 Java 到底是值传递还是引用传递就显得毫无意义。 当一个参数按照值的方式在两个方法之间传递时,调用者和被调用者其实是用的两个不同的变量——被调用者中的变量(原始值)是调用者中变量的一份拷贝,对它们当中的任何一个变量修改都不会影响到另外一个变量。 而当一个参数按照引用传递的方式在两个方法之间传递时,...

pythonadiou的博客 355

面试官刁难:Java 字符串可以引用传递吗?

作者 |沉默王二 本文经授权转自公众号沉默王二(ID:cmower) 老读者都知道了,六年前,我从苏州回到洛阳,抱着一幅“海归”的心态,投了不少简历,也“约谈”了不少面试官,但仅有两三个令我感到满意。其中有一位叫老马,至今还活在我的手机通讯录里。他当时扔了一个面试题把我砸懵了:Java 字符串可以引用传递吗? 我当时二十三岁,正值青春年华,从事 Java 编程已有 N 年经验...

程序人生的博客 776

Java是值传递还是引用传递?

面试官:你好,你能说出下面个程序的执行结果吗? public class Test { public static void main(String[] args) { String name = "Scott"; int age = 5; User user = new User(); user.setName(name); user.setAge(age); System.out....

qq_43511948的博客 180
上一篇: 为什么互联网大厂都愿意用Mybatis?MyBatis缓存特性你了解吗?
下一篇: Java程序员面试必备的网络编程基本网络概念
Java_Cappuccino
博客等级 码龄7年 17粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值