java语言中有四个类对字符或字符串经行操作,他们分别是character、String、StringBuffer和StringTokenizer,其中Character用于单个字符的操作,String是用于字符串的操作,属于不可变类,而StringBuffer也适用于对字符串的操作,不同之处在于StringBuffer属于可变类。

  String一旦被创建,其值就不可被改变,而StringBuffer是可变类,当对象被创建后仍可以对其值进行修改。所以当一个字符串需要经常被修改时最好使用Stringbuffer来实现。如果使用String来保存一个经常被修改的字符串时,在字符串被修改时会比StringBuffer多很多附加操作,同时产生很多无用对象,由于这些无用对象会被垃圾回收机器回收,因此会影响程序的性能。在规模比较小的程序中这个影响很小,但是在一个规模大的项目会对程序的运行效率带来很大的影响。

  String可以利用构造函数(String s1 = new String("Hello"))来实现初始化,还可以用赋值的方式(String s1 = "hello")的方式实现初始化,而StringBUffer只能通过构造函数(StringBuffer s2 = new StringBusser("hello"))来实现初始化。

  String字符串修改实现的原理如下:当用String类型来对字符串进行修改时其实现方法,是首先创建一个StringBuffer,其次调用StiringBuffer的append()方法,最后调用StringBuffer的toString()方法把结果返回,实列如下:

String s1 = "helloi";
s1+="word";

 以上代码等价于一下代码:

StringBuffer s1 = new StringBuffer("hello");
s1.append("word");
s1.toString();

  举例:

import java.util.logging.LogManager;

public class Test {
	public static void testString() {
		String s1 = new String("hello");
		String s2 = "word";
		long start = System.currentTimeMillis();
		for (int i = 0; i < 10000; i++) {
			s1 +=s2;
		}
		long end = System.currentTimeMillis();
		long runTime = end - start;
		System.out.println(runTime);
	}
	
	public static void testStringBuffer() {
		StringBuffer sb1 = new StringBuffer("hello");
		String sb2 = "word";
		long start = System.currentTimeMillis();
		for (int i = 0; i < 10000; i++) {
			sb1.append(sb2);
			sb1.toString();
		}
		long end = System.currentTimeMillis();
		Long runTime = end - start;
		System.out.println(runTime);
	}
	
	public static void main(String[] args) {
		testString();
		testStringBuffer();
	}
}

  运行结果如下:

373
102

  可以看出当一个字符串经常需要修改时,使用StringBuffer会比String运行效率快

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

  在执行效率方面,StringBuilder最告,StringBuffer次之,String最低,鉴于这一情况如果操作的数据量小的优先使用String类;如果在单线程下操作大量数据应优先使用StringBuilder类,如果在多线程下操作大量数据,应优先使用StringBuffer类;

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

import java.util.StringTokenizer;

public class testStringTokenizer {
	public static void main(String[] args){
		StringTokenizer st = new StringTokenizer("I want to sleep");
		while (st.hasMoreElements()) {
			System.out.println(st.nextToken());
		}
	}
}

  运行结果如下:

I
want
to
sleep