package test;public class StringTest {
public static void main(String[] args) { String s = "a";
s += s + "b";
}
}
能否有大佬告知该执行过程中在堆内存中共创建了几个对象? 最好把过程详细告知.谢谢各位大佬

解决方案 »

  1.   

    两个对象,创建一个对象"a",然后将引用s指向"a",然后创建了一个对象 s + "b",引用s原来指向的对象成为了垃圾对象,但后面又被用到所以没被回收 和"b'进行连接成为“ab”,同时引用s指向新的对象“ab”
      

  2.   

    楼上正解 推荐楼主复习下String常量池和动态区的知识
      

  3.   

    String s = "a"; 创建栈和字符串常量池对象“a”
    s += s + "b";创建字符串常量池对象“aab”  并把s指向这个新的对象
    所以总共创建了字符串常量池中的两个对象 如果用new String还会在堆中再创建一个对象
      

  4.   

    四个,虚拟机会最先创建“a”对象和“b”对象这两个字符串常量,放在栈里,然后计算s+"b" = “a” + "b",这时创建新的字符串对象"ab',放在栈里,然后计算s+="ab"也就是s+"ab" = "a" + "ab",创建新的字符串对象"aab"。Java虚拟机里所有的字符串对象都放在栈里
      

  5.   

    Java虚拟机里所有的字符串对象都放在栈里只看这一句就错到家了,前面的也不对。
      

  6.   

    最后一句表述是不对,应该是String池。String池在1.7以前是放在方法区。虚拟机计算字符串相加,每计算一次会产生一个字符串对象的。新的对象会放在String池里,既使没有变量的引用,这个对象依然存在。
      

  7.   

    最后一句表述是不对,应该是String池。String池在1.7以前是放在方法区。虚拟机计算字符串相加,每计算一次会产生一个字符串对象的。新的对象会放在String池里,既使没有变量的引用,这个对象依然存在。
    题主问的是堆中创建了几个对象,堆中没有创建对象。如果你用s = new String("a"),虚拟机会在堆中创建一个对象,在String池中创建一个对象