黑马程序员技术交流社区

标题: 创建String对象问题 [打印本页]

作者: 王涛    时间: 2012-2-22 09:48
标题: 创建String对象问题
本帖最后由 王涛 于 2012-2-24 10:53 编辑

创建String对象时,使用String s=new String(“abc”)和String s=“abc”语句有什么区别?
他们这两种方法都是基于什么得到的?
作者: 张开开    时间: 2012-2-22 10:16
这个问题在毕老师的基础视频里有答案:具体如下:
class StringMethodDemo
{
      public static void main(String[] args)
       {
        String s1="abc";
        String s2=new String("abc");
        String s3="abc";
        System.out.println(s1==s2);
        System.out.println(s1==s3);
       }
}

运行结果为:false
                 ture

分析:s1首先生成对象"abc",当s3在创建对象时,发现已经有"abc"后,就不再创建新的对象了,而是s1和s3同时指向了一个对象,因此结果为ture.
         而s2是new出来的新对象,所以s1和s2不相等
         你可以这么记忆。当用String s1="hello";来创建对象时,一旦创建了,以后再通过该方法创建相同的对象,内存中只有这一个,只是两个都指向了同一个对象。而
         用new的方法,每new一次,就会出现一个对象,即使有重复!
作者: 张开开    时间: 2012-2-22 10:20
String s=new String(“abc”)和String s=“abc”是两种创建字符串对象的方法,大多数情况下可以互换。但当用第一种方法创建对象后。内存中就出现了其字符串,如果再用此方法创建相同的对象,在内存中不是出现又一个该对象,而是两个变量同时指向了这一个对象。如果用后一种方法,无论是否有该对象,都会新产生一个。
作者: 何招俊    时间: 2012-2-22 10:31
本帖最后由 何招俊 于 2012-2-22 21:57 编辑

Java运行环境有一个字符串池,由String类维护。执行语句String s="abc"时,首先查看字符串池中是否存在字符串"abc",如果存在则直接将"abc"赋给s,如果不存在则先在字符串池中新建一个字符串"abc",然后再将其赋给s。执行语句String s=new String("abc")时,不管字符串池中是否存在字符串"abc",直接新建一个字符串"abc"(注意:新建的字符串"abc"不是在字符串池中),然后将其付给s。前一语句的效率高,后一语句的效率低,因为新建字符串占用内存空间。
作者: lvwenwen88    时间: 2012-2-22 10:56
符串"abc",直接新建一个字符串"abc"(注意:新建的字符串"abc"不是在字符串池中),然后将其付给s。
前一语句的效率高,后一语句的效率低,因为新建字符串占用内存空间。
作者: 花开~的季节    时间: 2012-2-22 11:02
第一个是创建两个对象,第二个是创建一个对象,但他们的内容都是"abc"
作者: 靖美专    时间: 2012-2-22 12:05
前面表示新建一个String对象,会重新分配内存
后者表示引用一个内容为“abc”的String成员,如果内存中有这种内容,就降内存地址付给s;如果没有,则会为s分配内存,并赋值
作者: 沈样    时间: 2012-2-22 12:29
这是两种创建String对象的方法,String s=new String(“abc”)说明是在堆内存中开辟一个新的空间把abc的地址给S,String s=“abc”说明把内存中原先的对象付一个abc,不会再开新的内存对象了




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