字符串内存分配

    对于字符串,其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。


这里解释一下黄色这3个箭头,对于通过new产生一个字符串(假设为“china”)时,会先去常量池中查找是否已经有了“china”对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”china”对象的拷贝对象。

这也就是有道面试题:String s=newString(“xyz”);产生几个对象?一个或两个,如果常量池中原来没有”xyz”,就是两个。

存在于.class文件中的常量池,在运行期被JVM装载,并且可以扩充。String的 intern()方法就是扩充常量池的 一个方法;当一个String实例str调用intern()方法时,Java 查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用,如果没有,则在常量池中增加一个Unicode等于str的字符串并返回它的引用

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 从网上复制的,看别人的比较全面,自己搬过来,方便以后查找。原链接:https://www.cnblogs.com/...
    lxtyp阅读 1,357评论 0 9
  • 1.类加载子系统负责从文件系统或者网络中加载class信息,加载的信息存放在一块称之为方法区的内存空间。 2.方法...
    Y了个J阅读 525评论 3 1
  • Java内存分配与管理是Java的核心技术之一,一般Java在内存分配时会涉及到以下区域: 寄存器:我们在程序中无...
    yekai阅读 337评论 0 3
  • 每当感叹时光过的飞快的时候,其实已经过去很久了。总是感叹时间是把杀猪刀。让以前那些形影不离的人,从无话不...
    他说MM阅读 328评论 0 0
  • 公司爱恩医疗马上就要开业了,明天又是一场硬仗要打,老大上台一个人就能搞定95%,要像老大学习,要学会演讲,发挥...
    乐曦悦曦阅读 188评论 0 0