在Java中对字符串的处理主要使用String、StringBuffer和StringBuilder这三个类。下面我们就来学习和比较一下这三个字符串处理类。
-String
String类型的对象是不可变的对象,所有对String类型的变量的改变都是开辟了一个新的空间,生成了一个新的String对象,然后让原来的String类型的变量指向新的String对象。
实例化String对象的方式:
1)直接赋值
String str="hello";
2)通过new关键字创建
String str=new String("hello");
我们来对比一下这两种方式实例化String对象的不同:
第一种直接赋值的方式,就是开辟了一个空间,内容是“hello”,然后
str对象指向这个空间。
第二种方式实际上呢是开辟了两个空间,一个是没有对象指向的空间,内容是”Hello”,一个是有对象指向的空间,内容也是”hello”。如下图所示:
通过上述描述,很明显直接赋值实例化String对象肯定是比使用new关健字实例化String对象效率要高。多以在实际开发中更多的是以直接赋值的方式来创建字符串。
-StringBuffer
StringBuffer是可变的对象,所有对StringBuffer对象的改变都是对原StringBuffer对象的改变。
StringBuffer同时也是线程安全的,StringBuffer类的方法前面都有关键字synchronized,都是同步方法,也就是说如果有多个线程操作同一个StringBuffer对象是顺序进行的。
-StringBuilder
StringBuilder也是可变的对象,并且处理速度比StringBuffer要快。
但不是线程安全的。
总结:
大部分情况下StringBuffer的处理速度比String的处理速度要快,
当然也有特殊的情况:
String str1="Welcome"+" to"+" my"+"contry!";
StringBuffer str2=new StringBuffer("Welcome").append("to").append(" my").append("contry!");
这时候生成str1的速度要比生成str2的速度要快的多!
因为String str1=”Welcome”+” to”+” my”+”contry!”;
其实就是:
String str1=”Welcome to my contry!”,当然不需要多少处理时间。
StringBuilder的处理速度要比StringBuffer的处理的速度要快
但StringBuffer是线程安全的,StringBuilder不是线程安全的
所以在需要对字符串做大量改变的时候,建议使用StringBuffer或StringBuilder
在单线程下建议使用StringBuilder,在多线程下建议使用StringBuffer。