【第22期】观点:IT 行业加班,到底有没有价值?

Java String是不可变的(immutable)

翻译 2015年11月19日 00:49:22

原文:Diagram to show Java String’s Immutability
翻译:get-set


有几个图表来说明Java String的不变性。

1. 声明一个String

String s = "abcd";

s保存了对字符串对象abcd的引用,如下图中的箭头。
这里写图片描述

2. 将字符串赋值给另一个字符串变量

String s2 = s;

s2保存了同样的引用值,因为是同样的字符串对象。
这里写图片描述

3. 字符串相加

s3 = s + "ef";
s4 = s3 + "gh";

本文的几张图跟原文都有不同,不同在于字符串保存的位置。
这里写图片描述
原文将ss2都放到堆内存中,这是错误的。双引号创建的字符串会自动作为常量保存在方法区里的常量区,即使是"abcd"+"ef"这样的字符串由于编译期优化,也是直接作为"abcdef"字符串对象直接放到常量区的。
s3 = s + "ef";中,由于s是变量,因此编译器会将s3放到堆内存中。而s4并未指向s3原本的对象,却从新创建了一个拼接后的字符串对象,可见String是不可变的对象。

总结

一旦字符串在内存中创建,它就是不可变的,所有的对String的操作都不会改变对象本身,而是重新创建一个对象。
如果我们需要一个可以修改的字符串,我们需要使用StringBuilderStringBuffer。否则,会出现许多需要被GC收集的字符串“垃圾”。

关于字符串的创建或操作在内存中的位置,请参考触摸java常量池

举报

相关文章推荐

在java中,说String是不可变的,可是为什么

假设String s=new String ("wo");String s1=new String("de"); s=s+s1; System.out.println(s);结果为wode?     首先在栈中有个"s"变量指向堆中的"wo"对象... 栈中"s1"变量指向堆中的"de"

java中String为什么是不可变的

原文: Why String is immutable or final in Java Pankaj November 29, 2012 Java String...

欢迎关注CSDN程序人生公众号

关注程序员生活,汇聚开发轶事。

Java不可变类或对象详解(Immutable class)

[size=medium] 如果某个对象在被创建后其状态就不能被修改,那么这个对象就称为不可变对象。线程安全性是不可变对象的固有属性之一,它们的不变性条件是由构造函数创建的,只要它们的状态不改变,那么这些不变性条件就能得以维持。不可变对象一定是线程安全的。 当满足以下条件时,对象才是不可变的: 1) 对象创建以后其状态就不能修改。 2) 对象的所有域都是final类型(当然像不可变String类型的域并不需要声明为final)。 3) 对象是正确创建的(在对象的创建期间,this引用没有逸出)。 更多详细参考 关于“不

Java的string类为什么是不可变的

Java的string类为什么是不可变的 这篇文章主要介绍了Java的string类为什么是不可变的,总结了三个答案,需要的朋友可以参考下 答案一: 最流行的Java面试...

为什么Java的string类要设成immutable(不可变的)

        最流行的Java面试题之一就是:什么是不可变对象(immutable object),不可变对象有什么好处,在什么情况下应该用,或者更具体一些,Java的String类为什么要设成immutable类型?         不可变对象,顾名思义就是创建后不可以改变的对象,典型的例子就是Java中的String类。 String s = "ABC"; s.t
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)