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。