浅谈String 和StringBuffer
首先让我们看个例子:
String s1 = "abc";
String s2 = s1;
s1 += "增加的;
System.out.println("String s1->" + s1);
System.out.println("------------------------------");
System.out.println("String s2->" + s2);
System.out.println("******************************");
StringBuffer a1 = new StringBuffer("abc");
StringBuffer a2 = a1;
a1.append("增加的);
System.out.println("StringBuffer a1->" + a1);
System.out.println("------------------------------");
System.out.println("StringBuffer a2->" + a2);
输出结果:
String s1->abc增加的
------------------------------
String s2->abc
******************************
StringBuffer a1->abc增加的
------------------------------
StringBuffer a2->abc增加的
从得出的结果看,你是不是觉得有点以外?那么现在我们就来分析它为什么会得出这样的结果。
上图就是程序需要创建的一些对象,
看左图,创建了两个String对象s1和s2,它们同时指向同一个对象abc,当程序执行s1+="增加的";这个语句的时候,其实不是把s1的内容改变为原s1+"增加的"的内容这么简单, 而把创建一个新的String, 内容为s1 + "增加的"的内容,然后再把s1这个引用重新指向新创建的String,.其实这就是所谓的String不可变性.即对象abc不可改变。
看右图,创建两个StringBuffer对象a1和a2,他们同时指向同一个对象abc,当程序执行a1+="增加的";这个语句的时候,直接改变对象abc的内容为"abc增加的",这里并不象String先要创建一个对象,而是直接改变对象的内容,其实这就是所谓的StringBuffer可变性,即可以改变对象abc。
下面来说说为什么JAVA有了String类型还要设计StringBuffer类型呢?
首先,我毕竟不是JAVA的Designer,所以我也不知道他们为什么要这样设计,我只是从程序得到的一些结果,一些表象的东西去分析它,从而得出自己的观点和看法。
当创建一个String对象后,一个引用(s1)就指向一个具体的对象(o1),当再创建一个对象(o2)且用s1指向o2,这时o1就成了孤立的对象,没有任何引用指向它,一旦频繁创建这样的对象就会造成资源浪费。所以我们采用了StringBuffer,当String确定后再调用StringBuffer类的toString()方法转化为String对象。看如下一个例子大家就会明白了:
String temp = "a";
long time1 = new Date().getTime();
for (int i = 0; i < 10000; i++) {
temp += "b";
}
long time2 = new Date().getTime();
System.out.println(time2 - time1);
由于String类是支持非可变性的,所以,当执行temp += "b";的时候,实际上是另外创建了一个对象,而tmp原来指向的那个对象就成了垃圾(当它没有其它引用的时候),这样的话一个循环就会产生100多对象,可以相象内存的浪费。如果循环1000次,100000次呢?可想而知。
但是如果换成StringBuffer呢?
StringBuffer temp = new StringBuffer("a");
long time1 = new Date().getTime();
for (int i = 0; i < 1000; i++) {
temp.append("b");
}
long time2 = new Date().getTime();
System.out.println(time2 - time1);
由于StringBuffer类是支持可变性的,所以执行temp.append("b");的时候,实际上它只是改变了对象的内容,并没有去创建对象,这样就节约了内存资源。
下面是一个String 和StringBuffer运行耗时的一个对照表,大家看了就知道StringBuffer的性能好了:
呵呵,大家看了这个表肯定跟我一样的感觉哈,不可思议呀!!
总结:String类是不一个不可变的类,StringBuffer类是一个可变的类。当在需要创建 大量重复对象时,StringBuffer比String的性能更优。