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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 蔚蓝小嗨 中级黑马   /  2013-4-25 19:36  /  1567 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String s1="abc";
string s2=new Sting("abc");
为什么毕老师说s1在内存中有一个对象,s2在内存中有俩个对象呢,疑惑啊

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

8 个回复

正序浏览
黄玉昆 黑马帝 2013-4-27 22:33:28
9#
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
回复 使用道具 举报
java堆内存,有一块缓冲区,就像我们平时上网的时,在我们的电脑里,也有一块缓冲区的地方,那里一般都放我们经常浏览的网站等。目的是为了更加方便,更加注重用户体验。
String s = "abc";   //像这一样的这字符串,也会经常被我们引用,所有就把它放在缓冲区里,因为缓冲区里的都是常量,如果有的话,只接引用,如果没有的话,就创建,说白         了,还是为了节约内存,更快速地可以引用,而不需要每次都创建,耗费内存,速度
String s = new String("abc"); //

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
版主代理郑重提示:如果楼主问题已经解决那么。在自己发表的帖子下面,点“修改”,
然后把主题的分类标记成“已解决”。就OK了{:soso_e102:}
回复 使用道具 举报
海不扬波 发表于 2013-4-25 20:19
String s1="abc";
Java中所有的字符串文字[字符串常量]都是一个String的对象。
String s1="abc"; //去Strin ...

谢谢你,回答的很详细
回复 使用道具 举报
String s1="abc";
Java中所有的字符串文字[字符串常量]都是一个String的对象。
String s1="abc"; //去StringPool中找,看有没有abc,有就直接把s1的引用指向abc,没有就在StringPool产生abc
String s2=new String("abc"); //因为StringPool中有abc,但new会在堆里再产生一个abc,s2是abc的引用。

评分

参与人数 1技术分 +2 收起 理由
黄玉昆 + 2

查看全部评分

回复 使用道具 举报
        String s1 = "abc";
        String s2 = "abc";
        String s3 = new String("abc");
        System.out.println( s1 == s2);  //true
        System.out.println( s1 == s3);  //false
证明new()出的对象会开辟新空间。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
因为“abc”,本身就是一个String类型的对象,再加上又new了一个对象,所以在s2中存在两个对象。我是这么理解的,不知道对不对。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
字符串一旦被初始化,就不可以被改变,存放在方法区中的常量池中。

1.当声明String s1="abc";,s1会去常量池中找abc这个对象,常量池中如果有,
  那么s1就指向了"abc"的地址,也就开辟了空间,这时候是一个对象。
2.每当我们new的时候证明在内存中已经开辟了空间,说明有了一个对象,"abc"又是一个对象,
  所以说,总共两个对象。

其实关于这个观点众说纷纭。
不过只要自己感觉对了,在做题的时候不要出错误就可以了,希望楼主多多来论坛找我们玩,
有问题尽量来这里题,对于刚刚基础起步的同学需要这么畅快的问,多谢提问!
{:soso_e113:}

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马