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

相关文章

来自专栏软件测试经验与教训

Python学习笔记(七)

3418
来自专栏吴裕超

ES6之模版字符串

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

601
来自专栏天天

作用域

623
来自专栏Small Code

【Python】小谈numpy数组占用内存空间问题

之前跟同学讨论过numpy数组的占用空间大小问题,但是今天给忘了,又重新试验了一下,主要是利用sys模块的getsizeof函数,使用的版本是 Python3....

33210
来自专栏Python

python2/3 中删除字典中value为空的键值对方法

只是在for循环中,相当于对链表的操作,它会自动调用next方法! 字典的迭代器会遍历它的键,在这个过程中,不能改变这个字典!不能删除、添加数据 要先记录要删...

1053
来自专栏xingoo, 一个梦想做发明家的程序员

Java程序员的日常 —— static的用法讲解实践

之前文章说过Java中static的作用,有朋友想看个例子。于是便抽空写了个小栗子 代码 package xing.test.thinking.chap5...

1957
来自专栏null的专栏

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

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

3258
来自专栏图像识别与深度学习

2018-06-30 Python numpy

823
来自专栏北京马哥教育

Linux Shell 流程控制语句实例

linux shell 有一套自己的流程控制语句,其中包括条件语句(if),循环语句(for,while),选择语句(case)。下面我将通过例子介绍下,各个...

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

python 字典操作提取key,value

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

3925

扫码关注云+社区