【专业技术】图解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 条评论
登录 后参与评论

相关文章

来自专栏海天一树

小朋友学C语言(15):“变量==常量”与“常量==变量”的区别

(一)编写程序 #include <stdio.h> int main() { int x = 10; if(x == 10) { ...

2856
来自专栏Python小屋

Python内置函数sorted()和列表方法sort()的排序原理

问题描述:在Python中,可以使用内置函数sorted()和列表方法sort()对数据进行排序,但要求所有数据支持关系运算符,也就是这些数据本身是可以比较大小...

2976
来自专栏web前端教室

var a="xx";a=a+"ss";a的值变了,但"xx"字符串并没有变

如题目所示, var a="xx"; a=a+"ss"; console.log(a); //xxss 一般情况下,我们就可以认为此时a的值,由'xx'变成了'...

1878
来自专栏null的专栏

python——时间与时间戳之间的转换

对于时间数据,如2016-05-05 20:28:54,有时需要与时间戳进行相互的运算,此时就需要对两种形式进行转换,在Python中,转换时需要用到time模...

3318
来自专栏维C果糖

史上最简单的 MySQL 教程(四十三)「函数」

函数,就是将一段代码封装到一个结构中,在需要执行该段代码的时候,直接调用该结构(函数)执行即可。此操作,实现了代码的复用。在 MySQL 中,函数有两种,分别为...

3736
来自专栏锦小年的博客

python学习笔记6.2-类常见的编程模式

上一次写过一篇有关于python类的博客,现在回头去看看,发现好多语法还是比较低级,表达不是很清晰。现在谈一谈对python类的表达的新的理解。 本篇博客的...

2179
来自专栏iOS开发攻城狮的集散地

run timeimport : 成员变量、类、方法

1759
来自专栏吴裕超

ES6之模版字符串

  但是我们可以看到:这样的传统做法需要使用大量的“”(双引号)和 + 来拼接才能得到我们需要的模版。但是这样是十分不方便的。

631
来自专栏深度学习之tensorflow实战篇

python 字典操作提取key,value

python 字典操作提取key,value dictionaryName[key] = value 1.为字典增加一项 ? 2.访问字典中的值 ...

4245
来自专栏coding

python实用技巧:在列表,字典,集合中快速筛选数据

1455

扫码关注云+社区