Java字符串类真相“大白”

来源:互联网 发布:手机上淘宝店怎么开 编辑:程序博客网 时间:2024/04/29 02:57

实际编程中对字符串的处理是我们经常不得不面对的问题。而对于java开发人员来说,我们可以很方便的处理字符串操作。但是我们有时候使用时又有些迷惑,因为API中共提供了StringStringBufferStringBuilder三个类,让我们不知道怎么取舍。本文就是好好研究一下这几个类之间的区别,帮助我们开发时选用正确的方式处理字符串。言归正传,下面我就一一道来:

概览:

名称

类型

执行速度

线程安全

适用场合

String

字符串常量

-

少量字符串

StringBuffer

字符串变量

较快

安全

大量串,多线程

StringBuilder

字符串变量

不安全

大量串,单线程

对于String类型,如果说它是否线程安全个人觉得不太合适,因为线程安全与否主要是针对可变类状态的改变可能存在的不一致性,而String本身是常量,根本无法改变其状态,所以用线程安全来说有失偏颇,代码层次上也每对String类型做同步上的处理。

下面给一个简单的例子说说String类型的内部处理机制:

String s1 = “eric”;

String s2 = “huang”;

s1 = s1+s2;

       我们知道String类型是字符串常量,之所以可以对两个字符串采用+操作符,主要是Java内部对+进行了重载,虚拟机首先在常量内存区域创建了s1s2两个字符串常量,然后分配再分配部分内存存储s1s2相加的结果,最后将s1指向这块内存区域,故s1不会再指向”eric”代表的内存区域了。可以想象,当我们的字符串要被循环拼接若干段时,用String类直接操作会带来多少额外的系统开销。所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后,JVM GC 就会开始工作,耗用了很多cpu时间,那速度是一定会相当慢的。

       当我们在构造字符串的时候,我们应该用 StringBuffer 来实现大部分的工作,当工作完成后将 StringBuffer 对象再转换为需要的 String 对象(toString方法)。比如:如果有一个字符串必须不断地在其后添加许多字符来完成构造,那么我们应该使用 StringBuffer 对象和它的 append() 方法。String 类将 StringBuffer 类封装了起来,(以花费更多时间为代价)为开发人员提供了一个安全的接口。

       Java SE 5.0提供java.lang.StringBuilder类,它是StringBuffer的一个单线程等价类,提供一个与之兼容的API。由于不执行同步,所以速度更快。使用这个类所产生的对象默认会有16个字符的长度,您也可以自行指定初始长度。如果附加的字符超出可容纳的长度,则StringBuilder对象会自动增加长度以容纳被附加的字符。如果有频繁作字符串附加的需求,使用StringBuilder会让程序的效率大大提高。

    使用StringBuilder最后若要输出字符串结果,可以用toString()方法。可以使用length()方法得知目前对象中的字符长度,而capacity()可返回该对象目前可容纳的字符容量。其它具体方法参加API

原创粉丝点击