首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么说String不可变?

为什么说String不可变?

提问于 2018-04-25 09:23:32
回答 2关注 0查看 258

String a = "hello"; System.out.println(a); a = " world!!!"; System.out.println(a);

输出一个是 hello 一个world!!! 为什么说String 是不可变的。

回答 2

Frony

发布于 2018-08-14 04:01:34

这个解释起来有点复杂,要从编程语言对应的内存来讲解了。

代码是Java,Java内存管理有“程序计数器,虚拟机栈,Native方法栈,Java堆,方法区”五个区域

也就是说所有代码,将会被解析到这五个区域中。

-----------这和我的问题有什么联系呢?-------------

等号左面的数据存放在栈区,右边的数据存放在堆区。

-----------再看一下你的代码---------------------

a存放在栈区,“hello“存放在堆区。也就是说,a和“hello”,是存放在两个区域的两个变量。

=是他们的“关系”。而不是说,a与“hello”是一个变量,他们依然在两个区域独立,。

在a=“world”时,“world”在堆区新生成,此时“hello”不变。

a此时依然在栈区,a与“world”有了=关系,此时“hello”依然存在,但是没有任何栈区变量与它“有关”

则“hello”的内存空间会被JVM在下一次GC(垃圾清理)时回收

不是说“hello”变了,而是有了新的“world”。

-----------最后打个比方------------------------

“a“是个妹子,有了男友“hello”

后来“a”有了新男友“world”

但是“hello”,没有变成“world”,因为他们根本上是两个人。

Ne_biubiubiu

发布于 2018-04-25 09:56:07

不明觉厉

和开发者交流更多问题细节吧,去 写回答
相关文章
为什么String是不可变
区分对象和对象的引用 对于Java初学者, 对于String是不可变对象总是存有疑惑。看下面代码: String s = "ABCabc"; System.out.println("s = " + s);
用户9131103
2023/07/17
2110
String为什么是不可变的
我们通过查看String源码可以发现 String内部char数组是通过 private final修饰的,表示不可访问 而且String类也通过final修饰表示不可继承
@依然范特西
2022/12/12
6410
String为什么是不可变的
聊聊JAVA中 String类为什么不可变
String不可变这个话题应该是老生长谈了,你可以说它就是设计者的龟腚,然后巴拉巴拉说出一大堆优点,也可以说它忠于爱情,只要JVM存活,它便万年不变。
小柒2012
2019/12/05
4210
聊聊JAVA中 String类为什么不可变
前言 "我的风格比较偏传统和经典" 小明说,"我们在打扮自己的问题上还是蛮冒险的...我觉得当你是只狗的时候,穿什么都hold的住!" 哈哈哈,脱离单身狗快两年了,生活中除了爱情,不变的还有对代码的挚
小柒2012
2018/04/13
8120
聊聊JAVA中 String类为什么不可变
为什么不建议 for 循环里 String ++?
都说 StringBuilder 在处理字符串拼接上效率要强于 String,但有时候我们的理解可能会存在一定的偏差。最近我在测试数据导入效率的时候就发现我以前对 StringBuilder 的部分理解是错误的。后来我通过实践测试 + 找原理 的方式搞清楚了这块的逻辑。现在将过程分享给大家
开发者技术前线
2020/11/24
1.2K0
为什么不建议 for 循环里 String ++?
string不可变
String 类的字段,除了 hash 之外都声明为 final。所以,严格来说,Java 的字符串并不是不可变的。不过,hash 字段缓存的值是根据其他字段计算而来的,而这些字段的值都是不可变的,因此,只要选定了字符串的内容,那么表现出来的行为就像是不可变的一样。具有这种特性的类称为事实不可变的类——现实中很少见到这种类,程序员往往可以忽略真正不可变的数据和事实不可变的数据之间的区别。
宇宙之一粟
2021/01/13
4110
阿里云二面: String 为什么不可变?
你好,我是 Guide。今天来分享一道群友去阿里云面试遇到的 Java 基础面试真题:“String、StringBuffer、StringBuilder 的区别?String 为什么是不可变的?”。
Guide哥
2022/04/11
3680
String的内存模型,为什么String被设计成不可变的
String是Java中最常用的类,是不可变的(Immutable), 那么String是如何实现Immutable呢,String为什么要设计成不可变呢? 前言 关于String,收集一波基础,来源标明最后,不确定是否权威, 希望有问题可以得到纠正。 0. String的内存模型 Java8以及以后的字符串新建时,直接在堆中生成对象,而字符创常量池位于Metaspace。必要的时候,会把堆中的指针存入Metaspace, 而不是复制。 Metaspace位于虚拟机以外的直接内存,因此大小和外部直接内存有关
Ryan-Miao
2018/03/14
1K0
String的内存模型,为什么String被设计成不可变的
Java中的String为什么是不可变的?
众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的。不能改变状态的意思是,不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用类型的变量不能指向其他的对象,引用类型指向的对象的状态也不能改变。
Java团长
2018/08/06
8400
为什么Java里面String类是不可变的
在Java里面String类型是不可变对象,这一点毫无疑问,那么为什么Java语言的设计者要把String类型设计成不可变对象呢?这是一个值得思考的问题。
我是攻城师
2019/03/06
8320
为什么Java里面String类是不可变的
[译] 为什么String在Java中是不可变的
String 在 Java 中是不可变的。 不可变类只是一个无法修改其实例的类。 创建实例时,将初始化实例中的所有信息,并且无法修改信息。 不可变类有许多优点。 本文总结了为什么 String 设计为不可变的。 这篇文章从内存,同步和数据结构的角度说明了不变性概念。
haifeiWu
2020/02/10
1.8K0
Java 中的 String 为什么是不可变的?
本文主要探讨了Java中的String类的不可变性,从字符串字面量、字符串常量、String类的构造函数、String类的setXXX方法、以及String类的不可变子类Character等几个方面,说明了Java中的字符串底层实现以及其不可变性。同时,也通过代码示例阐述了String对象在Java中的使用方式,包括字符串字面量、字符串常量、String类的构造函数、setXXX方法以及不可变子类Character等。
Java后端工程师
2017/12/18
2K0
Java 中的 String 为什么是不可变的?
String类为什么被设计为不可变的?
String类的值是保存在value数组中的,并且是被private final修饰的
Java识堂
2020/06/30
6290
请解释一下String为什么不可变?
不可变对象是指一个对象的状态在对象被创建之后就不再变化。不可改变的意思就是说:不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用类型的变量不能指向其他的对象,引用类型指向的对象的状态也不能改变。
剑走天涯
2019/09/04
1.8K0
【面试题精讲】String 为什么是不可变的?
在 Java 中,String 是一个类,用于表示字符串。它是不可变的,即一旦创建就不能被修改。
程序员朱永胜
2023/10/09
2.3K0
Java 中 String 类为什么要设计成不可变的?
String 是 Java 中不可变的类,所以一旦被实例化就无法修改。不可变类的实例一旦创建,其成员变量的值就不能被修改。本文总结下 String 类设计成不可变的原因及好处,以及 String 类是如何设计成不可变的。
用户3596197
2018/10/15
3.7K0
STRING对象不可变的原理
string方法的修改效果是通过新建StringBuilder来实现的,更老的版本使用StringBuffer,后者是线程安全版本,但效率较低
用户4283147
2022/10/08
9131
STRING对象不可变的原理
String类不可变分析以及普通不可变类
要了解String类创建的实例为什么不可变,首先要知道final关键字的作用:final的意思是“最终,最后”。
名字是乱打的
2021/12/22
7210
String类不可变分析以及普通不可变类
为什么说 Go 语言字符串是不可变的?
最近有读者留言说,平时在写代码的过程中,是会对字符串进行修改的,但网上都说 Go 语言字符串是不可变的,这是为什么呢?
AlwaysBeta
2023/06/02
3610
面试题之  什么是不可变类? 为什么String是不可变类? 如何创建一个不可变类
面试题: 什么是不可变类? 为什么String是不可变类? 如何创建一个不可变类
全栈程序员站长
2022/07/01
4120

相似问题

登入总是说票据不工作?

1250

为什么说NFC不安全?

32.1K

Obs Studio运行不起来,说缺少dll?

1991

为什么说的条件不符合?

1208

为什么说我不满足购买条件?????

1286
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
相关问答用户
中建数科 | 技术总监架构部总经理擅长3个领域
公司公司公司公司公司公司 | 职务职务职务职务职务职务擅长3个领域
擅长5个领域
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档