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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© nuddlesW 中级黑马   /  2014-12-23 21:19  /  2113 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

字符串是常量不能改变
那为什么
String str = "abc";
                str =  "bcd";
                System.out.println(str);

打印结果是bcd ,而且编译运行都能过,是否其实str已经重构过,指向另一个对象了
另外,
String str = new String("abc") 都说会创建两个对象,到底是哪两个,一个是堆中的str对象,另外一个常量池中的“abc"对象?

求高手解惑。

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

11 个回复

倒序浏览
路过看看,围观
回复 使用道具 举报
第一个问题,String str = xxxx;如果字符串常量池中已经存在了这个XXXX对象这直接将str指向这个已经有的对象,如果没有则创建并指向,   这里 str 只是一个引用型的变量 而不是说他只可以指向一个唯一的对象。可以这么理解 字符串常量池中 基本是不可能同时存在两个“abc”的。
第二个问题,首先 ,String str  = new String("abc");我们知道 字符串都是存在于 字符串常量池中的,  而 new这个关键字会在堆内存中开辟空间 并默认初始化对象,   如果字符串常量池中 当前不存在 “abc”的话    就创建这个对象,并将 堆内存中的对象 指向 常量池中的“abc”.

以上 就是我自己的观点  不知是否 正确

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 赞一个!

查看全部评分

回复 使用道具 举报 3 0
String类是不可变类,类中的每个方法都不会改变其对象,而不是它的引用不会被改变。
str = new String("abc") ,一定是在堆上创建了一个对象返回其引用,但是初始化这个对象时必须要另外一个String对象啊,所以这个对象就是字符串池子中的"abc"啊。故创建了两个对象。一个在字符串池子中,另一个在堆上。
回复 使用道具 举报
kerner 发表于 2014-12-23 23:52
String类是不可变类,类中的每个方法都不会改变其对象,而不是它的引用不会被改变。
str = new String("abc ...

有道理,这下我明白了,谢了
回复 使用道具 举报
一张图


回复 使用道具 举报
liuhuan 中级黑马 2014-12-24 08:59:36
7#
看了诸位的回答,受教了。。。努力中。。。挣分中。。。
回复 使用道具 举报
就一个对象,另一个不是对象是引用。!
回复 使用道具 举报
qig123 中级黑马 2014-12-31 20:12:16
9#
只要看看eclipse里面看看string的原码就会马上明白了,string本质上是char数组,而且前面还有修饰符private final修饰,,是一个私有常量字符数组.而且没有任何提供公共方法来访问私有变量,所以一旦string类一创建对象就无法改变了,
所以对象不可变,但是对象的引用是可以变的.
回复 使用道具 举报
雨祭 中级黑马 2014-12-31 22:47:11
10#
路过看看
回复 使用道具 举报
wf111sxwf 发表于 2014-12-23 23:41
第一个问题,String str = xxxx;如果字符串常量池中已经存在了这个XXXX对象这直接将str指向这个已经有的对 ...

回答的很棒
回复 使用道具 举报
字符串不能改变说的实在常量池中,一建立字符串就不能更改,这是相对于常量池的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马