/**
* 比较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类的字符串可以被修改。StringBuffer类是线程安全的,而StringBuilder类...
在Java编程语言中,String、StringBuilder和StringBuffer都是用来处理字符串的类,它们之间存在一些重要的区别,主要涉及到性能和线程安全性。 首先,`String`类代表的是字符串常量,一旦创建,其内容就不能改变。...
在 Java 中,String, StringBuffer 和 StringBuilder 三个类都是用于字符操作的,但它们之间有着很大的区别。 首先,String 是不可变类,意味着一旦创建了 String 对象,就不能修改它的值。每次对 String 对象的...
stringbuilder用法 String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String...
在Java编程语言中,`String`、`StringBuffer`和`StringBuilder`是处理字符串的三个重要类,它们各自有特定的使用场景和优缺点。理解它们的差异对于编写高效的代码至关重要。 **String类** `String`是不可变的类,...
StringBuffer:字符创变量 StringBuilder:字符创变量 从上面的名字可以看到,String是“字符创常量”,也就是不可改变的对象。对于这句话的理解你可能会产生这样一个疑问 ,比如这段代码:
C#中String StringBuilder StringBuffer类的用法 C#中String、StringBuilder和StringBuffer三个类是字符串操作中经常使用的类,本文将对这三个类的用法进行详细介绍。 String类 String类是C#中最基本的字符串类型...
String、StringBuffer 和 StringBuilder 是 Java 语言中三种不同类型的字符串处理方式,它们之间存在着明显的性能和线程安全性差异。 String String 类型是不可变的对象,每次对 String 对象进行改变时都会生成一...
在Java编程语言中,`String`、`StringBuffer`和`StringBuilder`都是用来处理字符串的类,但它们之间存在显著的差异,主要体现在性能、线程安全性和使用场景上。 首先,`String`是最基本的字符串类,它代表的是不可...
string,stringbuffer,stringbuilder
string,stringBuffer,stringBuilder
在Java编程语言中,`String`和`StringBuffer`都是用来表示和操作字符串的重要类,但它们在使用场景和性能上有显著的区别。了解这些差异对于编写高效、优化的代码至关重要。 首先,`String`类是不可变的。这意味着...
在Java编程语言中,String、StringBuffer和StringBuilder都是用来处理字符串的重要类,它们各自有特定的使用场景和特性。理解这三个类的区别对于任何Java开发者,无论是初学者还是经验丰富的程序员,都是非常重要的...
在 Java 中,String、StringBuilder 和 StringBuffer 三者都是字符串处理类,但是它们之间存在着本质的区别。本文将从执行速度、线程安全性、字符串处理方式等方面对这三者进行比较和分析。 首先,从执行速度方面来...
在Java编程语言中,String、StringBuffer和StringBuilder都是用来处理字符串的重要类,它们各自具有不同的特性和使用场景。下面将详细解析这三个类的区别。 首先,`String`类是最基础的字符串处理类,它被设计为不...
Java 中 String, StringBuffer 与 StringBuilder 的区别 Java 中 String, StringBuffer 与 StringBuilder 三种字符串类型的区别是很多开发者经常混淆或不了解的知识点。今天,我们将深入探讨这三种字符串类型的区别...
在Java编程语言中,`String`和`StringBuffer`(在Java 5之后被`StringBuilder`取代,但在多线程环境中仍然使用`StringBuffer`)是处理文本字符串的两个核心类,它们各自有着不同的特性和用途。理解它们的区别对于...
在Android/Java开发中,用来处理字符串常用的类有3种: String、StringBuilder、StringBuffer。 它们的异同点: 1) 都是 final 类, 都不允许被继承; 2) String 长度是不可变的, StringBuffer、...