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