String str=new String()+"abc"一共创建了几个对象?

解决方案 »

  1.   

    new String() --> 2个对象
    "abc" --> 1个对象
    两者相加 --> 1个对象
      

  2.   

    两个,一个是"abc"字符串,一个是str
      

  3.   

    new String() 为什么创建两个对像?
      

  4.   

    3个,你开始new的时候一个str,你加上abc又是一个,然后赋值的时候其实是又建立了一个,所以是三个
      

  5.   

    错了 错了 哈哈纠正下  new String() --> 1个对象
    “abc”--> 1个对象
    两者相加 --> 1个对象和String str = new String()相比,多了一个abc字符串。
      

  6.   

    3个对象,建议楼主看看孙维琴的关于java编程的书,挺好的
      

  7.   

    String str=new String()+"abc"
    一共创建4个字符串:
    1."abc"为一个字符串
    2.new String()创建了一个字符串
    3.new String+"abc"创建了一个字符串(String类型连接是新建一个新的字符串,不同于StringBuffer)
    4.str为指向新生成的字符串的引用,本身会在内存中创建一个String类型的引用对象
      

  8.   

    这个要看楼主问的是结果还是过程
    如果是结果,很明显,1个,也就是堆中的"abc"
    如果是过程,则是堆中一个""和"abc",然后new出一个"abc"(2者相加),原来的2者变成垃圾对象,随时gc
      

  9.   

    str为指向新生成的字符串的引用,本身会在内存中创建一个String类型的引用对象
    这句话是没错但是 new String+"abc"创建了一个字符串(String类型连接是新建一个新的字符串,不同于StringBuffer)   他们其实指的是一个字符串,因为后面是给前面的付初值,你不能把
    String str=new String()+"abc" 拆开来看所以是3个
    如果你是这样写的String str=null;str=new String()+"abc" 那就是4个
      

  10.   

    str为指向新生成的字符串的引用,本身会在内存中创建一个String类型的引用对象
    这句话是没错但是 new String+"abc"创建了一个字符串(String类型连接是新建一个新的字符串,不同于StringBuffer)   他们其实指的是一个字符串,因为后面是给前面的付初值,你不能把
    String str=new String()+"abc" 拆开来看所以是3个
    如果你是这样写的String str=null;str=new String()+"abc" 那就是4个
      

  11.   

    new String() --> 1个对象 
    "abc" --> 1个对象 
    str --> 1个对象三个对象 什么时候给个正确答案
      

  12.   

    三个对象
    new String()创建一个
    "abc"创建一个
    new String() + "abc"创建一个StringBuffer对象
      

  13.   

    字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。例如:
         String str = "abc";
     等效于:
         char data[] = {'a', 'b', 'c'};
         String str = new String(data);
    Java 语言提供对字符串串联符号("+")以及将其他对象转换为字符串的特殊支持。字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的。字符串转换是通过 toString 方法实现的,该方法由 Object 类定义,并可被 Java 中的所有类继承。
    所以,
         new String()初始化一个新创建的 String 对象,使其表示一个空字符序列——产生的第一个对象
         "abc"初始化"abc"对象——产生第二个对象
         new String()+"abc"生成"abc"对象,但是由于之前已经生成了"abc"对象,因此这里共享"abc"对象,没有产生新的对象。
         最终产生的对象是2个对象而已。
      

  14.   

    new String()+"abc"生成"abc"对象,但是由于之前已经生成了"abc"对象,因此这里共享"abc"对象,没有产生新的对象这里说错了,应该是产生一个StringBuffer对象,但是不产生"abc"字符串对象了。
        所以最终是产生new String()、"abc"和StringBuffer 3个对象。
      

  15.   


    引用对象??     这是什么感觉应该是3个吧         new String()    &  "abc"    concatenated to a new object str
      

  16.   

    又是一个这样的鸟问题,难道你们不能先去了解一下jdk编译器和java字节码么?
    问这种问题有什么意义呢,就像问回字几种写法,了解原理不就可以了,一天到晚刻意的追着这个无聊的问题探讨以此来显示自己博学的可笑心里。
      

  17.   

    一个对象 str ,"abc"为常量
      

  18.   


    "abc" 这玩意即是一个对象,也是一个常量,人才。
      

  19.   

    str 不就是那两个相加生成的对象么?
    3个
      

  20.   

    new String()  创建一个
    "abc" 创建一个
    String str   创建一个
      

  21.   

    最后,相加得到的String对象和str指向的肯定是同一个对象啊 并不会在内存中去创建一个引用对象 也就是它仅仅是指向String对象的内存区域 而不会再去内存中去创建一个String对象。
    public class HowManyString {
    public static void main(String args[]){
    String str1 = new String();
    String str2 = "";

    System.out.println(str1 == str2);
    System.out.println(str1.equals(str2)); //str1与str2(也就是"")不是同一个对象

    String str3 = new String() + "abc";
    String str4 = "" + "abc";
    String str5 = "abc";

    System.out.println(str3 == str4);
    System.out.println(str3 == str5);
    System.out.println(str4 == str5);//str3与str4和str5不是同一个对象,str4与str5是同一个对象,因为编译优化
    }
    }
      

  22.   

    其实问题就是new String()+"abc"的时候发生了什么,是重新开辟了空间,还是就是在new String()开辟的位置上添加了新的内容。
    应该和34楼说的一样,str指向的就是new String()所在的空间。
      

  23.   

    感觉大家都混淆了
    具体是这样的
    String str=new String()+"abc"
    1 编译期
        1) 无法确定new String()
        2) 检测"abc"在string中是否存在equals("abc")返回true的字符串(string pool中没有对象),
             因为返回false,所以在string pool中放入"abc"
        3) 因为1,所以new String()+"abc"无法确定
    2 运行期
         1)查找string pool中有无"",没有,则将""放入string pool,并且由于new关键字,所以在堆中创
            建"abc"对象,返回引用
         2)查找string pool中有无"abc",有(编译期放入),所以不在堆中创建新的"abc"对象
         3)new String()+"abc",查找string pool,存在"abc",由于new,在堆中创建新的"abc"对象最后剩下的是引用str指向"abc"这个对象,其余对象随时被gc
    之前我说错了,一共创建2个对象,留下一个,另个为垃圾对象,随时被回收
      

  24.   

    修正下
    运行期中第一条“所以在堆中创建"abc"对象打错了”,是创建""对象
      

  25.   

    楼主要说清楚:是几个String对象,还是JAVA的对象
      

  26.   

    String str>>>>>>>>>>一个对象
    new >>>>>>>>>>>>>>>一个对象
    "abc">>>>>>>>>>>>>>>一个对象
    new String()+"abc">>>>>>>>>一个月的对象4个对象
      

  27.   

    支持这个,这个正解,其它都胡说!!!
    17楼大侠你的说法有点问题吧。
    顺便看看段代码:
    package zxr;/**
     * 
     * @author Java-Demon
     *
     */
    public class StringTest { /**
     * @param args
     */
    public static void main(String[] args) {
    String s=new String()+"abc";
    String s2="abc";
    if(s==s2){
    System.out.println("s==s2");
    }else{
    System.out.println("s!=s2");
    }

    String s3=new String("abc");

    if(s==s3){
    System.out.println("s==s3");
    }else{
    System.out.println("s!=s3");
    }

    if(s2==s3){
    System.out.println("s2==s3");
    }else{
    System.out.println("s2!=s3");
    } }}结果:
    s!=s2
    s!=s3
    s2!=s3
    我想大家应该明白了。
      

  28.   

    就3个  str和相加的那个是一样的  分清楚编译期和运行期就好了
      

  29.   

    三个
    "abc"----->1个
    new String()--->1个
    new String()+"abc" ---->1个
      

  30.   

    你的意思是String str不是一个对象咯,意思说str和new String()+"abc"是同一个对象了。
    那好,现在我们假设有2个String对象引用
    String str1 = new String()+"abc";
    String str2 = str1;
    str1 = "a";
    System.out.println(str1);
    System.out.println(str2);
    那么按照你的想法既然str1和new String()+"abc"是同一个对象,那么在接下来我让str2指向str1,然后改变str1的指向,既然你说str1和new String()+"abc"是同一个对象,那么请你来解释一下既然我改变了同一个对象的值(引用),为什么str2的指向依然为str1指向改变之前的对象,按你说的改变了同一个对象那么应该对象被改变了才是
      

  31.   

    你要记住,JAVA字符串是不可变的
    str2指向str1是将之前str1指向对象的地址给了str2
    str1="a";是将str1指向了常量池中的"a",只是改变了str1引用的值,而不是改变了原有的对象内容,此时str2并没有被改变
      

  32.   

    你的str1 = "a"这句话的作用是在内存中开辟一个块区域(字符串池中)生成“a”,并且将a的引用抛给str1。之所以没有改变str2的指针,是因为String是immutable的(不可变的),看看下面代码的输出:
    String str1 = "abc";
         String str2 = str1;
        
         str1 = "a";
        
         System.out.println(str1);
         System.out.println(str2);
        
         StringBuffer sb1 = new StringBuffer(str2);
         StringBuffer sb2 = sb1;
        
         sb2.append("d");
        
         System.out.println(sb1.toString());
         System.out.println(sb2.toString());
    输出:
    a
    abc
    abcd
    abcd
    所以说str1和那个new String()+"abc"是不是一个对象不能由你的那段代码来否定,呵呵~~事实上,这道题如果说清楚:那段代码到底在内存中生成多少个String的对象,我想就不会有这么多答案了。就是3个。new String()+"abc"是在内存中新产生了一个“abc”,这个abc不在常量池中,是在对象存储区:堆(heap)里。然后str1引用了这个对象。就是这么一回事儿。反证法,如果str1和那个不是一个对象,我问你:String str = "abc";这有几个对象呢?如果是1个的话,那和上面的有什么区别?abc当然就是str了!
      

  33.   

    为什么都要说是3个呢?"abc"在string pool中,他根本不算对象
    就好比String a ="abc"
    这句话根本没有创建对象,只是在编译的时候往string pool中放入"abc"
    然后运行期间,返回引用,而引用a也不是对象
      

  34.   

    针对我52#的回复 以及我之前的回复,我发现我被绕晕了!!!吃饱了饭不能回答这类问题。现在,我把最终表述说一下:new String() 产生1个String对象 在heap中
    "abc"产生1个对象 在字符串池中
    new String() + "abc" 产生1个String对象 在heap中
    关键是这个str的引用是不是一个对象,这里是我搞错了 (也是我一开始搞对的,然后被人问了一句就又搞错了),回答是str和new String()+"abc"是2个对象,都在heap中。两者唯一相同的地方是它们的字符数组是一样的。所以47#不好意思,是我错了,但是你的例子是无法说明你的论点的。因此一共4个String对象在内存中。
      

  35.   

    3给对象  
    String  str --1
    new  String --2
    String+“abc”--3
      

  36.   

    说错了  3个
    string str---1
    new  string ----1
    “abc”--1
    楼主答案是多少啊 
    这么多的意见!
    到底哪个是对的?
      

  37.   


    看来是对对象的理解不同了,我认为str这个引用不是java对象,还有在string pool中的"abc"也不是对象,原因就是在与string pool的机制
    整个创建过程在37~38#我说得很清楚了至于58#的疑问,我认为这个纯属个人兴趣,就好比一个卖菜的,突然问这个菜怎么生长的,他就去问种菜的了
    不爱种菜的就可以无视了
      

  38.   

    String str=new String()+"abc"一共创建了几个对象?1:new String()
    2:new String()+"abc"
    3:String str=new String()+"abc"
    三个对像麻
      

  39.   

    "abc"不是创建的对象算是常量吧
      

  40.   

    3个 
    1 abc
    2 ""
    3 str
      

  41.   


    建议你好好学习一下JAVA基础吧
      

  42.   

    首先,String是不可变的,因此一旦有新的String就会生成一个对象,再加上字符串也是对象,所以楼主问题的答案是----4
      

  43.   

    汗,你也说str1指向了内存中的已有对象,那难道你的str1和str2就不是对象了,我没有说str1改变对象内容,我只是来回答我之前引用的那位仁兄的str和在内存中的那个new String()+"abc"是同一个对象的结论而已。
    就是4个,一旦String str,就会在内存中生成一个String类型的对象,和他所指向的String对象不是同一个。
      

  44.   

    回71# 是4个 对象不一样 但是你的代码不能证明他们是不一样的 因为String是不可变的  但是这两个不一样的字符串是指向同一个字符数组的
      

  45.   

    一个不知道重复了多少次的问题了。每过一段时间,就会重复出现一次。楼主若搜索一下CSDN,会找到许多的。几个String对象
    当然是3个String对象了。因为:String str=new String()+"abc";编译时是按如下代码进行的 String s = (new StringBuilder()).append(new String()).append("abc").toString();上边三个红色的部分,就是三个String对象。注意:不要把String对象与String的引用相混淆。