【专业技术】图解Java字符串不变性

1、声明一个字符串:

String s = "abcd";

s中存储了一个指向堆内存字符串"adcd"的引用。

2、再声明一个字符串变量,同样指向堆内存的字符串"abcd"。

如上图所示,s和s2都指向"adcd"。

3、对字符串s进行连接操作:

s = s.concat("ef");

此时s切断了与之前"abcd"的引用,指向了一个新的字符串"abcdef"。

4、总结:

一旦一个字符串在堆内存中创建,它就不能再被改变。我们需要注意String类的所有操作都会重新创建一个新的字符串返回,而不会改变原有堆内存中的字符串。如果我们对字符串做了很多类似的操作那将会在对内存中创建大量的不可变的字符串,造成大量内存消耗,并且这些没有被引用的字符串需要垃圾回收器去回收,但是垃圾回收也是要消耗内存和cpu的,所以为了程序性能,在遇到需要改变字符串时请使用StringBuffer或者StringBuilder。

本文部分翻译自programcreek

原文发布于微信公众号 - 程序员互动联盟(coder_online)

原文发表时间:2015-05-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏微信公众号:Java团长

大公司最喜欢问的Java集合类面试题

看了一些所谓大公司的JAVA面试问题,发现对于JAVA集合类的使用都比较看重似的,而自己在这方面还真的是所真甚少,抽空也学习学习吧。

572
来自专栏Ryan Miao

String的按值传递,java传参都是传值

java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? String和int参数传递是按值传递还是引用传递? 一道面试题目,String的传递: p...

3016
来自专栏Python爱好者

Java基础笔记15

1428
来自专栏java系列博客

深入理解Java内存模型(六)——final

1233
来自专栏java一日一条

JAVA集合类(大公司面试喜欢问的)

看了一些所谓大公司的Java面试问题,发现对于JAVA集合类的使用都比较看重似的,而自己在这方面还真的是所真甚少,抽空也学习学习吧。

742
来自专栏吾爱乐享

java学习之StringBuffer的增删改查功能

1194
来自专栏机器学习从入门到成神

C++ 数据结构链表的实现代码

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

471
来自专栏程序员互动联盟

【专业技术】深入理解Java字符串函数substring

在Java中开发,String是我们开发程序可以说必须要使用的类型,String有一个substring方法用来截取字符串,我们想必也常常使用。但是你真正的了解...

3386
来自专栏小樱的经验随笔

【Java学习笔记之十六】浅谈Java中的继承与多态

1、  什么是继承,继承的特点? 子类继承父类的特征和行为,使得子类具有父类的各种属性和方法。或子类从父类继承方法,使得子类具有父类相同的行为。 特点:在继承关...

2467
来自专栏Ryan Miao

java中List对象列表去重或取出以及排序

面试碰到几次list的去重和排序。下面介绍一种做法: 1. list去重 1.1 实体类Student List<Student>容量10k以上,要求去重复。这...

3549

扫描关注云+社区