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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王涛 黑马帝   /  2012-2-22 09:48  /  2368 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王涛 于 2012-2-24 10:53 编辑

创建String对象时,使用String s=new String(“abc”)和String s=“abc”语句有什么区别?
他们这两种方法都是基于什么得到的?

7 个回复

倒序浏览
这个问题在毕老师的基础视频里有答案:具体如下:
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一次,就会出现一个对象,即使有重复!
回复 使用道具 举报
String s=new String(“abc”)和String s=“abc”是两种创建字符串对象的方法,大多数情况下可以互换。但当用第一种方法创建对象后。内存中就出现了其字符串,如果再用此方法创建相同的对象,在内存中不是出现又一个该对象,而是两个变量同时指向了这一个对象。如果用后一种方法,无论是否有该对象,都会新产生一个。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
本帖最后由 何招俊 于 2012-2-22 21:57 编辑

Java运行环境有一个字符串池,由String类维护。执行语句String s="abc"时,首先查看字符串池中是否存在字符串"abc",如果存在则直接将"abc"赋给s,如果不存在则先在字符串池中新建一个字符串"abc",然后再将其赋给s。执行语句String s=new String("abc")时,不管字符串池中是否存在字符串"abc",直接新建一个字符串"abc"(注意:新建的字符串"abc"不是在字符串池中),然后将其付给s。前一语句的效率高,后一语句的效率低,因为新建字符串占用内存空间。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
符串"abc",直接新建一个字符串"abc"(注意:新建的字符串"abc"不是在字符串池中),然后将其付给s。
前一语句的效率高,后一语句的效率低,因为新建字符串占用内存空间。
回复 使用道具 举报
第一个是创建两个对象,第二个是创建一个对象,但他们的内容都是"abc"
回复 使用道具 举报
靖美专 黑马帝 2012-2-22 12:05:48
7#
前面表示新建一个String对象,会重新分配内存
后者表示引用一个内容为“abc”的String成员,如果内存中有这种内容,就降内存地址付给s;如果没有,则会为s分配内存,并赋值

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
沈样 黑马帝 2012-2-22 12:29:58
8#
这是两种创建String对象的方法,String s=new String(“abc”)说明是在堆内存中开辟一个新的空间把abc的地址给S,String s=“abc”说明把内存中原先的对象付一个abc,不会再开新的内存对象了

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

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