String str =new String['abc'];这创建了几个对象呢,分别放在哪呢,thanks

解决方案 »

  1.   

    String str =new String["abc"];这创建了几个对象呢,分别放在哪呢,thanks
      

  2.   

    语句都写错了没有比这个解释更好的了:http://www.iteye.com/topic/774673
      

  3.   

    如果字符串常量池中没有“abc”常量的好话,则在常量池里建立一个“abc”常量,有就不建立了
    然后再堆中建立了一个字符串对象
    栈中的引用str指向堆中的字符串对象
      

  4.   

    String str = new String("abc");
    这个语句首先会在堆中建立这个对象,并把栈中的引用指向堆中的这个对象;然后到String pool检查是否存在这个对象,如果不存在,就在String pool里面建立这个对象,如果存在就不在String pool里做什么!
    又如:String str1 = "abc";
    这个语句首先到String pool里面检查是否存在这个对象,如果存在,就把栈中的引用指向String pool中的这个对象,如果不存在,就在String pool里建立这个对象,并把栈中的引用指向String pool中的这个对象!~总结:用了new 关键字的形式(String str = new String("abc");)至少会创建一个对象,
          没有用new关键字的形式(String str1 = "abc";)有可能没有创建新的对象!(至多一个)~
      

  5.   

    百度的
    理解Java常量池
    JVM运行时数据区的内存模型由五部分组成:【1】方法区
    【2】堆
    【3】JAVA栈
    【4】PC寄存器
    【5】本地方法栈
    常量池虚拟机必须为每个被装载的类型维护一个常量池。常量池就是该类型所用到常量的一个有序集和,包括直接常量(string,integer和floating point常量)和对其他类型,字段和方法的符号引用。对于String常量,它的值是在常量池中的。而JVM中的常量池在内存当中是以表的形式存在的,对于String类型,有一张固定长度的CONSTANT_String_info表用来存储文字字符串值,注意:该表只存储文字字符串值,不存储符号引用。说到这里,对常量池中的字符串值的存储位置应该有一个比较明了的理解了。在介绍完JVM常量池的概念后,接着谈开始提到的"haha"的值的内存分布的位置。对于haha的值,实际上是在class文件被JVM装载到内存当中并被引擎在解析ldc指令并执行ldc指令之前,JVM就已经为haha这个字符串在常量池的CONSTANT_String_info表中分配了空间来存储haha这个值。既然haha这个字符串常量存储在常量池中,根据《深入JAVA虚拟机》书中描述:常量池是属于类型信息的一部分,类型信息也就是每一个被转载的类型,这个类型反映到JVM内存模型中是对应存在于JVM内存模型的方法区中,也就是这个类型信息中的常量池概念是存在于在方法区中,而方法区是在JVM内存模型中的堆中由JVM来分配的。所以,haha的值是应该是存在堆空间中的。