我们用下面一组图来说明Java的不变性。
1.声明一个字符串
~~~
String s = "abcd";
~~~
s存储了字符串对象的引用。下面图片中的箭头就表示这种存储引用。
![](https://box.kancloud.cn/2016-03-18_56eba2a94ace3.jpg)
2.将一个字符串变量赋值给另外一个字符串变量
~~~
String s2 = s;
~~~
s2变量存储了同样的引用值。所以,两个变量指向同一个字符串对象。
![](https://box.kancloud.cn/2016-03-18_56eba2a9634af.jpg)
3.合并字符串
~~~
s = s.concat("ef");
~~~
s现在存储的是新生成的字符串对象的引用。
![](https://box.kancloud.cn/2016-03-18_56eba2a974a24.jpg)
4.总结
一旦一个字符串在内存(堆)上创建,这个字符串就不会改变。我们应该注意到String类的所有方法都不会改变字符串本身,而是返回一个新的字符串。
如果我们需要一个可以改变的字符串,我们可以使用StringBuffer或者StringBuilder。否则,因为每次都是创建一个新的字符串。
原文链接:[Diagram to show Java String’s Immutability](http://www.programcreek.com/2009/02/diagram-to-show-java-strings-immutability/)
译文链接:[[图说Java]图说字符串的不变性](http://blog.csdn.net/sunnyyoona/article/details/50410801)
- 前言
- [Hibernate开发之路](1)Hibernate配置
- [Hibernate开发之路](2)Hibernate问题
- [Hibernate开发之路](3)基础配置
- [Hibernate开发之路](4)ID生成策略
- [Hibernate开发之路](5)联合主键
- [设计模式实践之路](1)单例模式
- [Java]UDP通信的简单例子
- [Java]套接字地址InetAddress讲解
- [Java开发之路](1)final关键字
- [Java开发之路](2)Java字符串
- [Java开发之路](3)Java常用类
- [Java开发之路](4)String、StringBuffer与StringBuilder详解
- [Java开发之路](5)异常详解
- [Java开发之路](6)File类的使用
- [Java开发之路](7)RandomAccessFile类详解
- [Java开发之路](8)输入流和输出流
- [Java开发之路](9)对象序列化与反序列化
- [Java开发之路](10)DOM解析XML文档
- [Java开发之路](11)SAX解析XML文档
- [Java开发之路](12)JDOM和DOM4J解析XML文档
- [Java开发之路](14)反射机制
- [Java开发之路](15)注解
- [Java开发之路](16)学习log4j日志
- [Java开发之路](18)关于Class.getResource和ClassLoader.getResource的路径问题
- [Java开发之路](19)Long缓存问题
- [Java开发之路](20)try-with-resource 异常声明
- [Java开发之路](21)Comparator与Comparable
- [Java]Java工程师成神之路
- [细说Java](1)图说字符串的不变性
- [细说Java](2)Java中字符串为什么是不可变的
- [细说Java](3)创建字符串是使用" "还是构造函数?