String str =new String['abc'];这创建了几个对象呢,分别放在哪呢,thanks
解决方案 »
- java多线程的问题
- 多线程--->生产者与消费者(1-1,n-1,n-n),新手求解
- 求助,没搞明白怎么就是空值了
- 关于jni的一点疑问
- java初学者
- 弱弱的问一下,Java中怎样自定义异常类?
- JButton和Button 在应用的时候应该注意些什么?
- 倾家荡产求答案:FileReader类和FileInputStream类有什么区别?欢迎大家说出自己对这两个类的理解
- 莫名奇妙的问题,正常情况下,在同一个文件夹中的两个类是可以相互调用的吧,可是我在一个类中调用另外一个 怎么就是编译的报错!!请指
- 怎样判断E-mail地址的合法性(用java实现)?
- java表格控件绑定数据库
- serial中的getInputString与getOutputString的具体用法。
然后再堆中建立了一个字符串对象
栈中的引用str指向堆中的字符串对象
这个语句首先会在堆中建立这个对象,并把栈中的引用指向堆中的这个对象;然后到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";)有可能没有创建新的对象!(至多一个)~
理解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的值是应该是存在堆空间中的。