JAVA中String在内存中如何分配空间

本文解析了Java中创建String对象的两种方式:直接赋值和new关键字,并深入探讨了这两种方式在内存中的表现差异,解释了常量池和堆内存的概念及其对字符串比较的影响。

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

java中创建String类型对象有两种方式

1.String a="***";

2.String a=new String ("***");

两者创建相同的字符串在内存中的地址却是不一样的,如下面的代码所示:

public static void StringTest(){

String s1="abc";

String s2="abc";

String s3=new String("abc");

System.out.println("s1 == s2 :"+(s1==s2));//true

System.out.println("s2 == s3 :"+(s3==s2));//false

}

如上面的代码所示,s1==s2返回true;而s3==s2返回false,这是为什么呢?

内存如图所示:

为了提高效率,java在内存中定义了字符串常量池,当通过String s1="abc"的方式创建字符串的时候,首先会去常量池中查看是否有"abc"字符串,如果没有则直接在字符串常量池中创建"abc",并且将该内存地址赋值给s1;当执行代码String s2="abc"的时候,同理先去字符串常量池中查看是否有"abc"字符串,由于创建s1的时候已经在常量池中创建了"abc"所以这个时候直接将"abc"的内存地址返回给s2,所以s1==s2为true

当通过String s3=new String("abc")的方式创建字符串的时候,因为通过new方法创建对象是直接在堆内存中分配空间用来创建字符串的,详细过程分为两步:

1.检查字符串常量池中是否有"abc"字符串,如果没有则在常量池中创建"abc",有则不创建

2.在中分配空间用来创建"abc"对象并且将该内存地址赋值给s3

所以s3==s2返回false(堆内存地址不等于常量池地址)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值