您的位置:首页 > 产品设计 > UI/UE

String,StringBuffer和StringBuilder三者的介绍,对比及用法

2013-03-23 22:18 621 查看
稍微有些编程经验的程序员都知道String,StringBuffer,还有StringBuilder是我们经常使用到的三个操作字符串的类,深入透彻的学习它们会使我们的编程更加的高效,方便,你可能有时候会搞不清楚在什么情况下用哪一个,其实他们之间还有有各自的优点的,合理运用它们会让我们的程序代码更高效。

1.String类:

查询JDK可知,String类是一个的继承于Object类的final类,public final class Stringextends Objectimplements Serializable, Comparable<String>, CharSequence,String所产生的对象是不可变的对象,因此如果在进行字符串的连接时,如果字符串的类型需要改变的情况下,最好不要使用String类,因为你每改变一次都要产生一个新的String的对象,每次都要将指针指向新的对象,我们知道每次产生新的对象就会对系统的性能产生巨大的影响,然后当你的指针指向新的String对象的时候,之前的String对象就会变成垃圾,这时候垃圾回收机制GC就会自动开始处理垃圾的工作,这时候如果系统内这样的对象过多,就会大大影响系统的性能,速度可想而知是相当慢的。

package com.liuqiang.string;

public class Test {
//1.String 是不可变的对象,每次生成一个新的对象
public void operatingString(){
long startTime = System.currentTimeMillis();
String string = "java";
String s ="-----start-----";
for (int i = 0; i < 100000; i++) {
s += string;
}
long endTime = System.currentTimeMillis();
System.out.println("String程序运行时间为:" + (endTime - startTime) + "ms");

}
比如上面这段代码,我用一个for循环了10万次,每执行一次循环,就会产生一个新的对象,这样下去,就会产生了10万个新的对象,也就是说系统会产生10万个垃圾对象,每次生成新的对象,然后还要GC去进行大量的垃圾清理的工作,所以这种时候,字符串的连接效率是极低的。

还有一种情况,你可能遇到过,就是说这样去连接一个字符串:

String string = 'I " +"Love "+"Java ";

这样子运行经过测试你会发现:这时候的速度变得非常之快,甚至比我们下面讲到的StringBuffer和StringBuilder的速度都快,这是为什么呢?这其实就是JDK和我们玩的一个把戏而已,上面的语句其实就等价于:String string = "I Love Java ";这样子就等同于一个字符串语句,其处理速度当然是很快的了。

//2.String不产生一个新的对象。
public void operatingString1(){
long startTime = System.currentTimeMillis();
String s = null;
for (int i = 0; i < 100000; i++) {
s = "-----start-----" +"java";
}
long endTime = System.currentTimeMillis();
System.out.println("String1程序运行时间为:" + (endTime - startTime) + "ms");
}
s = s = "-----start-----" +"java";其实在JVM里就解析成了Stringbuffer sb = new StringBuffer("-----start-----" ).append("java");如果是只有一个String对象,这种方式的速度甚至是比StringBuffer和StringBuilder还要快的,既然我们已经提到了StringBuffer和StringBuilder,那么下面我们就依次来讲讲它们。

2.StringBuffer类:

也是先查阅JDK看一下,public final class StringBuffer extends Objectimplements Serializable, CharSequence,StringBuffer也是继承于于Obj但是ect的final类型的类,但是StringBuffer产生的对象都是可变的对象,因此我们其实都是在对一个对象进行操作,StringBuffer类下有很多的方法,最常用的就是append(),insert(),length();reverse(),toString()等等方法,这个大家可以查阅JDK自行学习,对于StringBuffer,特别是字符串对象经常改变的情况下,使用它的速度还是非常快的,String
对象的字符串拼接其实是被 JVM 解释成了StringBuffer对象的拼接。

//3.StringBuffer对自身对象进行操作,线程同步,线程安全。
public void operatingStringBuffer(){
long startTime = System.currentTimeMillis();
StringBuffer sb = new StringBuffer("-----start-----");
for (int i = 0; i < 100000; i++) {
sb.append("java");
}
long endTime = System.currentTimeMillis();
System.out.println("StringBuffer程序运行时间为:" + (endTime - startTime) + "ms");

}
上面的这段代码,就是简单的StringBuffer的字符串的拼接的实现代码,需要注意的是StringBuffer是线程同步的,因此它是线程安全的,这也是和StringBuilder最大的不同之处。

3.StringBuilder类:

StringBuilder,查询可知: public final class StringBuilderextends Objectimplements Serializable, CharSequence同样和String,StringBuffer一样,final修饰的继承Object类的一个子类,它们三个其实都有共同的父类,就是Object,刚才也讲了,它的用法和StringBuffer没什么两样,但是它的速度确实是比StringBuffer速度快的,这是为什么呢?因为StringBuilder是只能应用于单线程的,因此它线程不同步,线程不安全,因为它不考虑线程的协同步调,串行执行代码,因此它的字符串连接的效率比StringBuffer还要快,但是如果在多线程的编程中,那么StringBuffer还是首要的选择。

//4.StringBuilder也是对自身对象进行操作,线程不同步,线程不安全,JDK5.0以后支持。
public void operatingStringBuilder(){
long startTime = System.currentTimeMillis();
//long startTime = System.nanoTime();
StringBuilder sb = new StringBuilder("-----start-----");
for (int i = 0; i < 100000; i++) {
sb.append("java");
}
long endTime = System.currentTimeMillis();
//long endTime = System.nanoTime();
System.out.println("StringBuilder程序运行时间为:" + (endTime - startTime) + "ms");
//System.out.println("StringBuilder程序运行时间为:" + (endTime - startTime) + "ms");
}
这里要和大家分享两个额外的技巧和知识吧,一个技巧就是,实例化一个类的时候最好在for循环的外面,如果再for循环里,每次循环都要实例化重新产生对象,产生对象就会对系统的性能造成影响,所以不推荐将实例化写在for循环里,完全没有必要;第二个就是告诉大家测试代码所需时间的两个方法,一个是System类下的静态方法currentTimeMillis(),这是精确到毫秒级的,还有就是nanoTime(),有没有看着好眼熟?ipod
nano,这样子更好记,这个是精确到纳秒级的,大家可以亲自去试验的。

4.String和StringBuffer,StringBuilder之间的相互转化:

//5.String和StringBuffer,StringBuilder的相互转化
public void convert(){
String s = "Start";
StringBuffer sb = new StringBuffer(s);
StringBuilder sb1 = new StringBuilder("I Love Java");
System.out.println("StringBuffer转换成String" + "---" + sb.toString());
System.out.println("StringBuilder转换成String"+ "---" + sb1.toString());
}
最后的测试代码给大家:

public static void main(String[] args) {
Test test = new Test();
test.operatingString();
test.operatingString1();
test.operatingStringBuffer();
test.operatingStringBuilder();
test.convert();
}
}
测试的结果(仅代表本人机器的运行结果):

String程序运行时间为:19260ms

String1程序运行时间为:2ms

StringBuffer程序运行时间为:7ms

StringBuilder程序运行时间为:6ms

StringBuffer转换成String---Start

StringBuilder转换成String---I Love Java

我们可以看到,正如我们预期的那样子,一般来说,字符串的连接速度的性能比较是:StringBuilder > StringBuffer >String,这几个类都是大家经常会用到的,希望大家以后能够多加的练习,好了,今天的介绍就到这里。

欢迎大家一起和我进行交流,学习,欢迎大家指出不足之处,请联系QQ:497820217 备注:CSDN。

本文为原创,如需要转载,请注明出处。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: