一、存储原理

  • String不可变的原因

    1. // 底层是个final修饰的char数组
    2. private final char value[];
  • 存储原理

    1. public class StringTest {
    2. public static void main(String[] args) {
    3. String s1 = "abc";
    4. String s2 = "abc";
    5. String s3 = new String("223");
    6. String s4 = new String("223");
    7. System.out.println(s1 == s2); // true
    8. System.out.println(s3 == s4); // false
    9. System.out.println(s3.equals(s4)); // true
    10. /*
    11. String不可变
    12. String属于引用数据类型,String中重写了equals()方法,因此比较的是内容
    13. "=="对于引用数据类型来说,是比较内存地址的
    14. */
    15. }
    16. }

    2021-07-13_165017.png

    二、StringBuffer和StringBuilder

  • 因为String是不可变的,所以如果需要进行大量的字符串拼接操作的话,每进行一次拼接操作,就有可能在方法区字符串常量池中创建出一个新的字符串,这样会造成方法区内存占用过大……由此就有了可变数组StringBuffer

    1. // 构造一个没有字符且初始容量为 16 个字符的字符串缓冲区
    2. // 会自动扩容
    3. public StringBuffer() {
    4. super(16);
    5. }
  • 如何优化StringBuffer的性能?

    • 创建的时候指定一个合适的初始容量,扩容次数越少,效率越高
      1. public class StringTest {
      2. public static void main(String[] args) {
      3. StringBuffer sb = new StringBuffer(24);
      4. sb.append("a");
      5. sb.append("b");
      6. sb.append("c");
      7. sb.append("d");
      8. }
      9. }
  • StringBuffer和StringBuilder的区别

    • StringBuffer中方法都有synchronized修饰是线程安全的
    • StringBuilder是非线程安全的