String str =new String['abc'];
这创建了几个对象呢,分别放在哪呢,thanks
------解决方案--------------------
语句都写错了
没有比这个解释更好的了:http://www.iteye.com/topic/774673
------解决方案--------------------
如果字符串常量池中没有“abc”常量的好话,则在常量池里建立一个“abc”常量,有就不建立了
然后再堆中建立了一个字符串对象
栈中的引用str指向堆中的字符串对象
------解决方案--------------------
接下来会有N多人说到常量池,请问你们知道 常量池 究竟在哪吗?
------解决方案--------------------
LZ这个月又来了
------解决方案--------------------
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";)有可能没有创建新的对象!(至多一个)~
------解决方案--------------------
+1
------解决方案--------------------
------解决方案--------------------
这个问题问的好,坐等说常量池的那些人回答
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
百度的
理解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的值是应该是存在堆空间中的。
------解决方案--------------------
看图说话: