LongJL 发表于 2021-7-11 16:51

【自学笔记】 Java基础 - API之StringBuilder

#StringBuilder

## 概述
- Java.lang.StringBuilder
- StringBuilder是一个可变的字符串类,可以看做是字符串缓冲区,可以提高字符串的操作效率(看成一个长度可以变换的字符串),底层也是一个数组,但是没有被final修饰,可以改变长度
- StringBuilder在内存中始终是一个数组,占用空间少,效率高,如果超出了StringBuilder的容量,会自动扩容。

## 与String的性能对比

```Java
public class testStringBuilder {
    public static void main(String[] args) {
      testString();
      testStringBuilder();
    }

    public static void testString(){
      String s = "";
      long start = System.currentTimeMillis(); // 获取1970年1月1日0时0分0秒 到当前时间经历过的的毫秒值

      for (int i=1;i<=50000;i++){
            s +=i;
      }
      long end = System.currentTimeMillis();
      System.out.println("String=>" + " " + (end-start));
    }

    public static void testStringBuilder(){
      StringBuilder stringBuilder = new StringBuilder();
      long start = System.currentTimeMillis(); // 获取1970年1月1日0时0分0秒 到当前时间经历过的的毫秒值

      for (int i=1;i<=50000;i++){
            stringBuilder.append(i);
      }
      long end = System.currentTimeMillis();
      System.out.println("StringBuilder=>" + " " + (end-start));
    }
}

打印结果:
String=> 3780
StringBuilder=> 2
```

注:+号运算符 对字符串拼接时候会产生垃圾字符串 导致内存变大,再Java底层中会new StringBuilder调用append()完成字符串拼接,再调用toString()方法返回字符串,一个加号,堆内存中俩个对象。

## 构造方法

- StringBuilder():构造一个不带任何字符的字符串生成器,其初始容量为16个字符。
- StringBuilder(String str):构造一个字符串生成器,并初始化为指定的字符串内容

```Java
public class CreateStringBuilder {
    public static void main(String[] args) {
      // StringBuilder():构造一个不带任何字符的字符串生成器,其初始容量为16个字符。
      StringBuilder stringBuilder = new StringBuilder();
      System.out.println(stringBuilder);
      // StringBuilder(String str):构造一个字符串生成器,并初始化为指定的字符串内容
      StringBuilder stringBuilder1 = new StringBuilder("abc");
      System.out.println(stringBuilder1);
    }
}
```

## 常用方法
- public StringBuilder append(...):添加任意类型数据的字符串形式,并返回当前对象自身;
        注:
                append方法返回的是this。
                append的方法无序返回值。
- public String toString():将当前StringBuilder对象转换为String对象
        注:
                String和StringBuilder可以互相转换:
                String->StringBuilder:可以使用StringBuilder的构造方法
                StringBuilder->String:可以使用StringBuilder中的toString方法
- public StringBuilder reverse() 返回相反的字符序列
- public int length() 返回长度(字符出现的个数)

```Java
public class StringBuilderMethod {
    public static void main(String[] args) {
      StringBuilder stringBuilder = new StringBuilder();

      // public StringBuilder append(...):添加任意类型数据的字符串形式,并返回当前对象自身;
      stringBuilder.append(123);
      stringBuilder.append("abc");
      stringBuilder.append(true);
      StringBuilder stringBuilder1 = stringBuilder.append('s');
      StringBuilder stringBuilder2 = stringBuilder.append(12314.123);
      System.out.println(stringBuilder);
      System.out.println(stringBuilder1 == stringBuilder2); // 返回当前对象自身
      // 链式编程:如果一个方法返回得是一个对象,对象就可以继续向下调用方法
      stringBuilder2.append("连").append("式").append("编").append("程");
      System.out.println(stringBuilder);
      // result=> 123abctrues12314.123
      // result=> true
      // 123abctrues12314.123连式编程

      // public StringBuilder reverse() 返回相反的字符序列
      stringBuilder.reverse();
      System.out.println(stringBuilder);
      // 程编式连321.41321seurtcba321

      //public int length() 返回长度(字符出现的个数)
      System.out.println(stringBuilder.length());
      
      // public String toString():将当前StringBuilder对象转换为String对象
      System.out.println(stringBuilder.toString());
    }
}

```

## StringBuilder和String得区别
- String:内容是不可改变的
- StringBuilder:内容是可变的

LongJL 发表于 2021-7-11 17:41

First丶云心 发表于 2021-7-11 17:25
谢谢分享,学习学习!

{:301_978:} 共同加油

chenlongjs 发表于 2021-7-11 19:16

我怎么又感觉到我到了java的学习时代了?

LongJL 发表于 2021-7-11 20:07

chenlongjs 发表于 2021-7-11 19:16
我怎么又感觉到我到了java的学习时代了?

{:301_1001:}那就多看看,帮我查查错,顺便复习复习

mallorJava 发表于 2021-7-11 20:48

xuexi l

Derrick92 发表于 2021-7-12 08:04

咋没讲讲 线程安全呢?

LongJL 发表于 2021-7-12 08:05

Derrick92 发表于 2021-7-12 08:04
咋没讲讲 线程安全呢?

线程安全我打算等到StringBuffer的时候一起说{:301_1007:}
页: [1]
查看完整版本: 【自学笔记】 Java基础 - API之StringBuilder