关闭

Java String是不可变的(immutable)

标签: java
424人阅读 评论(0) 收藏 举报
分类:

原文: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常量池

0
0
查看评论

为什么Java中的String是不可变的?

原文:Why String is immutable in Java ? 翻译:get-set String是Java中的一个不可变类。所谓不可变,简单来说就是其对象不能被修改。实例中的所有信息在初始化的时候就已经具备,并且不能被修改(老外好啰嗦…)。不可变类有很多优点。这篇文章简要说明了为什么S...
  • get_set
  • get_set
  • 2015-11-19 13:36
  • 753

多线程设计模式——Immutable Object(不可变对象)

Immutable Object(不可变对象)
  • buyoufa
  • buyoufa
  • 2016-07-05 19:27
  • 1058

Java中的String为什么是不可变的? -- String源码分析

什么是不可变对象? 众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的。不能改变状态的意思是,不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用类型的变量不能指向其...
  • brave2211
  • brave2211
  • 2014-01-15 22:07
  • 32798

关于Python参数传递时,传递可变对象(mutable)和不可变更对象(immutable)的误区

从简,不说废话: # 数字、字符串、tuple都是不可变对象 # list、dict是可变对象 #Python函数参数对于可变对象,函数内对参数的改变会影响到原始对象;对于不可变对象,函数内对参数的改变不会影响到原始参数。原因在于:可变对象,参数改变的是可变对象,其...
  • three_co
  • three_co
  • 2017-11-18 00:01
  • 1099

Java中的String字符串为什么不可变

什么是不可变对象? 众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的。不能改变状态的意思是,不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用类型的变量不能指向其...
  • ps_zhanglei
  • ps_zhanglei
  • 2016-05-02 20:38
  • 1235

java中String类为什么要设计成不可变的

1.什么是不可变? String不可变很简单,如下图,给一个已有字符串“abcd”第二次赋值成"abced",不是在原内存地址上修改数据,而是重新指向一个新对象,新地址。 2.String为什么不可变? 翻开JDK源码,java.lang.String类起手前三行,是这样写的...
  • qingmengwuhen1
  • qingmengwuhen1
  • 2016-08-24 14:38
  • 1189

为什么String要设计成不可变的?

翻译人员: 铁锚 翻译日期: 2013年11月18日 原文链接: Why string is immutable in Java ? 这是一个老生常谈的话题(This is an old yet still popular question). 在Java中将String...
  • renfufei
  • renfufei
  • 2013-11-18 20:30
  • 12639

Java String为什么是不可变类,StringBuffer与StringBuilder区别

熟悉Java的都知道String类是不可变,但String类为什么设计成不可变类,如何做到不可变没有仔细想过。 String为什么设计成不可变类? 1.Java字符串池的设计方式。     String s1="abc"; String s2=&qu...
  • chenchaofuck1
  • chenchaofuck1
  • 2016-03-10 15:15
  • 2141

深入理解String为什么是不可变的类

如上图所示 String s1="abcd" ;    等价于  String s1=new String("abcd"); 两个变量都指向同一个堆内存 String s="abcd"; s=s....
  • yanlove_jing
  • yanlove_jing
  • 2016-05-13 18:10
  • 4250

为什么String对象不可变,而StringBuffer可变?

1.String对象不可变、StringBuffer对象可变的含义: 举个例子:String str = "aa";  str = "aa"+"bb"; 此时str的值为"aabb",但是"aabb&...
  • qingmengwuhen1
  • qingmengwuhen1
  • 2017-04-06 18:54
  • 900
    个人资料
    • 访问:167350次
    • 积分:1474
    • 等级:
    • 排名:千里之外
    • 原创:59篇
    • 转载:3篇
    • 译文:3篇
    • 评论:5条
    最新评论