String、StringBuffer、StringBuilder三者的异同?

  • String
  • 字符串
  • 不可变的字符序列
  • jdk1.8,我们底层用 char [ ] 存储
  • 在 jdk 17,我们底层用 byte  [ ] 存储 
  • StringBuffer
  • 字符串缓冲区类
  • 可变的字符序列,线程安全的(synchronized),效率低
  • jdk1.8,我们底层用 char [ ] 存储
  • 在 jdk 17,我们底层用 byte  [ ] 存储 
  • StringBuilder
  • 字符串生成器类
  • 可变的字符序列,jdk5.0新增的,线程不安全的,效率高
  • jdk1.8,我们底层用 char [ ] 存储
  • 在 jdk 17,我们底层用 byte  [ ] 存储 

1、那么在开发当中我们应该到底怎么选择呢?

  • 首先看是不是一个多线程问题。
  • 不是多线程问题,就用StringBuilder
  • 因为只有多个线程操作共享数据的时候,我们才会考虑用StringBuffer
  • 否则不是多线程,或者不存在多线程的安全问题,我们都建议用StringBuilder。

2、jdk8源码分析String

  • String str = new String();                    //char[ ] value = new char[0];
  • String str1 = new String("abc")         //char[ ]  value = new char[ ]{  'a',  'b',  'c'  };

String、StringBuffer、StringBuilder三者的异同?_第1张图片

3、jdk8源码分析StringBuffer

  • StringBuffer sb1 = new StringBuffer();        //char[ ] value = new char[16];   底层创建了一个长度是16的数组。
  • sb1.append('a');    //value[0] = 'a';
  • sb1.append('b')     //value[1] = 'b';

String、StringBuffer、StringBuilder三者的异同?_第2张图片

package stringdemo;

public class StringBufferTest {
    public static void main(String[] args) {

        StringBuffer sb = new StringBuffer();
        System.out.println(sb.capacity());//16
        
    }
}
D:\Java\jdk-17\bin\java.exe "-javaagent:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\lib\idea_rt.jar=34469:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\bin" -Dfile.encoding=UTF-8 -classpath F:\IdeaProjects\JavaSenior\out\production\Exception stringdemo.StringBufferTest
16

Process finished with exit code 0
  • StringBuffer   sb2 = new StringBuffer(“abc”);//char[ ] value= new char["abc".length()+16]

String、StringBuffer、StringBuilder三者的异同?_第3张图片

package stringdemo;

public class StringBufferTest {
    public static void main(String[] args) {
        StringBuffer sb1 = new StringBuffer("abc");
        System.out.println(sb1.capacity());//3+16=19
    }
}
D:\Java\jdk-17\bin\java.exe "-javaagent:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\lib\idea_rt.jar=35502:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\bin" -Dfile.encoding=UTF-8 -classpath F:\IdeaProjects\JavaSenior\out\production\Exception stringdemo.StringBufferTest
19

Process finished with exit code 0

 3.1、扩容问题

  • 如果要添加的数据底层数组盛不下了,那就需要扩容底层的数组。
  • 默认情况下,扩容为原来容量的2倍+2,同时将原有数组中的元素赋值到新的数组中。
  • new StringBuilder();     创建的时候是不会扩容的,容量是(字符串参数的长度 加上16)。
package stringdemo;

public class StringBufferTest {
    public static void main(String[] args) {
        //new  StringBuffer();创建的时候是不会扩容的
        StringBuffer sb1 = new StringBuffer("66666666666666666666666666666666666666666666666666666666");
        System.out.println(sb1.length());//56
        System.out.println(sb1.capacity());//56+16=72

    }
}
D:\Java\jdk-17\bin\java.exe "-javaagent:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\lib\idea_rt.jar=37260:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\bin" -Dfile.encoding=UTF-8 -classpath F:\IdeaProjects\JavaSenior\out\production\Exception stringdemo.StringBufferTest
56
72

Process finished with exit code 0
  • sb1.append();的时候,追加的时候才会发生扩容。超出(字符串参数的长度+16)的时候才会发生扩容。

public class StringBufferTest {
    public static void main(String[] args) {
        StringBuffer sb1 = new StringBuffer("44444444");//new创建的时候不会发生扩容
        System.out.println(sb1.length());//8
        System.out.println(sb1.capacity());//8+16=24
        System.out.println("===================");

        sb1.append("44444444");
        System.out.println(sb1.length());//16
        System.out.println(sb1.capacity());//16+16=24
        System.out.println("===================");

        sb1.append("44444444");
        System.out.println(sb1.length());//24
        System.out.println(sb1.capacity());//24 这个时候StringBuffer的容量已经满,再append就会扩容
        System.out.println("===================");

        sb1.append("4");
        System.out.println(sb1.length());//25
        System.out.println(sb1.capacity());//24*2+2=50   扩容为原来容量的2倍+2


    }
}
D:\Java\jdk-17\bin\java.exe "-javaagent:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\lib\idea_rt.jar=37603:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\bin" -Dfile.encoding=UTF-8 -classpath F:\IdeaProjects\JavaSenior\out\production\jdk8 StringBufferTest
8
24
===================
16
24
===================
24
24
===================
25
50

Process finished with exit code 0

String、StringBuffer、StringBuilder三者的异同?_第4张图片

String、StringBuffer、StringBuilder三者的异同?_第5张图片

 

你可能感兴趣的:(#,常用API,java,开发语言,String,StringBuffer,StringBuilder)