String,StringBuilder,StringBuffer三者的区别,发现自己确实对这方面的知识不是很了解.所以学习了一下做个笔记.
String
- String 类是一个常量,String类本身和其中存储字符的数组都是用final关键字修饰的,所以不能被继承
/** The value is used for character storage. */
private final char value[];
String str="hello world"和String str=new String(“hello world”)的区别
public class Main {
public static void main(String[] args) {
String string1 = "hello word";
String string2 = new String("hello world");
String string3 = "hello word";
String string4 = new String("hello world");
System.out.println(string1 == string2);
System.out.println(string1 == string3);
System.out.println(string2 == string4);
}
}
上面代码的输出结果为:
false
true
false
我们发现 同样都都是"helllo world" string1 和 string3 相等.是因为string1 和 string3 都是赋值为一个字面常量"hello world",在JVM运行时候,会在常量池里寻找是否已经存在相同的常量,如果存在便直接将引用指向已有常量,否则就创建一个常量,并且将引用指向他,对于string2 和string4来说,两者都是采取了new 来创建的,是两个不同的对象,所以不相等.
StringBuilder
在第二点中,我们看到String是一个final类,打开StringBuilder,我们发现StringBuilder类是AbstractStringBuilder的子类,在AbstractStringBuilder类中,我们看到与String不同,StringBuilder存储字符的数组是可变的
/**
* The value is used for character storage.
*/
char[] value;
StringBuilder和String 区别
对于实际应用来说 假设有如下代码
public class Main {
public static void main(String[] args) {
String string = "";
for (int i = 0; i < 1000; i++) {
string += "A";
}
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < 1000; i++) {
stringBuilder.append("A");
}
}
}
上述代码进行了一个1000次的循环,每次在字符串string后面追加一个字符A,无论使用的是String,还是StringBuilder,最后的结果都为长度为1000的字符全为A的字符串.而不同的是,如果使用StringBuilder,append操作是在原有的对象基础上进行的,而使用String每次循环都会新建一个StringBuilder对象,进行append操作,通过toString方法返回String对象,如果这些对象没有被回收会浪费大量资源,
StringBuilder和StringBuffer区别
对比StringBuilder和StringBuffer源码,我们发现在StringBuffer中很多方法都加上了synchronized关键字,所以StringBuffer是线程安全的,不过相应的,在提升了安全的同时对资源的消耗也会增大
/**
* StringBuffer append方法
*/
@Override
public synchronized StringBuffer append (String str){
toStringCache = null;
super.append(str);
return this;
}
/**
* StringBuilder append方法
*/
@Override
public StringBuilder append (String str){
super.append(str);
return this;
}
结论
三个类应当根据不同的情况来进行选择使用:
当字符串相加操作或者改动较少的情况下,建议使用 String str="hello"这种形式
当字符串相加操作较多的情况下,建议使用StringBuilder
如果采用了多线程,则使用StringBuffer。