String、StringBuffer、StringBuilder, StringJoiner 的区别

一、Java String 类——String字符串常量

字符串广泛应用 在Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。

需要注意的是,String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,这样不仅效率低下,而且大量浪费有限的内存空间。我们来看一下这张对String操作时内存变化的图:
String、StringBuffer、StringBuilder, StringJoiner 的区别_第1张图片
我们可以看到,初始String值为“hello”,然后在这个字符串后面加上新的字符串“world”,这个过程是需要重新在栈堆内存中开辟内存空间的,最终得到了“hello world”字符串也相应的需要开辟内存空间,这样短短的两个字符串,却需要开辟三次内存空间,不得不说这是对内存空间的极大浪费。为了应对经常性的字符串相关的操作,谷歌引入了两个新的类——StringBuffer类和StringBuild类来对此种变化字符串进行处理。


二、Java StringBuffer 和 StringBuilder 类——StringBuffer字符串变量、StringBuilder字符串变量

String、StringBuffer、StringBuilder, StringJoiner 的区别_第2张图片
当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。

和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。

StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。

由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。

(1) 三者的继承结构

String、StringBuffer、StringBuilder, StringJoiner 的区别_第3张图片

三者的区别:

  1. String
    Java中的String对象是不可变对象,针对字符串对象的操作(例如subString、contact、replace)都会生成一个新的String对象,如果应用中有大量这样的操作,就会产生大量的临时String对象,然后将指针指向新的String对象,会影响Java应用运行的性能,所以经常改变内容的字符串最好不要用 String 。String在java中是不可变长的,一旦初始化就不能修改长度,简单的字符串拼接其实是创建新的String对象,再把拼接后的内容赋值给新的对象,在频繁修改的情况下会频繁创建对象

  2. StringBuffer
    JDK 1.0中提供了StringBuffer类,这个类的对象是可变对象,它的原理是申请一个缓冲区来存放字符串,可以避免产生新的字符串对象。我们可以用append或者add方法,把字符串添加到已有序列的末尾或者指定位置。但是StringBuffer是线程安全的,它的方法都被synchronized关键字修饰,导致它的性能不太好。

  3. StringBuilder
    为了解决StringBuffer的性能问题,JDK1.5提供了一个非线程安全的StringBuilder类,它去掉了线程安全的部分,有效减少了开销,是绝大部分情况下进行字符串拼接的首选。
    StringBuilder 和 StringBuffer 底层都是利用可修改的(char,JDK 9 以后是byte)数组,都继承了 AbstractStringBuilder, 里面包含了基本操作,区别仅在于最终的方法是否加了synchronized。StringBuilder在append时并不是用String存储,而是放到一个value的char数组中,字符串是固定长度的,而数组是可以扩容的,这样就不需要不停创建对象了

  4. StringJoiner
    StringJoiner是Java8新出的一个类,用于构造由分隔符分隔的字符序列,并可选择性地从提供的前缀开始和以提供的后缀结尾,它的底层是通过StringBuilder实现的,这样开发人员可以不需要通过StringBuffer或者StingBuilder拼接。

String、StringBuffer、StringBuilder, StringJoiner 的区别_第4张图片
小结:(1)如果要操作少量的数据用 String;

(2)多线程操作字符串缓冲区下操作大量数据 StringBuffer;

(3)单线程操作字符串缓冲区下操作大量数据 StringBuilder
(4) StringJoiner是Java8新出的一个类,用于构造由分隔符分隔的字符序列,并可选择性地从提供的前缀开始和以提供的后缀结尾。省的我们开发人员再次通过StringBuffer或者StingBuilder拼接。
(5)因为string使用final char[] value数组存储字符串内容,每次修改是return new String返回一个新的字符串,需要重新生成一个字符串对象,申请内存空间,这花了时间,而stringbuilder类的value数组不是final的,是可变的,不需要重新生成新的对象,但是数组扩容其实也是换一个更大的数组罢了
(6):stringbuilder类的append方法是return this,而string类的方法都是return new String

实例 :

①String

String s = null;

String s = “abc”;

②StringBuffer

StringBuffer s = null; //结果警告:Null pointer access: The variable result can only be null at this location

StringBuffer s = new StringBuffer();//StringBuffer对象是一个空的对象

StringBuffer s = new StringBuffer(“abc”);//创建带有内容的StringBuffer对象,对象的内容就是字符串”

3.StringJoiner

String、StringBuffer、StringBuilder, StringJoiner 的区别_第5张图片
String、StringBuffer、StringBuilder, StringJoiner 的区别_第6张图片

你可能感兴趣的:(JavaSE,字符串,java,多线程)