您的位置:首页 > 产品设计 > UI/UE

干货 String、StringBuffer、StringBuilder的用法与区别

2017-09-24 21:42 519 查看
关于String、StringBuffer、StringBuilder博主之前总是有很多疑惑,看了一定的资料之后,博主决定写篇博一起来捋一捋,有什么不当之处请见谅
1.   String
String是一个字符串常量,是不可变的,只能进行一次赋值,赋值之后不可改变(那些改变操作实际上都是生成了一个新的String)
适用于变动小的数据
2.   StringBuffer
与String不同,StringBuffer是一个字符串变量,StringBuffer对于线程是安全的,适用于字符串操作多,涉及多线程的时候
StringBuffer常用append和insert方法,append用于将特定的字符串添加到缓冲区末端,insert用于在指定的位置添加字符。例如定义一个str=“world”调用str.append(“aa”)会使字符缓冲区包含“worldaa”,调用str.insert(2,“aa”)会使字符缓冲区包含“woaarld”。
3.   StringBuilder
StringBuilder也是一个字符串变量,其大部分用法与StringBuffer相同,但其对于线程是不安全的。适用于字符串操作多,不涉及多线程的时候。
其构造方法如下:
构造方法
描述
StringBuilder()
创建一个容量为16的StringBuilder对象(16个空元素)

StringBuilder(CharSequence cs)
创建一个包含cs的StringBuilder对象,末尾附加16个空元素

StringBuilder(int initCapacity)
创建一个容量为initCapacity的StringBuilder对象

StringBuilder(String s)
创建一个包含s的StringBuilder对象,末尾附加16个空元素

 
在大部分情况下,StringBuilder > StringBuffer。这主要是由于前者不需要考虑线程安全。
 
4. 使用策略
上文已经提到了三者的使用,这里总结一下:
- String:字符串相加操作少、改动少; 

-StringBuffer:字符串操作较多,涉及多线程; 

-StringBuilder :字符串操作较多,不涉及多线程。
 
这里需要强调的一点是不要使用String类的”+”来进行频繁的拼接,因为那样性能极差,应该使用StringBuffer或StringBuilder类,这样能够优化我们的代码。
 
当然在一些特别的情况下String并不比StringBuffer慢,例如:
String str1=“Hello”+“world”;
StringBuffer str2=new StringBuffer(“Hello”).append(“world”);
这是因为在Java Compiler里,自动做了如下转换:
String str1=“Helloworld”;
但要注意的是,如果拼接的字符串来自另外的String对象的话,Java
Compiler就不会自动转换了,速度也就没那么快了,例如:
String str1=“Hello”;
String str2=“world”;
String str3=str1+str2;
 
最后附上这三者的可变性和线程安全表:
 
-
String
StringBuffer
StringBuilder
可变性
No(不可变)
Yes(可变)
Yes(可变)
线程安全
Yes
Yes
No
 
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: