Java中String、StringBuffer、StringBuilder、StringTokenizer的区别

Java语言中,有4个类可以对字符或字符串进行操作,它们是Character、String、StringBuffer、StringTokenizer,其中Character用于单个字符操作,String用于字符串操作,属于不可变类,而StringBuffer也是用于字符串操作,不同之处是StringBuffer属于可变类。

String是不可变类,也就是说,String对象一旦被创建,其值将不能被改变,而StringBuffer是可变类,当对象被创建后仍然可以对其值进行修改。由于String是不可变类,因此适合在需要被共享的场合中使用,而当一个字符串经常需要被修改时,最好使用StringBuffer来实现。如果用String来保存一个经常被修改的字符串,在字符串被修改时会比StringBuffer多很多附加的操作,同时生成很多无用的对象,由于这些无用的对象会被垃圾回收器来回收,因此会影响程序的性能。 

  1. package test;  
  2.   
  3. public class Test{  
  4.     public static void testString(){  
  5.         String s="hello";  
  6.         String s1="world";  
  7.         long start=System.currentTimeMillis();  
  8.         for(int i=0;i<10000;i++){  
  9.             s+=s1;  
  10.         }  
  11.         long end=System.currentTimeMillis();  
  12.         long runTime=(end-start);  
  13.         System.out.println(runTime);  
  14.     }  
  15.     public static void testStringBuffer(){  
  16.         StringBuffer s=new StringBuffer("Hello");  
  17.         String s1="world";  
  18.         long start=System.currentTimeMillis();  
  19.         for(int i=0;i<10000;i++){  
  20.             s.append(s1);  
  21.         }  
  22.         long end=System.currentTimeMillis();  
  23.         long runTime=(end-start);  
  24.         System.out.println(runTime);  
  25.     }  
  26.     public static void testStringBuilder(){  
  27.         StringBuilder s=new StringBuilder("hello");  
  28.         String s1="world";  
  29.         long start=System.currentTimeMillis();  
  30.         for(int i=0;i<10000;i++){  
  31.             s.append(s1);  
  32.         }  
  33.         long end=System.currentTimeMillis();  
  34.         long runTime=(end-start);  
  35.         System.out.println(runTime);  
  36.     }  
  37.     public static void main(String[] args){  
  38.         testString();  
  39.         testStringBuffer();  
  40.         testStringBuilder();  
  41.     }  
  42. }  

 

 

程序运行结果为:

265
16
0

从运行结果中看,当一个字符串经常被修改时,使用StringBuffer比使用String好的多。

 

StringBuilder也可以被修饰的字符串,它与StringBuffer类似,都是字符串缓冲区,但是StringBuilder不是线程安全的,如果只是单线程中使用字符串缓冲区,那么StringBuilder的效率会更高些。因此在只有单线程访问时可以使用StringBuilder,当有多个现成访问时,最好使用线程安全的StringBuffer。因为StringBuffer必要时可以对这些方法进行同步,所以任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。

在执行效率方面,StringBuilder最高,StringBuffer次之,String最低。

StringTokenizer是用来分割字符串的工具类,示例如下:

1). 构造函数。

1. StringTokenizer(String str) :构造一个用来解析str的StringTokenizer对象。java默认的分隔符是“空格”、“制表符(‘\t’)”、“换行符(‘\n’)”、“回车符(‘\r’)”。
2. StringTokenizer(String str, String delim) :构造一个用来解析str的StringTokenizer对象,并提供一个指定的分隔符。
3. StringTokenizer(String str, String delim, boolean returnDelims) :构造一个用来解析str的StringTokenizer对象,并提供一个指定的分隔符,同时,指定是否返回分隔符。

2).  方法简介

int       countTokens():返回nextToken方法被调用的次数。如果采用构造函数1和2,返回的就是分隔符数量
boolean   hasMoreElements():返回是否还有分隔符。
boolean   hasMoreTokens():同上
String  nextToken():返回从当前位置到下一个分隔符的字符串。
Object      nextElement():结果同上,除非生命返回的是Object而不是String
String       nextToken(String delim):同nextToken(),以指定的分隔符返回结果

例:

String s = new String("This is a test string");
StringTokenizer st = new StringTokenizer(s);
System.out.println( "Token Total: " + st.countTokens() );
while( st.hasMoreElements() ){
    System.out.println(st.nextToken());
}

例2:

复制代码
String str = "100|66,55:200|567,90:102|43,54";

StringTokenizer strToke = new StringTokenizer(str, ":,|");// 默认不打印分隔符
// StringTokenizer strToke=new StringTokenizer(str,":,|",true);//打印分隔符
// StringTokenizer strToke=new StringTokenizer(str,":,|",false);//不打印分隔符
while(strToke.hasMoreTokens()){
    System.out.println(strToke.nextToken());
}
复制代码

注意,StringTokenizer的分隔符不需要使用转义字符

3).与split的区别

String.Split()使用正则表达式,而StringTokenizer的只是使用逐字分裂的字符。
如果不用正则表达式(StringTokenizer也不能使用正则表达式),StringTokenizer在截取字符串中的效率最高。

 
posted @ 2018-03-05 12:04  ken007  阅读(456)  评论(0编辑  收藏  举报