A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 于世德 中级黑马   /  2013-7-12 13:02  /  1476 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么说String类的内容不可变?String s = new String("aaaa");  s = s.substring(2); 为什么要将堆中的"aaaa"改变为"aa"之后还要创建一个新的对象呢?

4 个回复

倒序浏览
jvm会在内存中重新创建一个String对象“aa”,而原来的“aaa”对象依然存在。 而且内存中“aaa”这个内容是不能修改的.
String类有一个 char 数组value,是final的,用来当作存储字符串的容器,也就是说String s=“aaa”;这个字符串真正是这么存储的: value[0]='a';  value[1]='a';  value[2]='a'; 而且value是final的,这就是说value在编译时就已经决定了。因此,这就是我们所说的String是不可变的。

回复 使用道具 举报
张先庆 发表于 2013-7-16 23:17
jvm会在内存中重新创建一个String对象“aa”,而原来的“aaa”对象依然存在。 而且内存中“aaa”这个内容是 ...

哦,就是说String类在堆内存中实际存储的是个char[]类型的数组,而这个数组是final的,所以String类的内容不可改变,明白一些了:lol
回复 使用道具 举报
怎么没给加分啊。。。。。。。。。。。。。。
回复 使用道具 举报
看看String的源码啊 是final的  内容不会变 操作String对象 等于又创建了一个新对象 所以在编程中 尽量使用Stringbuider对象  如果是线程安全的 使用StringBuffered对象
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马