您的位置:首页 > 其它

程序媛开发之路—字符

2015-08-28 01:00 387 查看

大大小小的也做了好几个项目,每个项目不管是前台与后台交互,还是后台和数据库交互方面,都有碰到需要用到StringBuffer类进行字符串拼接的时候。那么StringBuffer和我们最常见的String类有什么区别呢? 和新加入的StringBuilder字符串变量有什么区别呢?

简单说吧,这三者主要性能区别在于String是不可变的对象。为什么这么说呢?

只要用到定义String类型变量时,每次改变的时候,其实都等同于重新又生成了一个新的String对象。相当于将指针指向新的String对象,而每次生成对象都会对系统产生影响 。所以经常改变内容的字符串最好不要使用String。下面我们来看String的一些基本特点:

String类是final类,也就意味着String类不能被继承,并且它的成员方法都默认为final方法。
 String实现了三个接口:Serializable、Comparable<String>、CharSequence,Stirng类可以进行CompareTo比较。
String类代表字符串,其赋值和基本操作我们在项目开发中都经常用到,例如String类包括的方法可以提取字符串,比较字符串,搜索字符串,创建副本等,再这里就不一一复述了。 String类字符串拼接主要是同过“+”以及将其他对象转换为字符串的特殊支持。 但是要注意的是String对象的拼装其实被JVM解释成了StringBuffer对象的拼装。所以这些时候Stirng对象的速度并不比StringBuffer对象慢。

前面我们说到了String是不可修改的,每次改变都重新生成一个新的String对象。而使用StringBuffer类不一样,每次都会对StringBuffer对象本省进行操作,而不是生成新的对象,再改变对象引用。所以从内存使用上优于String类。StringBuffer是可变类和线程安全的字符串操作类。StringBuffer 类似于String的字符串缓冲区。每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不分配新的容量,当字符大小超过容量时,会自动增加容量。

初始化:

StringBuffer s = new StringBuffer

这样初始化出来的对象是一个空对象,如果需要创建带有内容的StringBuffer对象,则可以用:StringBuffer s = new StringBuffer("a bc");

注意: tringBuffer 和String 属于不同的类型,不能直接进行强制类型转换。

StringBuffer主要操作是append和insert方法,可重载这些方法,以接受任意类型的数据。每个方法都能将给定的数据转换成字符串,然后将该字符串的字符添加或插入到字符缓冲区中。 append方法始终将这些字符添加到缓冲区的末端。而insert方法则在指定的点添加字符。

StringBuilder是jdk5.0中新增加的一个类。StringBuffer 和StringBuilder两个基本上相同,只是StringBuffer是线程安全,可以同步的用于多个线程之中,类似String的字符串缓冲区,但是不能修改。 StringBuilder一个可变的字符序列,StringBuilder的实例用于多个线程并且是不安全,非同步的。

  

在性能上,谁更胜一筹呢?我们一起看下面的例子:

package com.tgb.cachetest.zhy;
 
public class testString {
public static void main(String[] args){
String str="";
long startTime = System.currentTimeMillis();
for(long i = 0; i<100000;i++){
str = str+i;
}
long endTime = System.currentTimeMillis();
long time = endTime - startTime;
System.out.print("String 消耗时间: " + time);
StringBuilder builder = new StringBuilder("");
startTime = System.currentTimeMillis();
for(long k = 0; k<100000;k++){
builder.append(k);
}
endTime = System.currentTimeMillis();
time = endTime - startTime;
System.out.print(" StringBuilder 消耗时间:" + time);
StringBuffer buffer = new StringBuffer("");
startTime = System.currentTimeMillis();
for(long n= 0; n<100000;n++){
buffer.append(n);
}
endTime = System.currentTimeMillis();
time = endTime - startTime;
System.out.println(" StringBuffer 消耗时间:"+ time);
}
 
}


运行上面的例子,得到的结果是:



从上面我们可以看出:StringBuilder > StringBuffer > String .

总结: 如果要操作少量的数据最好用String类型,如果是单线程操作字符串缓冲区操作大量数据,用StringBuilder类型。如果是多线程操作字符串缓冲区下操作大量数据,用StringBuffer.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: