对String值不可变的理解以及String类型的引用传递问题

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

今天复习java时,突然注意到了一句以前没有注意过的一句话,String 是final修饰的,其值是不可变的。当时看的一脸懵逼,String str = "abc"; str = "abcde"这两行代码没有任何的错误的。上网百度了许久,还是整理下来防止以后忘记吧。

首先要理解的是,string说的不可变是其值不可变,比如String str = "abc",不可变值得是abc不可变,当我们str = “abcde”时,abc没有被销毁,仍然存放在常量池中,只不过是让str指向了“abcde”的内存地址。所以就算不停的赋值,改变的也只是str引用的地址问题,右边的值是不改变的。就举个String类型的引用传递来详细说明下吧

public class Test {
	
	public static String appStr(String a){
		a += "bbb";
		return a;
	}
	
	public static StringBuilder appSb(StringBuilder sb){
		sb.append("bbb");
		return sb;
	}
	
	public static void main(String[] args) {
		String s = "aaa";
		String s2 = Test.appStr(s);
		//注意这边打印的是s,不是s2
		System.out.println(s);
		
		StringBuilder sb = new StringBuilder("aaa");
		StringBuilder sb2 = Test.appSb(sb);
		//注意这边打印的是sb,不是sb2
		System.out.println(sb.toString());
	}
}
上输代码的输出结果是

aaa
aaabbb

下面来分析一下当运行到Test.appStr(s)时,将s(实参)的地址传递给a(形参),此时a="aaa",a+="bbb"之后,a="aaabbb",但是由于string是不可变的,所以在内存上就会重新分配一片内存空间给aaabbb,然后a指向该地址;而s的指向地址却没有发生改变,所以s的值打印出来仍然是aaa;

同理分析StringBuilder,也是引用类型,传递的是地址值,当形参sb传递给实参sb之后,方法对sb进行了修改,sb的值发生了改变(并不像string一样值不可变,重新分配空间),所以运行之后sb的指向值就发生了改变,随后打印的就是aaabbb了。

这样应该就可以理解String的不可变了。

大数据之VIP(Virtual IP,虚拟IP)负载均衡 VIP(Virtual IP,虚拟IP)负载均衡是一种在计算机网络中常用的技术,用于将网络请求流量均匀地分散到多个服务器上,以提高系统的可扩展性、可靠性和性能。 阅读详情

相关推荐

NVIDIA驱动版本太低?手把手教你解决CUDA与PyTorch版本冲突问题

本文针对深度学习开发中常见的NVIDIA驱动版本过低导致的CUDA与PyTorch版本冲突问题,提供了从根源理解到实战解决的完整指南。文章详细解析了驱动、CUDA与PyTorch的依赖关系,并给出了升级驱动、降级PyTorch、使用Conda环境管理及Docker容器化四种核心解决方案,帮助开发者快速诊断并构建稳定的GPU开发工作流。

grpc6streamer的博客 968

Python基础语法题库

Python基础语法题库 语法练习包括Python基础语法、数据类型、字符编码和简单文件操作等内容。 1、Python 里用来告知解释器跳过当前循环中的剩余语句,然后继续进行下一轮循环,此关键词是continue。 2、Python的设计具有很强的可读性,相比其他语言具有的特色语法有以下选项,正确的是(ABC): A.交互式 B.解释型 C.面向对象 D.服务端语言 3、Python中==运算符比较两个对象的值,下列选项中哪一个是is比较对象的因素(A): A.id(...

lybc2019的博客 2万+

深入解析FDTD Script中的farfieldpolar3d命令:复电场计算与应用

本文深入解析了FDTD仿真中`farfieldpolar3d`命令的核心功能与应用。作为`farfield3d`的复数版本,该命令能计算并返回球坐标系下的复电场矢量,完整保留振幅与相位信息,为光学天线设计、近远场变换及偏振态分析等高级应用提供了关键数据基础。

grafana6viz的博客 286

面试常问(一):String 为什么是final的?

final 的定义,final关键字可以用来修饰类,方法,变量。 修饰类时,该类不可以被继承; 修饰方法时,该方法不可以被子类重写; 修饰变量时,该变量为常量,需要进行初始化赋值操作,且只能被赋值一次,不可再改变。 虽然引用变量被final修饰之后,虽然不能再指向其他对象,但是它指向的对象的内容是可变的。stack栈里的引用地址不可变,但heap堆里的数据却是可以改变的。 虽然引用地址还是同一个,但数组里的内容已经发生了变化。 那么String为什么不可变? 在String源码里,除了String类被

Ferkl的博客 606

在Windows11上安装ubuntu版linux系统并实现桌面图形化(WSL)

在Windows11上安装ubuntu版linux系统并实现桌面图形化(WSL),xfce桌面美化、安装google-chrome

NiKoJJ‘s Blog 1万+

kaggle:Digit Recognizer《手写数字识别》你的第一个图像识别竞赛项目

新手,入门,巩固复习,深度学习,图像识别

qq_63591092的博客 3097

常用包,String类,StringBuffer类,克服传值引用

Java常用的包有以下几个:Java.lang,这个 包通常不用import导入,他会自动被东如,包含有String,Math,Integer,System,Runtime等类;Java.applet 包含有创建小应用程序的类;Java.awt,编写与平台无关的图形界面(GUI)Java.io,输入输出操作Java.net   网络链接Java.util  使用工具类,数据结构相关;-----

翔宇.杨的技术仓库 3515

华为od 面试八股文_Python_02_含答案

华为od 面试八股文_Python_02_含答案

MISAYAONE的博客 4532

String是如何保证不变的?反射为什么可以改变String的值?

String底层是使用final修饰的字符数组 value[] 来存储字符,而数组是引用类型,引用类型的值是内存中的地址,地址在初始化之后不可变,所以String的值不可变。

liulei952413829的博客 1668

联邦学习中的差分隐私保护详解及python实现

随着数据隐私法规(如 GDPR、CCPA)日益严格,传统将数据集中到云端训练模型的方式面临合规与安全风险。联邦学习通过让各客户端保留本地数据,仅共享模型更新,缓解了数据流动带来的隐私风险。但模型更新仍可能泄露个体信息。为进一步保障隐私,可在本地更新中引入差分隐私(DP)机制,通过向梯度或模型更新中注入随机噪声,防止反向推断原始数据citeturn0search9。

闲人编程的博客 1920

【华为OD机试真题】29、组成最大数 | 机试真题+思路参考+代码解析 (C++、Java、Py、C语言、JS)

题目描述 >小组中每位都有一张卡片,卡片上是6位内的正整数,将卡片连起来可以组成多种数字,计算组成的最大数字

KJ.JK 2418

dll动态库返回string变量错误问题

最近做一个软件,要求自己编写dll文件并调用,在返回string变量时一直错误。在摸索之下,发现在debug模式下返回值正常,而在release之下程序会崩溃,并报错堆栈溢出。调试下,发现是string变量出了问题。 于是,百度,查阅资料,将运行库修改为MD,生成的dll文件在release下使用正常。 在调试模式下,使用调试运行库:多线程调试(/MTd)、多线程调试DLL(/MDd) 在发布模式下,使用发布运行库:多线程(/MT)、多线...

qq_38762905的博客 1116

多周期路径约束(set_multicycle_path )

1.由慢到快的多周期约束 如下图所示,发射时钟周期是接受时钟周期的4倍。默认情况下,按照1T原则来进行静态时序分析和布局布线的。即建立时间是在发射沿后的第一个捕获沿检查,而保持时间是同一时刻下源时钟和捕获时钟的触发边沿下检查的(建立时间检查边沿的前一个触发沿)。 但是这样导致的问题就是该路径过于苛刻,为了满足这条路径的要求,不得不放弃其他路径。或者根本没办法保证这个默认的约束。总之最终造成...

Arist. 5506

String值不可变类和引用传递的讨论

今天复习java时,突然注意到了一句以前没有注意过的一句话,String 是final修饰的,其值是不可变的。当时看的一脸懵逼,String str = "abc"; str = "abcde"这两行代码没有任何的错误的。上网百度了许久,还是整理下来防止以后忘记吧。首先要理解的是,string说的不可变是其值不可变,比如String str = "abc",不可变值得是abc不可变,当我们str ...

caisongcheng_good的博客 394

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

一文带你搞清String是值传递还是引用传递?

String中的坑 最近看到一道关于String的面试题,差点让我以为String是值传递,就是下面这个例子,体验下: ​ public class Demo{ public static void main(String[] args) { Demo d = new Demo(); String str = "BEA"; d.change(str); System.out.println(str); } void ch

Apple_Boy的博客 9742

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java 中String到底是值传递还是引用传递的问题

1.String中的坑   最近看到一道关于string的面试题,差点让我以为string是值传递,就是下面这个例子,体验下: 1 2 3 4 5 6 7 8 9 10 11 12 public class demo{ public static void main(string[] args) { demo d =new de...

zyz的博客 7628

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

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

java是值传递还是引用传递

java是值传递;值传递是指在调用方法时将实际参数拷贝一份传递到方法中,这样在方法中如果对参数进行修改,将不会影响到实际参数;当传的是基本类型时,传的是值的拷贝,对拷贝变量的修改不影响原变量;当传的是引用类型时,传的是引用地址的拷贝,但是拷贝的地址和真实地址指向的都是同一个真实数据,因此可以修改原变量中的值。

u014212540的博客 6600

Java中值传递和引用传递的理解

一、基本类型和引用类型的理解Java中的数据类型分为两种为基本类型和引用类型。1、基本类型的变量保存原始值,所以变量就是数据本身。常见的基本类型:byte,short,int,long,char,float,double,Boolean,returnAddress。2、引用类型的变量保存引用值,所谓的引用值就是对象所在内存空间的“首地址值”,通过对这个引用值来操作对象。常见的引用类...

Norte_L的博客 5万+

你真的理解Java的按引用传递吗?

首先我们来看下面这段代码:public class Test1 { String a = "123"; public static void change(Test1 test) { test.a="abc"; } public static void main(String[] args) { Test1 test1=new

weiersyuan的专栏 1万+

String作为参数传递到底是值传递还是引用传递?

我们首先看一下下面这样一段代码,它的输出结果是什么? public static void main(String[] args) { String s=new String("张三"); change(s); System.out.println(s); } public static void change(String s){ s="李四"; } 我一开始一看,String是引用类型,引用类型是引用传递。那么结果应.

IABQL的博客 3434

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

前言 前段时间在群里看到类似这样一个问题,下面的代码会输出什么呢? public void test() { String str = "hello"; change(str); System.out.println(str); } private void change(String str) { str = "world"; } 当时看到这题,瞬间勾起了我的回忆。遥想当年,也曾经碰到过类似的问题,当时研究了好久才搞明白,这里再记录一下这个问题的思路。 先来说一下答案:输出:he

pipi蛋 2776

如何正确理解Java中String 的 “值引用”

String。

Sakuragiquot的博客 687

integer是值传递还是引用传递_Java到底是引用传递还是值传递

前言前段时间在群里看到类似这样一个问题,下面的代码会输出什么呢?publicvoidtest(){Stringstr="hello";change(str);System.out.println(str);}privatevoidchange(Stringstr){str="world";}当时看到这题,瞬间勾起了我的回忆。遥想当年,也曾经...

weixin_39525617的博客 1806

值传递还是引用传递(int,String,引用类型)

String是值传递还是引用传递 今天上班时,同事发现了一个比较有意思的问题。他把一个String类型的参数传入方法,并在方法内改变了引用的值。 然后他在方法外使用这个值,发现这个String还是之前的值,并没有改变。 这里要向大家介绍一下,大家都知道java在传参时分为值传递 和 引用传递 。参数为基本类型时是值传递, 参数为封装类型时是引用传递。例如: 1. 基本类型参数 public cla...

ratel的博客 994

Java基本数据类型与引用类型参数传递及String、StringBuild、StringBuffer类型作为形参传递

Java基本数据类型与引用类型参数传递及String类型、StringBuild和StringBuffer作为形参传递。String的几种创建方式

ProGram_Java521的博客 1827
上一篇: 对bibernate中inverse的理解
Tomake
博客等级 码龄11年 1粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值