1、String
String对象是不可变的,每修改一个String对象实际上是创建了一个新的String对象,而最初的String对象没有改变。
String对象具有只读特性,任何指向它的引用都不可能改变它的值。
看看下面的代码:
public class JavaStudyTest {
public static void main(String[] args) {
String one = "ones";
System.out.println(one);
String two = changeOne(one);
System.out.println(two);
System.out.println(one);
}
public static String changeOne ( String s ){
s += "twos";
return s;
}
}
输出:
输出结果
每当把String对象作为方法的参数时,都会复制一份引用,而该引用所指的对象其实一直呆在单一的物理位置上。
在上面的代码中,one是一个String对象的引用,当把one传递给changeOne方法时,实际上是传递了one这个引用的拷贝。
在s += "twos"这一句中,其实际执行过程是生成了一个新的String对象s,来包含"ones"和"twos"链接后的字符串,而原来的s则成了需要回收的中间对象。
2 、StringBuilder
之前说到String是不可变的,每次需要改变一个String对象时实际上都是生成了一个新的String对象,这样会产生许多需要回收的中间对象。而StringBuilder创建的对象是变量,是可以更改的。
如果我们有许多个字符串需要拼接,使用StringBuilder会优于直接使用String的+或+=重载字符。
public class JavaStudyTest {
public static void main(String[] args) {
StringBuilder builder = new StringBuilder();
builder.append("ones");
builder.append("twos");
System.out.println(builder.toString());
}
}
输出:
输出结果
3、StringBuffer
下面是官方API中的描述:
A string buffer is like a String, but can be modified. At any point in time it contains some particular sequence of characters, but the length and content of the sequence can be changed through certain method calls.
String buffers are safe for use by multiple threads. The methods are synchronized where necessary so that all the operations on any particular instance behave as if they occur in some serial order that is consistent with the order of the method calls made by each of the individual threads involved.
StringBuffer即字符串缓冲区,相当于它是一个容器,装有一些特定的字符序列,我们可以通过容器提供的方法来对容器里面的东西进行操作,比如对序列的改变序列的长度和内容。
StringBuffer和StringBuilder的区别就在于,StringBuffer是线程安全的,而StringBuilder不是。所以通常StringBuilder的速度要比StringBuffer快。
所以在进行多线程操作时,更偏向于使用StringBuffer。
4、总结
速度:String < StringBuffer< StringBuilder
适用:
String:少量字符串操作
StringBuilder :单线程下的大量字符串操作
StringBuffer:多线程下的大量字符串操作
网友评论