`
郑智睿
  • 浏览: 1684 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

比较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;

}

 

}

 

分享到:
评论

相关推荐

    String StringBuffer和StringBuilder区别之源码解析

    String、StringBuffer和StringBuilder的比较 通过上面的分析,我们可以看到,String类的字符串是不可变的,而StringBuffer和StringBuilder类的字符串可以被修改。StringBuffer类是线程安全的,而StringBuilder类...

    String、StringBuilder和StringBuffer的区别

    在Java编程语言中,String、StringBuilder和StringBuffer都是用来处理字符串的类,它们之间存在一些重要的区别,主要涉及到性能和线程安全性。 首先,`String`类代表的是字符串常量,一旦创建,其内容就不能改变。...

    String ,StringBuffer与StringBuilder

    在 Java 中,String, StringBuffer 和 StringBuilder 三个类都是用于字符操作的,但它们之间有着很大的区别。 首先,String 是不可变类,意味着一旦创建了 String 对象,就不能修改它的值。每次对 String 对象的...

    String、StringBuilder、StringBuffer 用法比较

    stringbuilder用法 String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String...

    String、StringBuffer、StringBuilder的使用方法

    在Java编程语言中,`String`、`StringBuffer`和`StringBuilder`是处理字符串的三个重要类,它们各自有特定的使用场景和优缺点。理解它们的差异对于编写高效的代码至关重要。 **String类** `String`是不可变的类,...

    String、StringBuffer与StringBuilder之间区别

     StringBuffer:字符创变量  StringBuilder:字符创变量  从上面的名字可以看到,String是“字符创常量”,也就是不可改变的对象。对于这句话的理解你可能会产生这样一个疑问 ,比如这段代码:

    C#中String StringBuilder StringBuffer类的用法

    C#中String StringBuilder StringBuffer类的用法 C#中String、StringBuilder和StringBuffer三个类是字符串操作中经常使用的类,本文将对这三个类的用法进行详细介绍。 String类 String类是C#中最基本的字符串类型...

    String及StringBuffer和StringBuilder的区别

    String、StringBuffer 和 StringBuilder 是 Java 语言中三种不同类型的字符串处理方式,它们之间存在着明显的性能和线程安全性差异。 String String 类型是不可变的对象,每次对 String 对象进行改变时都会生成一...

    String-StringBuffer-StringBuilder

    在Java编程语言中,`String`、`StringBuffer`和`StringBuilder`都是用来处理字符串的类,但它们之间存在显著的差异,主要体现在性能、线程安全性和使用场景上。 首先,`String`是最基本的字符串类,它代表的是不可...

    string,stringbuffer,stringbuilder

    string,stringbuffer,stringbuilder

    string,stringBuffer,stringBuilder

    string,stringBuffer,stringBuilder

    string和StringBuffer的区别

    在Java编程语言中,`String`和`StringBuffer`都是用来表示和操作字符串的重要类,但它们在使用场景和性能上有显著的区别。了解这些差异对于编写高效、优化的代码至关重要。 首先,`String`类是不可变的。这意味着...

    String&StringBuffer&StringBuilder三者之间的区别-经典解析.doc

    在Java编程语言中,String、StringBuffer和StringBuilder都是用来处理字符串的重要类,它们各自有特定的使用场景和特性。理解这三个类的区别对于任何Java开发者,无论是初学者还是经验丰富的程序员,都是非常重要的...

    String、StringBuilder、StringBuffer的区别

    在 Java 中,String、StringBuilder 和 StringBuffer 三者都是字符串处理类,但是它们之间存在着本质的区别。本文将从执行速度、线程安全性、字符串处理方式等方面对这三者进行比较和分析。 首先,从执行速度方面来...

    你知道String、StringBuffer和StringBuilder的区别吗

    在Java编程语言中,String、StringBuffer和StringBuilder都是用来处理字符串的重要类,它们各自具有不同的特性和使用场景。下面将详细解析这三个类的区别。 首先,`String`类是最基础的字符串处理类,它被设计为不...

    Java中String,StringBuffer与StringBuilder的区别

    Java 中 String, StringBuffer 与 StringBuilder 的区别 Java 中 String, StringBuffer 与 StringBuilder 三种字符串类型的区别是很多开发者经常混淆或不了解的知识点。今天,我们将深入探讨这三种字符串类型的区别...

    String与StringBuffer区别详解

    在Java编程语言中,`String`和`StringBuffer`(在Java 5之后被`StringBuilder`取代,但在多线程环境中仍然使用`StringBuffer`)是处理文本字符串的两个核心类,它们各自有着不同的特性和用途。理解它们的区别对于...

    Java String StringBuilder StringBuffer

    在Android/Java开发中,用来处理字符串常用的类有3种: String、StringBuilder、StringBuffer。  它们的异同点:  1) 都是 final 类, 都不允许被继承;  2) String 长度是不可变的, StringBuffer、...

Global site tag (gtag.js) - Google Analytics