Java中String创建原理学习笔记

本文详细介绍了Java中创建String对象的三种常见方式,并解释了其内存分配原理。通过实例展示了不同创建方式下字符串对象在内存中的表现,强调了String池的作用以及使用`+`运算符创建字符串时的内存行为。同时,提到了`intern()`函数的作用,以及如何通过它来优化内存使用。文章最后提供了代码示例以加深理解。

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

学习地址原文链接:https://blog.youkuaiyun.com/u012468376/article/details/50682444  https://blog.youkuaiyun.com/weixin_28804379/article/details/115040632

创建String对象的常用方式:
1、  使用new关键字 

String s1 = new String(“ab”);  //

2、  使用字符串常量直接赋值

String s2 = “abc”;

3、  使用”+”运算符进行字符串连接

String s3 = “abc” + “d”;

String s4 = s3 + 5;  //abcd5

String对象的创建很讲究,关键是要明白其原理。

原理1:当使用任何方式来创建一个字符串对象s时,Java运行时(运行中JVM)会拿着这个s在String池中找是否存在内容相同的字符串对象,如果不存在,则在池中创建一个字符串s,否则,不在池中添加。

原理2:Java中,只要使用new关键字来创建对象,则一定会(在堆区或栈区)创建一个新的对象。

原理3:使用直接指定或者使用纯字符串串联来创建String对象,则仅仅会检查维护String池中的字符串,池中没有就在池中创建一个,有则罢了!但绝不会在堆栈区再去创建该String对象。

原理4:使用包含变量的表达式来创建String对象,则不仅会检查维护String池,而且还会在堆栈区创建一个String对象。
 

练习

public class StringTest{
public static void main(String[] args){
String str1 = "hello";

String str2 = "hello";

String str3 = "he" + "ll" + "o";

System.out.println(str1 == str2);

System.out.println(str1 == str3);

String str = "o";

String str4 = "hell" + str;

System.out.println(str1 == str4);

String str5 = new String("hello");

System.out.println(str1 == str5);

System.out.println(str4 == str5);

System.out.println(str1.equals(str5));

//intern()函数作用:直接获取常量池中字符串常量的地址并返回。

System.out.println(str1==str5.intern());

String str6 = new String("beyond");

}

}

//输出的结果

//true

//true

//false

//false

//false

//true

//true
b19a0987f04b1e847387f597f4ac7d4e.png

通过方式一创建String对象,会先查看常量池中是否有这个字符串常量,如果存在,则直接将引用指向这个常量(即例子中:str1==str2为true)。比较疑惑的会是str3,str4。因为str3由字符串常量“he”、"ll"、“o”组成,编译器发现这三个常量组成的字符串常量已经存在了常量池中,即编译期间就已经确定了最终值,则也会将引用指向“hello”字符串常量。对于str4,因为编译器不能在编译时就确定字符串最终的值,所以会将字符串常量“hell”存放在常量池,再在堆中生成最终的对象【引申一下:通过“+”连接字符串,底层是通过new StringBuilder()的append()方法进行拼接,所以应避免在循环中使用“+”来拼接字符串,以免创建大量垃圾对象】。

​ 通过方式二而创建String对象,首先会先查看常量池中是否存在这个字符串常量,如果存在,则直接在对内存中new出新对象;否则,会先在常量池生成这个字符串常量,再在堆中生成新对象(如图中str6)。特别注意:(new出对象的值为常量池中这个字符串常量的地址,也就是堆中存放的都是字符串常量中的地址)
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值