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就会自动开始处理垃圾的工作,这时候如果系统内这样的对象过多,就会大大影响系统的性能,速度可想而知是相当慢的。
还有一种情况,你可能遇到过,就是说这样去连接一个字符串:
String string = 'I " +"Love "+"Java ";
这样子运行经过测试你会发现:这时候的速度变得非常之快,甚至比我们下面讲到的StringBuffer和StringBuilder的速度都快,这是为什么呢?这其实就是JDK和我们玩的一个把戏而已,上面的语句其实就等价于:String string = "I Love Java ";这样子就等同于一个字符串语句,其处理速度当然是很快的了。
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.StringBuilder类:
StringBuilder,查询可知: public final class StringBuilderextends Objectimplements Serializable, CharSequence同样和String,StringBuffer一样,final修饰的继承Object类的一个子类,它们三个其实都有共同的父类,就是Object,刚才也讲了,它的用法和StringBuffer没什么两样,但是它的速度确实是比StringBuffer速度快的,这是为什么呢?因为StringBuilder是只能应用于单线程的,因此它线程不同步,线程不安全,因为它不考虑线程的协同步调,串行执行代码,因此它的字符串连接的效率比StringBuffer还要快,但是如果在多线程的编程中,那么StringBuffer还是首要的选择。
nano,这样子更好记,这个是精确到纳秒级的,大家可以亲自去试验的。
4.String和StringBuffer,StringBuilder之间的相互转化:
String程序运行时间为:19260ms
String1程序运行时间为:2ms
StringBuffer程序运行时间为:7ms
StringBuilder程序运行时间为:6ms
StringBuffer转换成String---Start
StringBuilder转换成String---I Love Java
我们可以看到,正如我们预期的那样子,一般来说,字符串的连接速度的性能比较是:StringBuilder > StringBuffer >String,这几个类都是大家经常会用到的,希望大家以后能够多加的练习,好了,今天的介绍就到这里。
欢迎大家一起和我进行交流,学习,欢迎大家指出不足之处,请联系QQ:497820217 备注:CSDN。
本文为原创,如需要转载,请注明出处。
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。
本文为原创,如需要转载,请注明出处。
相关文章推荐
- Java中的String,StringBuilder,StringBuffer三者的区别及用法策略
- String, StringBuffer, StringBuilder三者区别
- StringBuilder、StringBuffer和String三者的联系和区别
- String,StringBuffer,StringBuilder的区别用法
- Java 中 String,StringBuffer 和 StringBuilder 的区别及用法
- 拼接字符串的效率问题(String,StringBuffer,StringBuilder对比)
- Java中的String,StringBuilder,StringBuffer三者的区别
- Java中的String,StringBuilder,StringBuffer三者的区别和各自使用方法
- String,StringBuffer,StringBuilder三者之间的区别
- Java—String、StringBuffer、StringBuilder的用法与区别
- Java中的String,StringBuilder,StringBuffer三者的区别
- String, StringBuffer, StringBuilder 三者之间的区别是什么?
- String,StringBuffer,StringBuilder 三者的区别
- java中String,StringBuffer,StringBuilder拼接效率对比
- String StringBuilder StringBuffer 对比 总结得非常好
- String,StringBuilder以及StringBuffer三者之间的区别
- Java中的String,StringBuilder,StringBuffer三者的区别
- String,StringBuffer,StringBuilder 三者之间的区别是什么?
- String,StringBuilder,StringBuffer三者的区别
- String、StringBuffer、StringBuilder三者的区别