Java - 内存分析:字符串常量池

本文深入解析Java中字符串实例化、字符数组实例化及字符串对象实例化的过程,详细描绘了内存结构图,阐述了字符串常量池的作用,并对比了不同实例化方式下内存中的数据流动差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图片内容源自B站黑马Java基础公开课

给定以下字符串实例化的代码段,分析内存中的数据流动

一、绘制内存结构图

在这里插入图片描述

二、字符串实例化

	String str1 = "abc";
  1. 栈中开辟main方法栈帧(图中省略),在栈帧中开辟一段名为str1的地址空间,用于保存字符串实例的地址
  2. 堆中实例化一个字符编码数组,数组长度为字符串长度,内容为字符串中每个字符的编码值(图中以ASCII码为例)
  3. 堆中有一块专门存储字符串对象的区域:字符串常量池。在其内部实例化一个String对象,将上述字符编码数组的首地址赋值给String对象,相当于字符串常量池中的一个字符串对象指向一个字符编码数组
  4. 将该字符串的地址赋值给栈帧中的str1变量,相当于变量str1指向/引用了该字符串对象

在这里插入图片描述

	String str2 = "abc";
  1. 在栈帧中开辟一段名为str2的地址空间,用于保存字符串实例的地址
  2. JVM首遍历字符串常量池中储存的字符编码数组(当然,这个过程在上一句中也会执行),一旦发现存在与即将赋值的字符串相同的实例,那么直接将相同字符串实例在堆内存中的地址值赋值给str2变量

在这里插入图片描述

三、字符数组实例化

	char[] charArray = {'a', 'b', 'c'};

参考数组的内存分析部分,在堆内存中实例化一个字符数组,将其首地址赋值给栈内存中的charArray变量
在这里插入图片描述

四、字符串对象实例化

	String str3 = new String(charArray);
  1. 利用字符数组实例化字符串对象时,JVM首先会将目标字符数组转化为字符编码数组
  2. 一切new出来的对象都在堆内存中。参考对象的内存分析部分,JVM在堆内存中实例化一个String类对象,将上述字符编码数组的首地址赋值给字符串对象
  3. 将字符串对象的地址赋值给栈帧中的字符串类型变量str3

在这里插入图片描述

五、总结

  1. 对于引用数据类型,== 进行的是地址值的比较
  2. 双引号 “” 直接引上的字符串常量池中,new 出来字符串对象的不在常量池中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值