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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hg3093483 中级黑马   /  2013-3-24 20:57  /  1747 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 hg3093483 于 2013-3-25 20:07 编辑

String s = new String("123")有几个对象呢?请详细说明下哈

点评

记得及时处理帖子哦,继续追问,或将分类改成【已解决】,谢谢  发表于 2013-3-24 23:08

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

8 个回复

倒序浏览
2个对象,一个是编译时决定的,最后放在常量池中。一个是运行时放在堆里面的。两个都是"123".

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
你可以参考"黑马程序员_张孝祥_java基础加强"的视频,张老师讲的好多都是细节,特别的详细~
回复 使用道具 举报
String是一个特殊的包装类数据。可以用下面两种方式创建:
   
    String str = new String("abc");
    String str = "abc";

    第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。

    而第二种是先在栈中创建一个对String类的对象引用变量str,然后查找栈(常量池)中有没有存放"abc",如果没有,则将"abc"存放进栈(常量池),并令str指向”abc”,如

果已经有”abc” 则直接令str指向“abc”。

    比较类里面的数值是否相等时,用equals()方法;当测试两个包装类的引用是否指向同一个对象时,用==,下面用例子说明上面的理论。
        
          String str1 = "abc";
          String str2 = "abc";
          System.out.println(str1==str2); //true
         
          可以看出str1和str2是指向同一个对象的。
         
          在eclipse中的调试视图中可以看到abc的id是同一个。实际上java对常量池中进行了优化。同样的内容只保留一份。用这种方式创建多个”abc”字符串,在内存中其实只存在一个对象而已. 这种写法有利与节省内存空间. 同时它可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。
以上是引用我原来一个帖子里的,希望对你有帮助

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
2个:一个是str对象;一个是new String()出来的对象.

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
是两个对象,一个是String类型的对象s,和一个字符串对象"123",s位于栈内存中,储存的是堆内存中的字符"123"的内存地址

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
光明宇宙 发表于 2013-3-25 01:07
是两个对象,一个是String类型的对象s,和一个字符串对象"123",s位于栈内存中,储存的是堆内存中的字符"12 ...

具体可以先理解堆内存和栈内存
回复 使用道具 举报
自然是两个了,而且两个都是"123",一个在String pool里面,一个是new出来的.
s 是引用不是对象.
回复 使用道具 举报
两个对象,一个是new创建的对象存储在堆内存中。还有一个就是"123"这个对象,放在字符串常量缓冲区中。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马