黑马程序员技术交流社区

标题: 请问String s = new String("123")有几个对象 [打印本页]

作者: hg3093483    时间: 2013-3-24 20:57
标题: 请问String s = new String("123")有几个对象
本帖最后由 hg3093483 于 2013-3-25 20:07 编辑

String s = new String("123")有几个对象呢?请详细说明下哈
作者: 葛伟    时间: 2013-3-24 21:01
2个对象,一个是编译时决定的,最后放在常量池中。一个是运行时放在堆里面的。两个都是"123".
作者: 葛伟    时间: 2013-3-24 21:08
你可以参考"黑马程序员_张孝祥_java基础加强"的视频,张老师讲的好多都是细节,特别的详细~
作者: 黑马朱超    时间: 2013-3-24 21:38
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会自动根据栈中数据的实际情况来决定是否有必要创建新对象。
以上是引用我原来一个帖子里的,希望对你有帮助
作者: 张昶    时间: 2013-3-24 22:08
2个:一个是str对象;一个是new String()出来的对象.
作者: HM马明宇    时间: 2013-3-25 01:07
是两个对象,一个是String类型的对象s,和一个字符串对象"123",s位于栈内存中,储存的是堆内存中的字符"123"的内存地址
作者: HM马明宇    时间: 2013-3-25 01:07
光明宇宙 发表于 2013-3-25 01:07
是两个对象,一个是String类型的对象s,和一个字符串对象"123",s位于栈内存中,储存的是堆内存中的字符"12 ...

具体可以先理解堆内存和栈内存
作者: 陆旭东    时间: 2013-3-25 19:24
自然是两个了,而且两个都是"123",一个在String pool里面,一个是new出来的.
s 是引用不是对象.
作者: 曾祥旭    时间: 2013-3-25 19:26
两个对象,一个是new创建的对象存储在堆内存中。还有一个就是"123"这个对象,放在字符串常量缓冲区中。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2