当前位置: 代码迷 >> J2SE >> String 创建对象的小疑点
  详细解决方案

String 创建对象的小疑点

热度:97   发布时间:2016-04-24 00:57:07.0
String 创建对象的小问题,在线等

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
探讨
String str = new String("abc");
这个语句首先会在堆中建立这个对象,并把栈中的引用指向堆中的这个对象;然后到String pool检查是否存在这个对象,如果不存在,就在String pool里面建立这个对象,如果存在就不在String pool里做什么!


又如:String str1 = "abc";
这个语句首先到String pool里面检查是否存在……

------解决方案--------------------
探讨

LZ这个月又来了

------解决方案--------------------
这个问题问的好,坐等说常量池的那些人回答

探讨

多谢大家
4楼的,常量池在哪呀,与栈和堆 有什么关系和区别吗,

------解决方案--------------------
探讨
这个问题问的好,坐等说常量池的那些人回答
引用:
多谢大家
4楼的,常量池在哪呀,与栈和堆 有什么关系和区别吗,

------解决方案--------------------
探讨
引用:
这个问题问的好,坐等说常量池的那些人回答
引用:
多谢大家
4楼的,常量池在哪呀,与栈和堆 有什么关系和区别吗,

坐等ing~~

------解决方案--------------------
百度的
理解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的值是应该是存在堆空间中的。


------解决方案--------------------
看图说话:
  相关解决方案