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
浙公网安备 33010602011771号