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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© bpsend 中级黑马   /  2013-11-15 10:33  /  1316 人查看  /  5 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

String str1 = "Hello"; 这句话会在常量池中创建一个字符串Hello,并将引用地址赋值给str1。
String str2 = new String("World"); 这句话是先在常量池中创建一个字符串World,然后在堆中开辟一个空间,把World的值赋给这块空间,最后把空间的引用地址赋值给str2,一共是创建了两个对象。
以上说法正确吗?如果正确我搞不清楚第二步多创建那一个对象的意义在哪里。

还有Int包装类的问题
final Integer it = new Integer(15);
it = 13;
按理说it应该是引用类型,被final修饰后只是地址不能变,值是可以变的,可是为什么我赋值会报错?

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
你理解的是String str1 = "Hello";这个字符串对象不在堆内存么,
String str2 = new String("World"); 我原来的理解是直接在堆内存中new了一个字符串,
坐等大神解答。。。

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1 赞一个!

查看全部评分

回复 使用道具 举报 1 0
str1对应的"abc"放在栈区里,str2对应的"abc"放在堆里。区分指向堆内存对象的首地址。还是等大神们吧......

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1 赞一个!

查看全部评分

回复 使用道具 举报
JDK1.5之后 String str=“hello”;与String str=new String("hello");没有区别;因为1.5之后String str=“hello”;系统会默认成String str=new String(“hello”);
在JDK1.5之前,应该是String str=new String("hello");把“hello”封装成对象 ,更好的调用String的方法;
final Integer it = new Integer(15);
it = 13;   //系统默认 new Integer(13)
所以it的地址改变了

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1 赞一个!

查看全部评分

回复 使用道具 举报
Rockray 发表于 2013-11-15 10:39
你理解的是String str1 = "Hello";这个字符串对象不在堆内存么,
String str2 = new String("World"); 我原 ...

不,String str1 = "Hello" ,的Hello存在于常量池中,然后str1存储的是它的引用。你看毕老师的String类了吗?
回复 使用道具 举报
lichao 发表于 2013-11-15 11:19
JDK1.5之后 String str=“hello”;与String str=new String("hello");没有区别;因为1.5之后String str ...

String a1 = "123";
String a2 = "123";
String a3 = new String("123");
String a4 = new String("123");
System.out.println(a1 == a2);//输出true
System.out.println(a3 == a4);//输出false
怎么可能一样呢- -。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马