黑马程序员技术交流社区

标题: String类的一个问题 [打印本页]

作者: 于世德    时间: 2013-7-12 13:02
标题: String类的一个问题
为什么说String类的内容不可变?String s = new String("aaaa");  s = s.substring(2); 为什么要将堆中的"aaaa"改变为"aa"之后还要创建一个新的对象呢?
作者: 张先庆    时间: 2013-7-16 23:17
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-17 09:57
张先庆 发表于 2013-7-16 23:17
jvm会在内存中重新创建一个String对象“aa”,而原来的“aaa”对象依然存在。 而且内存中“aaa”这个内容是 ...

哦,就是说String类在堆内存中实际存储的是个char[]类型的数组,而这个数组是final的,所以String类的内容不可改变,明白一些了:lol
作者: 张先庆    时间: 2013-7-18 22:10
怎么没给加分啊。。。。。。。。。。。。。。
作者: 徐鹏跃    时间: 2013-11-21 14:43
看看String的源码啊 是final的  内容不会变 操作String对象 等于又创建了一个新对象 所以在编程中 尽量使用Stringbuider对象  如果是线程安全的 使用StringBuffered对象




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2