String创建对象

本文探讨了Java中String对象的创建过程,特别是在不同场景下String对象的数量,并介绍了String、StringBuffer与基本类型之间的转换方法。

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

例1: String x = new String("xyz"); (1)
String y = "abc"; (2)
x = x + y; (3)
问:上述三个语句总共创建了多少String对象?
答:总共4个String对象,语句(1)中在Heap上创建了一个对象,同时也在String常量池中创建了一个值为"xyz"的对象;语句(2)在String常量池里创建了一个值为"abc"的对象;语句(3)中表达式x+y在String常量池中创建了一个值为"xyzabc"的对象,然后用引用x指向该对象的内存地址。


例2:String s = new String("xyz"); (1)
String y = "abc"; (2)
String z = new String("xyz"); (3)
x = x + y; (4)
问:上述三个语句总共创建了多少String对象?
答:总共5个String对象,和例1中唯一的差别在于语句(3)只在Heap中创建了一个String对象,而没有在String常量池里创建新的对象。

从上面两个例子中,我们可以发现修改String对象带来的耗费是十分巨大的,例如
以下语句:
String a = "aaa";
a = a + a.toUpperCase();
在执行a.toUpperCase()的时候在常量池中生成一个对象,执行a + a.toUpperCase()的时候又在常量池中生成一个对象,其根本原因在于String对象的不变性。当程序需要生成很多String对象的时候,内存空间的问题就有待解决了。
幸运的是,我们可以利用StringBuffer对象,它同样也利用String常量池,但是主要的优点是StringBuffer对象的值在常量池上是可以改变的。例如:
StringBuffer sb = new StringBuffer("sb");
sb.append("a"); //append "a" behind "sb"
这样sb仍然指向原来的String常量池的内存区域,但是相应内存的值发生了变化,所以利用StringBuffer对象生成或者修改字符串的代价一般来说是String对象的一半。
那么,如何将StringBuffer对象转化为String对象呢,我们可以利用toString这个方法,比如:
String s = sb.toString();
最后让我们来看一下String类型、基本类型以及外覆类类型是如何相互转化的:
(1) String类型向基本类型的转化: 可以使用parseXXX方法,XXX只的是转化后的类型,例如:
String s = "12";
int i = Integer.parseInt(s);
(2) String类型向外覆类型的转化: 可以使用valueOf方法,例如:
Float f = Float.valueOf("3.14");
(3) 基本类型事实上没有直接的方法转化成String类型。但是,如果你实在想转化,可以利用以下技巧: String s = i + "";
其他方面的转化阅读javadoc就知道,在此略去。希望这两篇关于String类型的应用的文章能给您提供帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值