前言
在Java程序中有关字符或者字符串操作的有以上几种类可以使用,初学者可能用String类比较多,因为方便使用。然而在实际开发或者面试的时候会经常遇到这几个类的比较,下面介绍下他们之间都有什么关系。
String类
- 在Java中String类是不可变类,就是说String类创建完了之后自身的值不会再改变,原因是String类是被申明为final类型,除了hash属性不是final,其他的属性全部都是final。
- 在实例化对象的时候,可以使用构造方法来初始化也可以用赋值的方式来初始化。
- 在进行字符串拼接的时候,是先创建一个
StringBuffer
对象,然后调用StringBuffer
的append()
方法。举个栗子:
String str = "hello";
str += "world";
//上面第二段在编译的时候会转换成如下代码
StringBuffer sb = new StringBuffer(str);
sb.append("world");
str = sb.toString();
如下图所示:一开始str
指向的是堆内存中的某个位置,后来通过更换所指向的内存地址来实现字符串的拼接,如果在大型项目中多次进行这样的操作是不仅在一定程度上浪费内存,同时在Java内存会后回收的时候也十分浪费时间。
StringBuffer类
- 在Java中其为可变类,这是和String类最大的区别,也就意味着不会产生一些无用的对象。其是继承了AbstractStringBuilder并且是线程安全的。
- 在实例化的时候只能通过构造方法的形式来初始化对象。
- 在进行字符串拼接的时候,可以通过append()方法来实现,但是速度要比StringBuilder要慢一点。
StringBuilder类
- 在Java中也为可变类,也是继承了AbstractStringBuilder,但是不是线程安全的。
- 在实例化的时候只能通过构造方法的形式来初始化对象。
- 在进行字符串拼接的时候,可以通过append()方法来实现,在字符串操作的函数方面几乎和StringBuffer一样。
StringTokenizer类
- 这个类主要是用于字符串的分割的,像在大数据文本处理中可能会用到这个类中的方法。
实验比较
在单线程的程序中,前三者对于字符串拼接的速度从快到慢依次是:StringBuilder > StringBuffer > String。例如我们以100000次的拼接进行对比发现事实正是如此。代码如下:
public class AboutString {
public static void main(String[] args){
showDifference();
}
/**
* String, StringBuffer, StringBuilder和StringTokenizer区别
*/
private static void showDifference() {
//分别创建字符串
String str1 = new String("Hello");
String Str2 = "Hello";
StringBuffer sb1 = new StringBuffer("Hello");
StringBuilder sbd1 = new StringBuilder("Hello");
//记录String类进行字符串拼接时的时间
long startTime = System.currentTimeMillis();
for(int i=0;i<100000;i++){
str1 += "world";
}
long endTime = System.currentTimeMillis();
System.out.println("String加长所需时间为:" + (endTime - startTime));
//记录StringBuffer类进行字符串拼接时的时间
startTime = System.currentTimeMillis();
for(int i=0;i<100000;i++){
sb1.append("word");
}
endTime = System.currentTimeMillis();
System.out.println("StringBuffer加长所需时间为:" + (endTime - startTime));
//记录StringBuilder类进行字符串拼接时的时间
startTime = System.currentTimeMillis();
for(int i=0;i<100000;i++){
sbd1.append("word");
}
endTime = System.currentTimeMillis();
System.out.println("StringBuilder加长所需时间为:" + (endTime - startTime));
StringTokenizer st = new StringTokenizer("Hello World Welcome to Nanjing");
while(st.hasMoreElements()){//也可以使用hasMoreTokens()方法
System.out.println(st.nextElement());//或者是nextToken()
}
}
}
最终结果如下:
String加长所需时间为:20059
StringBuffer加长所需时间为:4
StringBuilder加长所需时间为:1
Hello
World
Welcome
to
Nanjing
University