Java语言有4个类可以对字符或者字符串进行操作,分别是:Character、String、StringBuffer和StringTokenizer,其中Character用于单个字符的操作,String用于字符串操作,属于不可变类,而StringBuffer也是用于字符串操作的,不同之处在于StringBuffer属于可变类。
一、String和StringBuffer的比较
区别:
1、String是不可变类,一旦被创建,其值将不能被修改,而StringBuffer是可变类,当对象被创建后仍然可以对其值进行修改。由于String是不可变类,因此适合在需要被共享的场合中使用,而当一个字符串经常需要被修改时,最好使用StringBuffer来实现;
2、String在实例化String时有两种方式,可以利用构造函数:String s = new String("Hello")的方式对其进行初始化,也可以用赋值:String s = "Hello"的方式来初始化,而StringBuffer只能使用构造函数StringBuffer s = new StringBuffer("Hello")的方式类初始化。
String和StringBuffer修改字符串效率对比:
package dayTest;
public class Test {
/*
* 比较String和StringBuffer对字符串进行修改的效率:
* String:是不可变类,一旦被创建后,其值将不能再被修改
* StringBuffer:是可变类,当对象被创建后仍可以修改
*/
//String
public static void testString(){
String s = "Hello";
String s1 = "World";
long start = System.currentTimeMillis();
for(int i = 0; i<1000; i++){
s+=s1;
}
long end = System.currentTimeMillis();
long runTime = (end - start);
System.out.println("testString:" + runTime);
}
//StringBuffer
public static void testStringBuffer(){
StringBuffer s = new StringBuffer("Hello");
String s1 = "World";
long start = System.currentTimeMillis();
for(int i = 0; i<1000; i++){
s.append(s1);
}
long end = System.currentTimeMillis();
long runTime = (end - start);
System.out.println("testStringBuffer:" + runTime);
}
//测试
public static void main(String[] args){
testString();
testStringBuffer();
}
}
运行结果:
从运行结果可以看出,当一个字符串需要经常被修改时,使用StringBuffer比使用String要快的多。
其实String字符串的修改原理是:当使用String类型对字符串进行修改时,首先会创建一个StringBuffer,然后再调用StringBuffer的append( )方法,最后再调用StringBuffer的toString( )方法把结果返回。
例如:
String s = "Hello";
s+="World";
等价于:
StringBuffer s1 = new StringBuffer(s);
s.append("World");
s = s1.toString();
由上述过程可以看出来String对字符串进行修改比StringBuffer对字符串进行修改要多很多附加的操作,同时还生成了很多临时对象,从而导致程序的执行效率降低。
二、StringBuffer和StringBuilder的比较
StringBuilder也是可以被修改的字符串,与StringBuffer类似,都是字符串缓冲区,但StringBuilder不是线程安全的,如果只是在单线程中使用字符串缓冲区,那么StringBuilder的效率会更高些。因此在只有单线程访问时可以使用StringBuilder,当有多个线程访问时,最好使用线程安全的StringBuffer。
在执行效率方面:StringBuilder > StringBuffer > String,因此如果要操作的数据量比较小的时候,应该应该优先使用String类;如果在单线程下操作大量数据时,应该优先使用StringBuffer类;如果在多线程下操作大量数据时,应该优先考虑使用StringBuffer类。
三、StringTokenizer工具类
StringTokenizer是用来分割字符串的工具类,下面给出一个例子:
package stringTest;
import java.util.StringTokenizer;
public class Test1 {
public static void main(String[] args) {
StringTokenizer st = new StringTokenizer("Good Good Study Day Day Up");
while(st.hasMoreTokens()){
System.out.println(st.nextToken());
}
}
}
运行结果: