String、StringBuffer、StringBuilde
[TOC]
1.执行速度的比较
** StringBuilder > StringBuffer > String **
** 原因:**
String的构造方法创建的是一个字符串常量:
/** The value is used for character storage. */
private final char value[];
/**
* Initializes a newly created {@code String} object so that it represents
* an empty character sequence. Note that use of this constructor is
* unnecessary since Strings are immutable.
*/
public String() {
this.value = "".value;
}
StringBuffer和StringBuilder创建的一个字符串变量:
/**
* The value is used for character storage.
*/
char[] value;
/**
* Constructs a string builder with no characters in it and an
* initial capacity of 16 characters.
*/
public StringBuilder() {
super(16);
}
StringBuffer的insert方法:
/**
* @throws StringIndexOutOfBoundsException {@inheritDoc}
* @since 1.2
*/
@Override
public synchronized StringBuffer insert(int index, char[] str, int offset,
int len)
{
toStringCache = null;
super.insert(index, str, offset, len);
return this;
}
StringBuilder的insert方法:
StringBuilder:
/**
* @throws StringIndexOutOfBoundsException {@inheritDoc}
*/
@Override
public StringBuilder insert(int index, char[] str, int offset,
int len)
{
super.insert(index, str, offset, len);
return this;
}
** <font color='red'>每当用String操作字符串时,实际上是在不断的创建新的对象,而原来的对象就会变为垃圾被GC回收掉,由此可知String执行效率的低下,而StringBuffer与StringBuilder就不一样了,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,这样就不会像String一样创建一些而外的对象进行操作了,速度自然也就快了。查看StringBuilder和StringBuffer的源码可知,StringBuffer的关键操作前加上了synchronized同步锁,是该操作线程安全的同时,也降低了StringBuffer的执行效率。</font>**
2.一个特殊的例子
String str = “Hello” + “ world” + “ !”;
StringBuffer builder = new StringBuilder(“Hello”).append(“world”).append(“ !”);
```language
当声明字符串变量时使用这种方式时,String和StringBuffer的差距并不大,这是因为jvm在解析的时候
String str= ”Hello“+"world"+"!";
其实等于:
String Str = "Hello world!";
所以所需的时间并不多,但是如果你的字符串是来自其他String变量的话,jvm还是会按照原来的方式去执行。
3.线程安全
上诉源码中有提到,StringBuffer为线程安全的,而StringBuilder为线程不安全的。
4.总结
对于三者使用的总结:
1.如果要操作少量的数据用 String
2.单线程操作字符串缓冲区 下操作大量数据 StringBuilder
3.多线程操作字符串缓冲区 下操作大量数据 StringBuffer