String str = new String("wcg"); 创建了几个Object对象?

本文解析了Java中通过new String()创建字符串的过程。介绍了串池的概念及其如何帮助节省内存空间,并详细说明了使用new String()创建对象的具体步骤及内存分配情况。

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

String s = new String("wcg") 创建了几个String Object?

\/个!

"wcg "作为一个常量字符串首先被创建,它被保存在“串池”中。所谓串池,简单讲就是从程序运行开始,你创建的所有常量字符串被统一保存的地方。在串池中已经存在 "wcg"这个串的情况下,如果你需要一个内容相同的串,你不需要再次创建一个,而是直接用这个就可以,这样当然是为了节省空间。注意,一个字符串是无法被修改的,所以在程序的不同地方用不同变量引用同一个常量串没有任何危险,因为你只能读取它而不能修改它。
当然,使用new String()也创建了一个对象, "wcg"作为传入构造方法的实际参数,其含义就是:我要创建一个串,它的内容和串池中的 "wcg"内容一致!

首先你要理解constant pool,这是一个特殊的共享区域,literate、Class这些可以在内存中共享的不经常改变的东西,都可以放在这里。如果你用了
String s = new String( "wcg");
那么,会有两个String被创建,一个是你的Class被CLassLoader加载时,你的 "wcg"被作为常量读入,在constant pool里创建了一个共享的 "wcg"然后,当调用到new String( "wcg")的时候,会在heap里创建这个new String( "wcg");

但是如果你把String s = new String("wcg").intern(); 那么具体过程成:先在heap里创建一个String,然后调用intern()方法,发现constant pool里存在 'wcg',然后就会返回constant pool内对象的引用,稍后heap里的就unreachable了,会被gc,最终VM里只有一个"wcg"。

所以一个在heap中,一个在String常量池。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值