浅谈String 和StringBuffer

浅谈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的性能更优。

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值