比较String StringBuilder StringBuffer类

/**

 * 比较String  StringBuilder  StringBuffer类

 */

package com.org.zhbo.javase;

 

import java.util.Date;

 

/**

 * 类说明

 * String类的具体帮助类

 * @author 郑波  E-mail-->>zheng_zhi_rui@163.com

 * @version 创建时间:2012-8-25 下午2:00:33

 */

public class StringUtils {

 

public static void main(String[] args) {

//比较String与StringBuilder

vertifyStrAndStrB();

}

      /**

       * String与StringBuffer的区别在于String对象是不可变对象,

       * StringBuffer对象是可变对象

       * 对于经常改变的字符串,用StringBuffer效率比较高

       * StringBuffer与StringBuilder区别在于

       * StringBuffer是线程安全的StringBuilder是非线程安全的

       * 对于单线程而言,StringBuffer相对比StringBuilder效率要高

       * 对于多线程而言,StringBuilder相对比StringBuffer效率要高

       * 

       * 我们会发现谁的效率高并不是绝对的,这要看操作频率和操作方式,

       * 说谁比谁效率高,只是在实际操作加大时界定的

       */

public static  void vertifyStrAndStrB(){

String  str1="abc";

String  str2="abc";

String  str3=new String("abc");

StringBuffer  sb=new StringBuffer("abc");

StringBuilder builder = new StringBuilder("abc");

 

//对于常量字符串,在java中保存在String的常量池中,他们的引用地址都来自同一个引用

System.out.println(str1==str2);      //------>true

System.out.println(str1.equals(str2));   //------>true

 

//通过new关键字创建的String对象会在内存中重新开辟一条内存空间,对象的引用也就被创建,

//所以,str1与str3不是同一个对象,因为内存地址不一样

System.out.println(str1==str3);  //------>false

System.out.println(str1.equals(str3));   //------->true

 

//String类对象发生改变时,会引发String类对象的重新生成,生成每个新的对象都具有唯一的引用

//所以,对于(str1+str1)==(str1+str1);==两边的对象重新生成,内存地址自然不一样

System.out.println((str1+"abc")==str1+str1);  //---->false

System.out.println((str1+"abc")==(str2+"abc"));  //---->false

System.out.println((str1+str1)==(str1+str1));   //---->false

 

        //StringBuilder对象发生改变时,并不会创建新的对象

System.out.println(sb.append("abc")==sb.append("abc"));   //----->true

System.out.println(sb.append("abc")==sb.append("ab"));    //----->true

 

//"+"表示连接两个字符串,所以此处会调用String类的构造方法String(StringBuffer buffer)重新生成新的String对象

System.out.println((sb+"abc")==(sb+"abc"));   //----->false

 

//比较在高频率字符串改变下两者的效率

long strTimes0 = new Date().getTime();

for(int i=0;i<10000;i++){

str3+="a";

}

long strTimes1 = new Date().getTime();

System.out.println(strTimes1-strTimes0);

 

long sbTimes0 = new Date().getTime();

for(int i=0;i<10000;i++){

sb.append("a");

}

long sbTimes1 = new Date().getTime();

System.out.println(sbTimes1-sbTimes0);

 

//StringBuilder 与StringBuffer在单线程条件下效率比较将循环增加到100000比较明显

long builderTimes0 = new Date().getTime();

for(int i=0;i<10000;i++){

builder.append("a");

}

long builderTimes1 = new Date().getTime();

System.out.println(builderTimes1-builderTimes0);

 

/*

* 将三次操作时间相加,会发现平均起来StringBuilder耗时要小于StringBuffer

*/

testThread t1 = new testThread();

testThread t2 = new testThread();

testThread t3 = new testThread();

 

t1.setBuffer(sb);

t1.setBuilder(builder);

t2.setBuffer(sb);

t2.setBuilder(builder);

t3.setBuffer(sb);

t3.setBuilder(builder);

 

t1.run();

t2.run();

t3.run();

 

}

/**

* 补充说明:

* 字符串String是Java程序中经常使用的一个类。但是,它有一个特殊的属性,就是一旦初始化以后,就不可再更改了。 、

* 大家都说String不可变的原因,是因为JDK源码中String类声明为final的原因。、

* 其实这不尽然,我们可以考虑这样一个问题: String类声明为fianl就成为不可变的. 

* StringBuffer类和StringBuilder类也是被声明为final的,为什么他俩又可以变呢? 所以说这样的理解是错误的。

* String不可变是因为: String类自身是final的; 其次String类里面的内容也是final的,比如最重要的保存字符串的部分。

* 到JDK的包里面看一下String 的源代码就一目了然了:

public final class String implements java.io.Serializable, CharSequence {

 

     private final char value[];

 

     private final int offset;

 

     private final int count;

 

     ......

*/

}

 

class testThread implements Runnable{

 

private StringBuilder builder = null;

private StringBuffer buffer = null;

 

@Override

public void run() {

long buliderTime0 = new Date().getTime();

for(int i=0;i<100000;i++){

builder.append("a");

}

long builderTime1 = new Date().getTime();

System.out.println((builderTime1-buliderTime0)+"====builder");

 

long bufferTime0 = new Date().getTime();

for(int i=0;i<100000;i++){

buffer.append("a");

}

long bufferTime1 = new Date().getTime();

System.out.println((bufferTime1-bufferTime0)+"====buffer");

}

/**

* @param builder

*/

public void setBuilder(StringBuilder builder) {

this.builder = builder;

}

/**

* @param buffer

*/

public void setBuffer(StringBuffer buffer) {

this.buffer = buffer;

}

 

}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值