【Java】String、StringBuilder、StringBuffer的介绍和区分

 2022-09-18
原文地址:https://blog.csdn.net/Trong_/article/details/126592355

1. StringBuilder和StringBuffer

由于String的不可更改特性,为了方便字符串的修改,Java中又提供StringBuilder和StringBuffer类。

这两个类大部分功能是相同的,这里介绍 StringBuilder常用的一些方法,其它需要用到可参阅 StringBuilder在线文档

方法 说明
StringBuffappend(Stringstr) 在尾部追加,相当于String的+=,可以追加:boolean、char、char[]、double、float、int、long、Object、String、StringBuff的变量
charcharAt(intindex) 获取index位置的字符
intlength() 获取字符串的长度
intcapacity() 获取底层保存字符串空间总的大小
voidensureCapacity(intmininmumCapacity) 扩容
voidsetCharAt(intindex,charch) 将index位置的字符设置为ch
intindexOf(Stringstr) 返回str第一次出现的位置
intindexOf(Stringstr,intfromIndex) 从fromIndex位置开始查找str第一次出现的位置
intlastIndexOf(Stringstr) 返回最后一次出现str的位置
intlastIndexOf(Stringstr,intfromIndex) 从fromIndex位置开始找str最后一次出现的位置
StringBuffinsert(intoffset,Stringstr) 在offset位置插入:八种基类类型&String类型&Object类型数据
StringBufferdeleteCharAt(intindex) 删除index位置字符
StringBufferdelete(intstart,intend) 删除[start,end)区间内的字符
StringBufferreplace(intstart,intend,Stringstr) 将[start,end)位置的字符替换为str
Stringsubstring(intstart) 从start开始一直到末尾的字符以String的方式返回
Stringsubstring(intstart,intend) 将[start,end)范围内的字符以String的方式返回
StringBufferreverse() 反转字符串
StringtoString() 将所有字符按照String的方式返回

代码示例:

    public static void main(String[] args) {
            StringBuilder sb1 = new StringBuilder("hello");
            StringBuilder sb2 = sb1;
    
            // 追加:即尾插-->字符、字符串、整形数字
            sb1.append(' '); // hello
            sb1.append("world"); // hello world
            sb1.append(123); // hello world123
            System.out.println(sb1); // hello world123
    
            System.out.println(sb1 == sb2); // true
    
            System.out.println(sb1.charAt(0)); // 获取0号位上的字符 h
    
            System.out.println(sb1.length()); // 获取字符串的有效长度14
    
            System.out.println(sb1.capacity()); // 获取底层数组的总大小
    
            sb1.setCharAt(0, 'H'); // 设置任意位置的字符 Hello world123
    
            sb1.insert(0, "Hello world!!!"); // Hello world!!!Hello world123
            System.out.println(sb1);
    
            System.out.println(sb1.indexOf("Hello")); // 获取Hello第一次出现的位置
    
            System.out.println(sb1.lastIndexOf("hello")); // 获取hello最后一次出现的位置
    
            sb1.deleteCharAt(0); // 删除首字符
            sb1.delete(0,5); // 删除[0, 5)范围内的字符
    
            String str = sb1.substring(0, 5); // 截取[0, 5)区间中的字符以String的方式返回
            System.out.println(str);
    
            sb1.reverse(); // 字符串逆转
            str = sb1.toString(); // 将StringBuffer以String的方式返回
            System.out.println(str);
        }

String和StringBuilder最大的区别在于 String的内容无法修改,而StringBuilder的内容可以修改 。频繁修改字符串的情况考虑使用StringBuilder 。

注意:

String和StringBuilder类不能直接转换。如果要想互相转换,可以采用如下原则:

  • String变为StringBuilder:

利用StringBuilder的构造方法( StringBuilder(String str) 构造一个字符串生成器,并初始化为指定的字符串内容)或append()方法

  • StringBuilder变为String:

调用StringBuilder重写的toString()方法

2. String、StringBuffer、StringBuilder的区别

  • String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
  • StringBuffer与StringBuilder大部分功能是相似的
  • StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作

3. 练习

以下总共创建了多少个String对象【前提不考虑常量池之前是否存在,类中数组不进行统计】 。

    String str = new String("ab"); // 会创建多少个对象
    String str = new String("a") + new String("b"); // 会创建多少个对象

分析:

  • String str = new String(“ab”);

"ab"放入字符串常量池中要创建 一个 对象,new String又新创建 一个 对象,所以 结果是两个

  • String str = new String(“a”) + new String(“b”);

new String(“a”)和new String(“b”)分别会创建 两个 对象,new String(“a”) + new String(“b”)是 两个 String类型进行拼接,会创建 一个 StringBuilder类的对象,拼接完成后所产生的字符串是 一个 全新的对象,所以 结果是六个。