面试长谈的String,StringBuffer,StringBuilder三兄弟有啥区别

时间:2022-06-14 21:03:03

1.String:

 1 /** Strings are constant; their values cannot be changed after they
 2  * are created. String buffers support mutable strings.
 3  * Because String objects are immutable they can be shared. 
 4  * 字符串是不变的,他们的值在创造后不能改变。
 5  * 字符串缓冲区支持可变字符串,因为字符串对象是不可变的,所以它们可以共享。
 6  * 
 7  * @see StringBuffer
 8  * @see StringBuilder
 9  * @see Charset
10  * @since 1.0
11  */
12 public final class String implements Serializable, Comparable<String>, CharSequence {
13     private static final long serialVersionUID = -6849794470754667710L;
14     private static final char REPLACEMENT_CHAR = (char) 0xfffd;

 

  这个是经是用的也是最早接触的,但是它的一大优点就是生成一个字符串如果下一次再创建相同的,则直接指向常量区里已经生成过的那个。

  其他的先不讲这个东西的优点就是省资源,至于String类的另一个特点就是它是final修饰的也就是说不可被继承的。(网上还说它是线程安全的这个我面试的时候是         没想到)。

 

2.StringBuffer:

 1 public final class StringBuffer
 2     extends AbstractStringBuilder
 3     implements java.io.Serializable, Appendable, CharSequence
 4 {
 5     /**
 6      * Constructs a string buffer with no characters in it and an
 7      * initial capacity of 16 characters.
 8      */
 9     public StringBuffer() {
10         super(16);
11     }
12     public synchronized StringBuffer append(int i) {
13         super.append(i);
14         return this;
15     }
16     public synchronized StringBuffer delete(int start, int end) {
17         super.delete(start, end);
18         return this;
19     }
20 }
  synchronized这个的出现就直接知道这个小东西是线程的安全的了。(经常会问是不是线程安全的,看一下代码记得快)。

3.StringBuilder:
 1 public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, Appendable, CharSequence {
 2    public StringBuilder() {
 3         super(16);
 4    }
 5    public StringBuilder append(String str) {
 6         super.append(str);
 7         return this;
 8     }
 9     public StringBuilder delete(int start, int end) {
10         super.delete(start, end);
11         return this;
12     }
13 }

    他可以看成是StringBuffer的无synchronized版,线程不安全。

4.三者之间的区别:

  4.1:String VS StringBuffer

    4.1.1 初始化:

      4.1.1.1String的初始化:

      String a = null;

      String a="asd";

        4.1.1.2 StringBuffer的初始化

       StringBuffer a = null; //结果警告:Null pointer access: The variable result can only be null at this location

      StringBuffer a = new StringBuffer();//通过,这个是创建了一个空对象

      StringBuffer a = new StringBuffer(“abc”);//创建带有内容的StringBuffer对象

    4.1.2  效率方面

  

1 //String效率是远要比StringBuffer快的:
2 String S = “a” + “ s” + “ d”;
3 StringBuffer Sb = new StringBuilder(“a”).append(“s”).append(“ d”);

    4.1.3 执行速度方面

//String速度是非常慢的:
String S1 = “a”;
String S2 = “ s”;
String S3 = “ d”;
String S4 = S1 +S2 + S3;

       String对象不可变,重复新建对象需要花费很多时间;StringBuffer对象可变所以在插入删除方面有着很好的优势。

     PS: 注意在开头的代码可以看出StringBuilder与StringBuffer的区别在于方法的同步关键字的添加与否,所以效率与执行速度String与StringBuilder的比较                          是可以和上面String与StringBuffer比较做参照的。当然在初始化的方面同样可以。

     4.1.4 总结

      少量数据的操作为了追求效率可以用String;

      大量数据的拼接,插入,删除则建议使用StringBuffer;

  4.2 StringBuffer  VS StringBuilder

    4.2.1 线程安全

      这是这块知识最容易记住的,从上面的代码中就可看出StringBuffer是线程安全的,而StringBuilder是非线程安全的。

    4.2.2 执行速度

      在不考虑线程安全的情况下(单线程),StringBuilder的执行速度是快于StringBuffer,而且在大量的数据(这里指String字符串)需要进行插入,删除,       拼接的是执行速度也是远快于String的。

 

5 总结

  a.如果要操作少量的数据用 String; 
  b.多线程操作字符串缓冲区下操作大量数据 StringBuffer; 
  c.单线程操作字符串缓冲区下操作大量数据 StringBuilder。