作者:Yiyuery 链接:https://juejin.cn/post/6872202037426618382 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

对于String类型,其对象内部需要维护三个成员变量,char[] chars,int startIndex, int length。chars是存储字符串数据的真正位置,在某些情况下是可以共用的,实际上String类型是不可变类型。例如:String str=new String("hello"),内存分布如下:

https://cdn.nlark.com/yuque/0/2021/webp/576791/1633901852464-8014c686-657c-4f34-aa64-e5f432aa96c9.webp#clientId=u9931c6ae-4b8a-4&from=paste&id=uf0a8fca0&originHeight=432&originWidth=974&originalType=url&ratio=1&status=done&style=none&taskId=u062c357f-b56a-48a4-b526-f67dd42ebfe


https://zhuanlan.zhihu.com/p/60150060

https://cdn.nlark.com/yuque/0/2021/png/576791/1633902781908-ae318647-3d01-4dd8-8d50-17fcfad68acc.png#clientId=u8fba51c0-6b26-4&from=paste&id=u370484ae&originHeight=133&originWidth=598&originalType=url&ratio=1&size=16496&status=done&style=none&taskId=u800fbe4d-c391-498a-a303-13a226bc46b

String类最重要的属性为char[]引用value,当我们建立一个String对象时:

https://cdn.nlark.com/yuque/0/2021/png/576791/1633902781911-b257ff9d-ab75-4aec-af7e-6527145e2340.png#clientId=u8fba51c0-6b26-4&from=paste&id=ue3f0d709&originHeight=31&originWidth=340&originalType=url&ratio=1&size=4371&status=done&style=none&taskId=u5ef11924-57d6-44ff-be11-1a92c61c378

其内存保存基本形式为:

https://cdn.nlark.com/yuque/0/2021/png/576791/1633902781911-e41e758f-4eab-41bb-8b4e-42891e0e7039.png#clientId=u8fba51c0-6b26-4&from=paste&id=u2cffde0c&originHeight=270&originWidth=416&originalType=url&ratio=1&size=8150&status=done&style=none&taskId=u01372c6e-ecc9-46aa-aa83-93a16d66758

  1. d是一个引用建立在栈上,指向了String对象的地址
  2. String对象可以建立在堆上,也可以在字符串常量区
  3. value是一个char[]引用,其指向一块内存,存放字符串

String 类型在JVM中的内存分配