一大波Java来袭(四)String类、StringBuilder类、StringBuffer类对照
本文主要介绍String类、StringBuffer类、StringBuilder类的差别 :
一、概述
(一)String
字符串常量。可是它具有不可变性,就是一旦创建,对它进行的不论什么改动操作都会创建一个新的字符串对象。
(二)StringBuffer
字符串可变量,是线程安全的,和StringBuilder类提供的方法全然同样。
差别在于StringBuffer每一个方法中前面加入了"synchronized",保证其是线程安全的。
(三)StringBuilder
字符串可变量,是线程不安全的。
这个类是在JDK 5才開始增加的,是StringBuffer的单线程等价类。(String和StringBuffer类都是JDK 1.0開始)
二、主要方法:
java API提供了处理字符串的绝大多数方法,在敲代码的时候假设须要处理字符串。一定要先查找API。
(一)String
字符串基本操作。具体请參见《String类》
(二)StringBuffer
与String类的方法类似。具体请參见《StringBuffer Member》
主要用来处理常常变动的字符串。最多的方法是append、insert和delete方法。
(三)StringBuilder
与StringBuffer类全然同样。具体请參见《StringBuilderClass》。
差别:StringBuffer每一个方法前都加入了synchronizedkeyword来保证线程的同步。
可是因为StringBuilder不运行同步操作。所以速度更快。
三、对照
(一)内存对照
下文主要採用图形的方式。对String与StringBuffer(同StringBuilder)进行对照(不同颜色代表不同的内存):
1、举例:运行加法操作a+b
String的内存变化是:又一次开辟一块新的内存单元。然后把a丢进来。把b对进来。
然后Java中的垃圾回收机制,会自己主动回收原来的内存单元a、b
StringBuffer内存变化:直接把b加入在a的尾巴后面。不须要好从新开辟新的内存单元。Append方法
2、举例:在a中指定位置插入b
(二)效率对照
因为String类是不可变的。每次对其改变都要创建新字符串对象。所以它是最慢的; StringBuilder不须要运行同步操作。速度要比StringBuffer快。
即运行改动操作的速度从高到低为:
StringBuilder > StringBuffer > String。
四、怎样选择
String是字符串常量,一旦创建就不能改动。StringBuffer和StringBuilder是字符串可变量,能够改动,可是StringBuffer是线程安全的,StringBuilder是线程不安全的。
选择方法:
假设非常少改动,使用String。毕竟它最简单;
假设常常改动,且是单线程,使用StringBuilder
假设常常改动,且是多线程,使用StringBuffer。