通过内存解析String的基本原理

本文详细解析了Java中String类型的两种赋值方式及其内部实现机制,包括字符串常量池的作用和对象创建过程,并讨论了不同情况下字符串对象创建的位置。

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

1.java中String类型有两种赋值方式:直接赋值,如:String s = "a";     通过new赋值     如String s = new String("a");

2.String类型是引用类型,其内存地址开辟在堆取。但是在堆区有一块区间称为字符串常量池。这块区间是用来干嘛的呢?当直接赋值时,要看值在编译期能不能确定,若能就会在常量池中创建对象,若不能就会在运行期时在堆区(字符串常量池外)创建对象。

3.哪些情况是在编译器能过确定值得呢。(1).直接附明确的值 如:String s ="a";(2). 通过final关键字   如:final String s = "a"; String s1 = s +1;   不确定的情况有  (1)没有使用关键字final  如:String s = "a"; String s1 = s+1;  此时s是变量在编译的时候不能确定其值,故s1在编译器不能确定值,会在运行期在堆中创建对象。(2)String s = getString()+1; 这里的getString会返回一个字符串,无论有没有fianl关键字,都会在堆中开辟空间。

4.直接赋值时,是至多只创建一个对象。如何理解呢?String s ="a";此时会在字符串常量池中常见一个对象,存储"a",如果再有String s1 = "a";那么就不会再创建对象了,因为字符串常量池中已经有了“a” .此时s1只是只想这个“a”即可。

5.用new关键,是至少创建一个对象。String s = new String("a");  它会先检查在字符串常量池中是否有对象“a”.如果没有,则会先在字符串常量池中创建“a”对象,然后再在堆中创建"a"对象,s指向这个对象。如果常量池中已经有了这个对象,则只在堆中创建即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值