为了账号安全,请及时绑定邮箱和手机立即绑定

不懂就问。

1.   String a="imooc";
2.   String a="imooc.com";
3.   String b=new String("imooc");
通过两次给变量a赋值,改变的是a的指针指向吗?
那么第一次给变量a赋的值"imooc"是否会被回收呢?
以上的两种写法的意义区别是什么?
谢谢。


正在回答

5 回答

1、两次给a赋值,是改变了a的引用,即a中存放的地址指向了不同的String Pool中的对象(从指向"imooc"改变为指向“imooc.com”);

2、String a = "imooc"; 首先会检查 String Pool中有没有“imooc”这个字符串对象,如果有,a直接reference to该字符串对象,如果没有,在String Pool中创建“imooc”,并使a reference to 所创建的对象;

3、String b = new String("imooc");首先,在heap上创建一个String对象“imooc”,b reference to 该对象;然后,JVM会检查String Pool中是否存在“imooc”对象,如果没有,则在String Pool中再创建一个;

0 回复 有任何疑惑可以回复我~
#1

_Jack_Han_ 提问者

非常感谢!
2016-02-19 回复 有任何疑惑可以回复我~
#2

_Jack_Han_ 提问者

引用对象b指向堆内存中的对象“imooc”,那么堆是如何与String pool联系的呢?指针是什么呢?
2016-02-19 回复 有任何疑惑可以回复我~

第一个是属于栈空间第二个是在堆空间,二者有本质不同

0 回复 有任何疑惑可以回复我~
#1

_Jack_Han_ 提问者

谢谢!
2016-06-04 回复 有任何疑惑可以回复我~

1.2不能重复赋值

3.好像是没有区别

    String str = "abc";

is equivalent to:

    char data[] = {'a', 'b', 'c'};
    String str = new String(data);        ---引自java api


1 回复 有任何疑惑可以回复我~
#1

玄鉴

对的。1.2不能重复赋值 String a="imooc"; String a1="imooc.com"; 再new一个imooc和a不一样的。和本题s1不同于s3一样.
2016-05-02 回复 有任何疑惑可以回复我~

String b = new String("imooc"),代表在堆内存中,创建一个字符串对象,变量b指向该对象,而该对象又指向在常量池中的字符串常量。
而String a = "imooc"代表直接由变量a指向常量池中的字符串,省去了中间的堆内存中的对象(new会在堆中创建对象)

2 回复 有任何疑惑可以回复我~

第一次命名a指向"imooc"(地址)

第二次命名a指向"imooc.com"(地址),但前一次"imooc"未被回首仍然存在


0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
Java入门第三季
  • 参与学习       409791    人
  • 解答问题       4340    个

Java中你必须懂得常用技能,不容错过的精彩,快来加入吧

进入课程

不懂就问。

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信