谈String,StringBuilder,StringBuffer随笔
一.谈谈三者在实现上的区别。
(1)先看String 方法,实现了Serializable, Comparable, CharSequence三个接口
package java.lang; import java.io.*; import java.nio.charset.Charset; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; public final class String implements Serializable, Comparable, CharSequence { private static class CaseInsensitiveComparator implements Comparator, Serializable { public int compare(String s, String s1) {
其次看一下StringBuffer和StringBuilder
package java.lang; import java.io.*; public final class StringBuffer extends AbstractStringBuilder implements Serializable, CharSequence {
package java.lang; import java.io.*; public final class StringBuilder extends AbstractStringBuilder implements Serializable, CharSequence {
可以很明显的看出String 和StringBuffer,StringBuilder有相对较大的区别,实时也是如此。StringBuffer,StringBuilder几乎一样,StringBuffer就是里面做了一些synchronized 修饰,从保证线程安全的。StringBuffer,StringBuilder继承了AbstractStringBuilder,实际上AbstractStringBuilder实现了Appendable, CharSequence这两个接口,从而也可在继承和实现的看出区别,三个共同实现了Serializable,CharSequence。而String 实现的有Comparable,则String 和StringBuffer实现Appendable。
二.谈谈三者效率区别。
先用三组数据来看看
1 package com; 2 public class test { 3 public static void main(String[] args) { 4 5 //String 6 long i = System.currentTimeMillis(); 7 String st = ""; 8 for(int j = 0;j<100000;j++){ 9 st="aaa"+"bbb"+"ccc"; 10 } 11 long i1 = System.currentTimeMillis(); 12 System.out.println(i1-i); 13 14 //String 15 long s1 = System.currentTimeMillis(); 16 String st1 = "aaa"; 17 String st2 = "bbb"; 18 String st3 = "ccc"; 19 String st4 = ""; 20 21 for(int j = 0;j<100000;j++){ 22 st4=st1+st2+st3; 23 } 24 long s2 = System.currentTimeMillis(); 25 System.out.println(s2-s1); 26 27 //StringBuffer 28 long i2 = System.currentTimeMillis(); 29 String st5 = "ddd"; 30 StringBuffer sb = new StringBuffer(); 31 for(int j = 0;j<100000;j++){ 32 sb=sb.append(st5); 33 } 34 long i3 = System.currentTimeMillis(); 35 System.out.println(i3-i2); 36 } 37 38 }
以上的执行结果 1 16 4 单位是ms
以上做了String,StringBuilder的比较的,因为StringBuilder,StringBuffer几乎差不多。
首先看两次的Stirng执行效率,1 16 效率差距还是蛮大的,虽然实现效果一样,但是真正的实现时候,前一个并没有做创建,然后再做“+”这个操作,而是再文件编译阶段,就已经将完成"aaa"+"bbb"+"ccc"操作,将"aaabbbccc"当做一个字符串常量放到常量区,而100000对赋值仅仅是去字符串对象地址取出便可,这个取得效率是很高的。但是后者却是实实在在的创建了100000此对象,然后又做了相同次数+运算,赋值这个步骤和前者时间差不多的,真的耗时就在创建和+这两个步骤了,有大量对象就会需要GC来处理。因此为了提高效率,尽量避免创建对象。
其次咱们来看看Sting 和 StringBuilder这两个的执行效率,16 4 同样是拼接了100000次,时间相差不可谓不小,从结果上来看可以很明显得出 大量字符串拼接时候,StringBuffer的append()效率要远远好于String对象+连接。原因也很简单,String 做拼接的时候他的value[]不能改变,每次操作都需要创建新的对象,而StringBuffer得value[]是可以变得,只是扩大即可,所以效率会好很多。
StringBuilder,StringBuffer的效率差不多,而StringBuffer支持多线程,所以相对来说StringBuilder比StringBuffer稍好点。
有什么疑问欢迎留言探讨。