Java字符串操作的误区

本文探讨了Java中字符串操作的不同场景及优化方式,特别是在循环中使用StringBuilder的重要性。

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

      要说java字符串操作,很多人会想起符号“+”,例如:String str = "abc" + "e" + 23;等等。我们知道字符串一旦创建是不可变的,所以为了字符串操作方便,在java SE5之前,我们一般用StringBuffer处理字符串操作,java SE5之后,java仿效C#引入了StringBuilder,它们两个之间的区别就在于:

      StringBuffer是线程安全的,因此开销会大些,而StringBuilder是线程不安全的,操作效率会比较高。

      那现在好像字符串操作似乎没问题了呗,因为只要碰到操作,我就用StringBuilder不就行了嘛。其实一门语言要弄得比较透彻,那得透过现象看本质,即我们看看java底层到底是如何实现字符串操作的,这种情况下,我们才可以断定什么情况下我们用StringBuilder,什么情况下不要盲目使用StringBuilder类。我们看下面的案例:

 

案例1:纯字符串相加

 

       运用JDK自带的工具javap来反编译以上代码,命令如下:

       javap -c Hello

 

      运行结果如下图示:

我们看到main方法的第0行,已经给我算出String对象的值为:“abce22”,并没有创建多余的对象,所以此时你不用创建StringBuilder对象来相加字符串。

 

案例2:对字符串操作的同时带有字符变量

此案例是我们经常用到的,因为一般书写SQL(HQL,JPQL...)都会用到这种字符串操作。例如下面代码:

这种情况下,一般PM也会建议大家用StringBuffer或者StringBuilder,那到底有没有用的必要呢?我们看反编译后的代码:

请大家仔细看main方法里的代码,第3行好像java帮我们创建了StringBuilder对象,说明java本身带有优化机制,而且至始至终只创建了一个StringBuilder对象,在第12,16,21行分别调用了StringBuilder对象的.append()方法,在24行调用了StringBuilder对象的.toString()方法。通过上面的情形,我们可以看到,其实我们经常书写SQL时可能忘了用StringBuilder,但不用担心,java自身所带的优化机制可以帮我们处理这些事情。所以在这种情形下,我们仍没必要创建自己的StringBuilder对象。

 

案例3:对字符串操作的同时带有字符变量,并且带有循环操作

 

先看第3行的方法:testStringBuilder(),它反编译后为:

 我们注意比较特殊的几个方面:

1,在行4初始化StringBuilder对象;

2,在行35,55调用append()方法;

3,在行62出现汇编符号:“goto 19”,因为我们代码中有循环操作,所以相当于从62行又跳到19行运行;

4,在行66调用toString()方法。

至此我们至始至终创建了一个StringBuilder对象,因为它在循环之外。

 

再看源码第5行方法:testStringAdd(),它反编译后的部分代码如下:

 

 我们注意比较特殊的几个方面:

1,在行64初始化StringBuilder对象;

2,在行68,73调用append()方法;

3,在行83出现汇编符号:“goto 14”,因为我们代码中有循环操作,所以相当于从83行又跳到14行运行;

4,在行76调用toString()方法。

至此我们只要调用此方法的循环一次,就会重新创建一个StringBuilder对象,因为StringBuilder的初始化在循环当中。看来java自身的优化在循环中不起作用了。所以在此种情况下,我们必须使用StringBuilder对象,处理我们的字符串。

 

      看了以上的案例,我们发现在案例1,2情形下是没有必要用StringBuilder或者StringBuffer去处理我们的字符串对象的,因为java自身有优化我们代码的机制。而在情形3下,我们必须使用StringBuilder或者StringBuffer(不推荐)来处理我们的字符串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值