String:
使用场景:使用次数比较少,且不频繁修改其字符串的值。
是不可变对象,一旦被创建,就不能够修改它的值。对已存在的对象修改都是重新创建一个对象,把新的值存进里面。
String a ="a";//若a指向地址0x0001;
a ="b";//重新赋值后a指向地址0x0002,但是0x0001地址中保存的“a”依旧存在,但a已经指向了0x0002;
从表面上看String类型的对象改变了值,但事实是他不能改变值,只能改变指向的地址
StringBuffer:
使用场景:对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法好,且对大数据量的字符串操作StringBuffer比String 效率要高很多。
是一个可变对象,当对其进行修改的时候不像String类那样重新创建一个新的对象,它只通过构造函数来建立。
StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中
StringBuffer strBuffer = new StringBuffer();
strBuffer.append("StringBuffer"); //StringBuffer对象进行赋值方式。
下面看具体实例:
public class TestString {
public static void TestString()
{
String tempstr ="1234567890";
int times = 10000;
long startStr = System.currentTimeMillis();
String str = "";
for (int i = 0; i < times; ++i) {
str += tempstr;
}
long endStr = System.currentTimeMillis();
long time = (endStr - startStr);
System.out.println("time string:"+time);
}
public static void TestStringBuffer(){
String tempstr = "1234567890";
int times = 10000;
long startBuffer = System.currentTimeMillis();
StringBuffer strBuffer = new StringBuffer();
for (int i = 0; i < times; ++i) {
strBuffer.append(tempstr);
}
long endBuffer = System.currentTimeMillis();
long time = (endBuffer - startBuffer);
System.out.println("time stringBuffer:"+time);
}
public static void main(String args[]) {
String str = "hello";
str = str+" world"; //向后添加字符串操作的形式
StringBuffer buffer = new StringBuffer();
buffer.append("hello").append(" world"); //向后添加字符串操作的形式
System.out.println("str:" + str);
System.out.println("buffer:" + buffer.toString());
//测试运行时间
TestString();
TestStringBuffer();
}
}
运行结果:
str:hello world
buffer:hello world
String 和StringBuffer 字符串tempStr ="1234567890",分别在后面添加1000次tempStr。操作耗时比较:
time string:858
time stringBuffer:0或者15
比较之后:StringBuffer的效率明显比String高很多倍,如果操作的次数频繁,效率差别更加大。所有对字符串频繁操作,应该选择用StringBuffer.