String、StringBuffer、StringBuilder和StringTokenizer

    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());
		}
	}
}

运行结果:


猜你喜欢

转载自blog.csdn.net/pcwl1206/article/details/81047781
今日推荐