浅谈String、StringBuffer和StringBuild的区别
一、可变与否
- String是不可变的,是被final修饰的.他的长度是不变的,当使用
concat()
方法的时候,返回的也是有一个新创建的对象。 - StringBuffer和StringBuilder类的对象能够被多次修改,并且不产生新的对象。StringBuilder和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
总结: String、StringBuilder和StringBuffer的底层数据结构都是char[]数组,不同的是String将该char数组设置成了不可变的(final),通过这个关键字实现了不可变对象。
二、执行效率
- 三者在执行速度方面的比较:StringBuilder > StringBuffer > String
由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。
三、建议使用场景
- 操作少量的数据且不会改变,String
- 单线程操作大量的数据,StringBuilder
- 多线程操作大量的数据 StringBuffer
三、相关知识总结
- java支持通过构造方法或者字面常量构建字符串
- 字符串对象存放的位置可能放在堆内存,也可能放在字符串常量池。使用构造方法构建的字符串对象一定在堆内存,如果堆该字符串对象调用String.intern()方法,则可以将该字符串移入字符串常量池。
- 字符串上支持很多操作API,例如字符串连接、截取字符串、trim、替换字符等等,这些操作看似是写操作,实际上都会返回一个新的字符串
- 字符串的连接操作有几种方式:
- “+”运算符重载,底层是依靠StringBuilder实现的;
- String.contact()方法,底层是依赖Array.copy实现的;
- StringBuilder,通过预先分配一个字符缓冲区来进行字符串的连接,适合大批量字符串连接的情况
网友评论