1.先介绍一下他们三个是什么:
String:是字符串常量
StringBuffer:字符串变量(线程安全)
StringBuilder :字符串变量(线程不安全)
2.然后介绍一下他们的执行速度:
StringBuilder > StringBuffer > String
3.为啥String的执行速度最慢呢,请听我慢慢道来:
请看先这段代码
String s = "miaomiao";
System.out.println(s);
s = s + "pang";
System.out.println(s);
第一个输出是“miaomiao”,第二个输出是“miaomiaopang”,给我们的感觉好像是s被更改了,其实这是一种假象而已。
因为String是字符串常量,String对象一旦创建之后该对象是不可更改的。
第一行:创建一个String对象s把“miaomiao”赋值给它
第三行:其实是又创建了一个新的String对象s,把原来的s的值和“pang”加起来再赋值给新的s,而原来的String对象s会被垃圾回收机制回收掉。所以,s实际上并没有被更改,也就是前面说的String对象一旦创建之后就不可更改了。所以,Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。
4.请注意这种情况
String s = "miaomiao" + "pang";
这种情况其实就是String s = "miaomiaopang";
5. StringBuffer
StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。 每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量。
StringBuffer bf=new StringBuffer(); //分配长16字节的字符缓冲区
StringBuffer bf=new StringBuffer(512); //分配长512字节的字符缓冲区
StringBuffer bf=new StringBuffer("this is a test")//在缓冲区中存放了字符串,并在后面预留了16字节的空缓冲区。
源码如下:
/**
* Constructs a string buffer with no characters in it and an
* initial capacity of 16 characters.
*/
public StringBuffer() {
super(16);//分配长度16字节
}
/**
* Constructs a string buffer with no characters in it and
* the specified initial capacity.
*
* @param capacity the initial capacity.
* @exception NegativeArraySizeException if the {@code capacity}
* argument is less than {@code 0}.
*/
public StringBuffer(int capacity) {
super(capacity);//分配长度
}
/**
* Constructs a string buffer initialized to the contents of the
* specified string. The initial capacity of the string buffer is
* {@code 16} plus the length of the string argument.
*
* @param str the initial contents of the buffer.
*/
public StringBuffer(String str) {
super(str.length() + 16);//在缓冲区中存放了字符串,并在后面预留了16字节的空缓冲区。
append(str);
}
6.StringBuilder
StringBuilder和StringBuffer类功能基本相似,主要区别在于StringBuffer类的方法是多线程、安全的,而StringBuilder不是线程安全的,而StringBuilder类会略微快一点。对于经常要改变值的字符串应该使用StringBuffer和StringBuilder类。
1)首先String、StringBuffer、StringBuilder在JDK中都被定义为final类,这意味着他们不可以被继承。
2)String最常见,与StringBuffer相比,String的性能较差,因为对String类型进行改变的时候都会重新生成一个新的String对象,这在字符串拼接操作时很明显,因此内容经常改变的字符串不应该使用String,如果不考虑多线程,则应使用StringBuilder。
3)StringBuffer生成一个对象后,在进行字符串拼接操作时,调用append方法即可,不会产生新的对象,仅对对象本身进行操作,性能比String要高。另外StringBuffer是线程安全的,因此适合在多线程中使用,也正因为如此,速度跟StringBuilder相比会比较慢。
4)StringBuilder的使用方法跟StringBuffer类似,但其是非线程安全的,因此一般常用于单线程,效率比StringBuffer高。
以上是我学习过程中的笔记,如果有不对的地方欢迎指出,一个集美貌与才华于一身的傲娇的程序媛。