1.实现原理
String:没有继承AbstractStringBuilder,存放字符串内容的是private final char value[];说明了String对象一旦创建内容就定了,不可修改。是一个常量。
可能有人会有疑问?
String str = "123";
str = str + "456";
这里str的内容不是改变了吗?首先str是一个对象引用,它第一次句指向了对象“123”,第二句指向了新的对象str+"456"。已经是不同的对象了。对String不是很了解的,可以看一下我写一篇文章:菜鸟入坑》String深入了解。可能写得不是很好!!!!
StringBuilder:继承了AbstractStringBuilder,存放字符串内容的是char[] value;说明了StringBuilder对应创建了之后,内容可以随意改动。是一个变量。
StringBuilder stringBuilder = new StringBuilder("123456");
System.out.println(stringBuilder);
stringBuilder.append("ww");
System.out.println(stringBuilder);
StringBuffer:继承了AbstractStringBuilder,存放字符串内容的是char[] value,说明了StringBuffer对应创建了之后,内容可以随意改动。是一个变量。StringBuffer的对可以影响AbstractStringBuilder类的成员变量的方法都加了synchronized修饰。所以是线程安全的。
StringBuffer stringBuffer = new StringBuffer("123456");
System.out.println(stringBuffer);
stringBuffer.append("qqq");
System.out.println(stringBuffer);
三者都是final修饰的类,所以都无法再被继承。
2.性能比较
StringBuilder>StringBuffer>String
3.线程安全性
String:不存在线程安全不安全问题。
StringBuilder:线程不安全的。
StringBuffer:线程安全的。
最后总结一下:
在for循环中如果需要多次拼接字符串,必须考虑性能问题。可以考虑使用StringBuffer或StringBuilder,如果是不考虑线程安全问题两者都可以使用,如果考虑线程安全问题只能用StringBuffer。
由于很多东西还没有深究,可能存在问题,有问题还请大牛指出。准备换工作了,顺便总结一下。