String、StringBuffer、StringBuilder这三个类都可以用来定义字符串变量,但是都存在区别。
- String-不可变字符串,其本质就是字符数组
- StringBuffer-可变字符串、效率低、线程安全
- StringBuilder-可变字符串序列、效率高、线程不安全
一、StringBuffer类
线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
StringBuffer
上的主要操作是append
和insert
方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符添加或插入到字符串缓冲区中。append
方法始终将这些字符添加到缓冲区的末端;而insert
方法则在指定的点添加字符。
二、StringBuilder类
一个可变的字符序列。此类提供一个与
StringBuffer
兼容的 API,但不保证同步。该类被设计用作StringBuffer
的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比StringBuffer
要快。在
StringBuilder
上的主要操作是append
和insert
方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符添加或插入到字符串生成器中。append
方法始终将这些字符添加到生成器的末端;而insert
方法则在指定的点添加字符。
三、StringBuffer类和StringBuilder类常用方法
StringBuffer() //构造一个其中不带字符的字符串缓冲区,初始容量为 16 个字符。
StringBuffer(CharSequence seq) //构造一个字符串缓冲区,它包含与指定的 CharSequence 相同的字符。
StringBuilder() //构造一个其中不带字符的字符串生成器,初始容量为 16 个字符。
StringBuilder(CharSequence seq) //构造一个字符串生成器,包含与指定的 CharSequence 相同的字符。
public StringBuffer append(数据类型 b)//提供了很多的append()方法,用于进行字符串连接
public StringBuffer delete(int start,int end)//删除指定位置的内容
public StringBuffer insert(int offser,数据类型 b)// 在指定位置上增加一个内容
public StringBuffer replace(int start,int end,String str)//将指定范围的内容替换成其他内容
public StringBuffer reverse()//字符串翻转
package com.zking.test;
public class StringBufferAndStringBuilderDemo {
public static void main(String[] args) {
StringBuffer sb = "sb"; 不能直接定义
StringBuffer sb = new StringBuffer("我是谁");
System.out.println(sb);
StringBuffer sb = new StringBuffer("我是谁");
//sb的类型:StringBuffer类型
//需求:StringBuffer类型---》String类型
String str = sb.toString();//永远不要记等于符号左边的代码 ctrl+1
System.out.println(str);
//需求:String类型--->StringBuffer类型
String name = "dengyankang";
//通过构造函数直接可以转换
StringBuffer sb2 = new StringBuffer(name);
//与String不一样的方法有以下几个
// append 末尾追加内容
StringBuffer sb = new StringBuffer("dengyankang");
sb.append("liuxiangyang");
System.out.println(sb);
// insert 在指定的索引位置处添加指定的内容
sb.insert(2, "王家庆");
System.out.println(sb);
// delete删除
sb.delete(2, 5);
System.out.println(sb);
// 替换 区间替换
sb.replace(0, 4, "tang");
System.out.println(sb);
// 反转 倒过来输出
sb.reverse();
System.out.println(sb);
StringBuilder sb2 = new StringBuilder();
}
}
四、String、StringBuffer、StringBiulder的区别
- String 是不可变的,而 StringBuffer 和 StringBuilder 是可变类。
- StringBuffer 是线程安全和同步的,而 StringBuilder 不是。这就是 StringBuilder 比 StringBuffer 快的原因。
- 字符串连接运算符 (+) 在内部使用 StringBuilder 类。
- 对于非多线程环境中的字符串操作,我们应该使用 StringBuilder 否则使用 StringBuffer 类。