Java基础–理解Java中String,StringBuffer,StringBuilder有什么区别
- String时Java语言非常基础和重要的类,提供了构造和管理字符串的各种基本逻辑。它时典型的Immutable(不可变)类,被声明为final ,其所有属性也都时final。当然也是由于它的不可变性,导致类似拼接,裁剪字符串时,都会产生新的String对象。由于字符串操作的普遍性,所有相关操作的效率往往对应用的性能有明显的影响
- StingBuffer是为了解决上面提到拼接产生太多中间对象的问题而提供的一个类,我们可以用append或者add方法,将字符串添加到已有序列的末尾或者指定位置。本质上是一个线程安全对的可修改的字符序列,它保证了线程安全,也随之带来了额外的性能开销,所以除非有线程安全的需要,不然还是推荐使用下面的StringBuilder
- StringBuilder是Java1.5之后新增的,在能力上和StringBuffer没有区别,但是去掉了线程安全的部分,有效减小了开销,是绝大多数情况下进行字符串拼接的首选
为了实现修改字符序列的目的,StringBuffer和StringBuilder底层都是利用可修改的(char,JDK9以后是byte)数组,二者都继承了AbstractStringBuilder,里面包含了基本操作,区别仅在于最终的方法是否加入了synchronized
String str1 = “123”;//通过直接赋值方式,放入字符串常量池
String str2 = new String(“123”);//通过new方式赋值方式,不放人字符串常量池
附带知识:
- 字符串缓存的intern机制
- 非代码侵入性的虚拟机层面排重
- Java9中紧凑字符的改进