程序媛开发之路—字符

来源:互联网 发布:mean it 编辑:程序博客网 时间:2024/06/02 13:02


大大小小的也做了好几个项目,每个项目不管是前台与后台交互,还是后台和数据库交互方面,都有碰到需要用到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.




0 0
原创粉丝点击