请教大家一个问题
  如 String str1 = "a"+"b"+"c";
String str2 = new String("a"+"b"+"c");这类的问题, 创建了多少个对象, 如何判定?
谢谢

解决方案 »

  1.   

    str1 创建了3个
    str2 创建了1个吧
      

  2.   

    String str1 = "a"+"b"+"c"; 

    String str2 = "abc";两者是相同的对象 都是字符串池中的"abc"对象。
      

  3.   

    每一个字符串,如"a",都会在内存的常量池中创建一个对象。
    而每new一个string,都会在栈创建一个引用,这个引用指向常量池中的对象,如果常量池中有这个对象,就不创建,没有则创建。
      如:String str1 = new String("a");String str2 = new String("a");
    在栈中创建2个引用,在常量池中创建一个对象
      

  4.   


    第一:常量池中有一个String类型字面值的常量表CONSTANT_String(标志值8),"a"、"b"、c"就存在里面。但我不认为常量表中存放的是String对象,或者是String对象的引用。应该存储的就是String的字面值。第二:每new一个string,一定会指向常量池中的东西吗,如果真像你所说的:
               String str1=new String("aaa");  //str1指向常量池中的"aaa"
               String str2=new String("aaa");  //str2也指向常量池中的"aaa"
               试问一下: str1==str2应该就是true了哦??我刚写了篇博客:《String in Java》,欢迎大伙来扔砖头....
      

  5.   

    好久没来CSDN了,小猴子还是那么一如既往的乐于助人,颇让人欣慰
      

  6.   

    String str1 = "a"+"b"+"c";  一个对象
    String str2 = new String("a"+"b"+"c"); 2个对象
      

  7.   

    很作孽的问题啊,都看烂了
    如果认为STRING POOL中的常量是对象的话
    String str1 = "a"+"b"+"c"; 
    创建一个对象"abc"
    在编译期于string pool中创建,执行期不创建,只是返回其引用
    String str2 = new String("a"+"b"+"c");
    创建两个对象,内容都是"abc"
    在编译期由于new无法确定,所以不创建任何对象,执行期搜索string pool
    如果这2个语句是分开执行,则string pool中没有"abc",所以在string pool中创建"abc"常量,并且在堆区创建"abc"对象(该对象可以说是string pool中"abc"的副本),返回堆中对象的引用。
    如果这2个语句是顺序执行,则string pool中有"abc",于是直接在堆中创建"abc"对象,返回堆中对象的引用。
      

  8.   

    String str1 = "a"+"b"+"c"; 
    这个创建了:
    1、"a"
    2、"b"
    3、"c"
    4、"ab"
    5、"abc"
    总计5个
    String str2 = new String("a"+"b"+"c");
    这个比上面还多一个new创建的对象其实计算对象时把握几点:
    1、每个字符串都是常量,所以"a"、"b"、"c"都是一个个的对象
    2、每次操作都会产生新的字符串对象,例如"ab"和"abc"
    3、遇到new则申请内存,创建新的对象
      

  9.   

    String str1 = "a" + "b" + "c";  1个String str2 = new String("a" + "b"+ "c");  6个
      

  10.   

    每一次“ ”都会创建一个String对象,每一次 + 又会因连接产生一个新的String对象。
      

  11.   

    你这样说的话,String s = "a" + "b" +"c";//这是三个对象.
    String abc = "abc";//这是一个对象?
    System.out.print(s==abc);//true
    那么这个是怎么来的?
    String a = "a";//一个对象
    String b = "b";//一个对象
    String c = "c";//一个对象
    String x = a + b + c;//这里三个对象.
    System.out.print(x==abc);//false
      

  12.   

    这个不对,当+两边都是常量的时候,jvm在编译的时候只会创建结果后的常量
      

  13.   

    我把String s="a"+"b"+"c";这句话编译以后的指令是:
        0  ldc <String "abc"> [16]
        2  astore_1 [s]
    我认为编译阶段就已经将常量a,b,c合并起来生成了一个新的常量abc。然后在将abc所在内存的位置存放在字符串引用s中。
      

  14.   

    汗,就创建两个对象一个是“abc”,另一个对象指向这个对象
      

  15.   

    String str1 = "a" + "b" + "c";  1个 
    String str2 = new String("a" + "b"+ "c");  2个
      

  16.   

    String 对象的问题是 CSDN 最经久不衰的问题,不到一个月会来一个。大家看看回复框上面的“相关问题”就知道了。我感觉喜欢看《Thinking in Java》的人,很喜欢提关于 String 多少个对象这类没有啥用处的问题!
      

  17.   

    String str1 = "a"+"b"+"c" 只在stack池中创建了一个对象“abc”,原音是是在编译阶段编译器会解析出来你不就想要一个"abc"对象吗?所以编译器会帮你得到
    而String str2 = new String("a"+"b"+"c")会得到两个对象,一个时stack池中的“abc”,一个是
    new 出来的,会存放到heap池中