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

相关文章

来自专栏数据结构笔记

JavaScript中 appendChild追加子节点无效的解决办法

这其实是因为一个元素只能有一个父元素,上面这段代码试图将 btn添加到多个元素中。

722
来自专栏乐百川的学习频道

Python 正则表达式

最近研究Python爬虫,很多地方用到了正则表达式,但是没好好研究,每次都得现查文档。今天就专门看看Python正则表达式。本文参考了官方文档 re模块。 模式...

19710
来自专栏九彩拼盘的叨叨叨

escape,encodeURI,encodeURIComponent

escape,encodeURI,encodeURIComponent这三个方法都是对URL进行编码的。

632
来自专栏日常学python

爬虫必学知识之正则表达式上篇

这是日常学python的第12篇文章 在向网页进行了提交请求之类的之后,我们可以得到了网页的返回内容,里面自然而然会有我们想要的数据,但是html元素文本这么多...

3216
来自专栏专注 Java 基础分享

关于类的对象创建与初始化

今天,我们就来解决一个问题,一个类实例究竟要经过多少个步骤才能被创建出来,也就是下面这行代码的背后,JVM 做了哪些事情?

4046
来自专栏Python

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

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

983
来自专栏idba

了解Python装饰器

一 装饰器是什么 装饰器是一个用于封装函数或者类的代码工具,显式地将封装器作用于函数或者类上,达到程序运行时动态增加功能的目的。对于函数运行前处理常见前置条件...

766
来自专栏小白的技术客栈

Python内置数据结构之字符串

字符串 今天跟大家来说一说Python中的字符串数据结构。 ? 上文回顾 让我们回顾一下可变类型及不可变类型: 不可变数据类型:str、int、tuple ...

3688
来自专栏听雨堂

JavaScript大略

 简介: javascript是一种基于对象和事件驱动并具有安全性能的脚本语言。 它是通过嵌入或调入在标准的HTML语言中实现的。 数据类型:   St...

17110
来自专栏AzMark

Python 学习之 def 函数

当我们定义了一个 function(),并不意味着我们要调用它,所以我们需要运行这个 function(),一个简单的办法就是在 input 框中输入 func...

742

扫码关注云+社区