1.String
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
String 类型的字符串是常量,字符串创建出来后不允许修改;设置为final 主要是为了“效率” 和 “安全性” 的缘故;
String str1 = "abc";
String str2 = new String("abc");
String str3 = "abc";
LogUtil.i("str1==str2:" + (str1 == str2));//false
LogUtil.i("str1==str3:" + (str1 == str3));//true
总结:
1.String通过new创建的字符串对象,每一次new都会申请一个内存空间,所以地址不同;
2.字符序列相同,jvm都只会建立一个String对象,并在字符串池中维护;
2.StringBuilder
public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence {
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
一个可变的字符串类,用的都是同一个地址,线程不安全;
StringBuilder sb1 = new StringBuilder();
StringBuilder sb2 = sb1.append("abc");
StringBuilder sb3 = new StringBuilder("abc");
StringBuilder sb4 = new StringBuilder("abc");
LogUtil.i("sb1:" + sb1);//abc
LogUtil.i("sb2:" + sb2);//abc
LogUtil.i("sb1==sb2:" + (sb1 == sb2));//true
LogUtil.i("sb3==sb4:" + (sb3 == sb4));//false
3.StringBuffer
public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence {
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
一个可变的字符串类,用的都是同一个地址,线程安全;
StringBuffer sbf1 = new StringBuffer();
StringBuffer sbf2 = sbf1.append("abc");
LogUtil.i("sbf1:" + sbf1);//abc
LogUtil.i("sbf2:" + sbf2);//abc
LogUtil.i("sbf1==sbf2:" + (sbf1 == sbf2));//true
总结
String | StringBuilder | StringBuffer |
不可变 | 可变 | 可变 |
线程不安全 | 线程安全 | |
效率高 | 效率低 |