String,StringBuffer ,StringBuilder 的区别及其详解

一、String

1.1 String介绍

  • String 类代表的字符串,程序中任何字符串都是String类的对象
public final class String extends Objectimplements Serializable, Comparable<String>, CharSequence

在这里插入图片描述

  • 字符串是常量;它们的值在创建之后不能更改。
  • 通过上图发现String final修饰,所以字符串的值创建之后就不可以被修改,具有不可变性

1.2 深入理解String的不可变性

  • 通过字面量方式为字符串赋值时,此时的字符串存储在方法区的字符串常量池中,并且在字符串常量池中不会存储相同内容的字符串。
    在这里插入图片描述
  • 也就是说,s1 和 s2 指向同一地址
    那么你可能会说,我重新给s1 赋值,他不就改变了吗?那还有什么不可变性呢
    在这里插入图片描述
  • 看上图就知道了,给s1重新赋值,,只是在字符串常量池又new 了一新的字符串,原先的”abc“并没有被改变。

1.3 String 操作字符串方法


二、StringBuffer

2.1 StringBuffer介绍

  • 也就是因为String类字符串定义后不能改变,所以提供了StringBuffer类(字符串缓冲区)来操作字符串。
  • 可将字符串缓冲区安全地用于多个线程
  • 看完上面,你也就知道String 和StringBuffer的最大区别了
  • 那就是StringBuffer创建的字符串可以改变

2.2 StringBuffer 构造方法

既然是类,那当然有构造方法啦,有了构造方法就可以创建StringBuffer类的字符串了

  • 可不可以像String那样创建呢?
    在这里插入图片描述
    看来是不行的,那该如何创建呢?
  • 当然就像普通类一样啦,new 对象啦!
  • 首先要知道构造方法是啥
声明方法描述
StringBuffer()构造一个其中不带字符的字符串缓冲区,其初始容量为 16 个字符。
StringBuffer(CharSequence seq)public java.lang.StringBuilder(CharSequence seq) 构造一个字符串缓冲区,它包含与指定的 CharSequence 相同的字符。
StringBuffer(int capacity)构造一个不带字符,但具有指定初始容量的字符串缓冲区。
StringBuffer(String str)构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容

创建字符串

 StringBuffer sbf = new StringBuffer("java");

这样就创建了一个可变的字符串了

2.3 StringBuffer 常用方法

有了对象就可调用方法了,下面就演示一些方法

  • 两个最常用方法 append() 和 insert() 方法
  1. append()
声明方法描述
StringBuffer append(boolean b)将 boolean 参数的字符串表示形式追加到序列。
StringBuffer append(char c)将 char 参数的字符串表示形式追加到此序列。
StringBuffer append(char[] str)将 char 数组参数的字符串表示形式追加到此序列。
StringBuffer append(char[] str, int offset, int len)将 char 数组参数的子数组的字符串表示形式追加到此序列。
StringBuffer append(CharSequence s)将指定的 CharSequence 追加到该序列。
StringBuffer append(CharSequence s, int start, int end)将指定 CharSequence 的子序列追加到此序列。
StringBuffer append(double d)将 double 参数的字符串表示形式追加到此序列。
StringBuffer append(float f)将 float 参数的字符串表示形式追加到此序列。
StringBuffer append(int i)将 int 参数的字符串表示形式追加到此序列。
StringBuffer append(long lng)将 long 参数的字符串表示形式追加到此序列。
StringBuffer append(Object obj)追加 Object 参数的字符串表示形式。
StringBuffer append(String str)将指定的字符串追加到此字符序列。
StringBuffer append(StringBuffer sb)将指定的 StringBuffer 追加到此序列中。
  • 看着表格里append 方法好像很多,其实只是重载的多,传入参数不同
  • 而且都是追加在末尾了,看演示代码就知道了
 sbf.append("666");// 在末尾追加
 System.out.println(sbf);//java666

2.insert

声明方法描述
StringBuffer insert(int offset, char c)将 char 参数的字符串表示形式插入此序列中。
StringBuffer insert(int offset, char[] str)将 char 数组参数的字符串表示形式插入此序列中。
StringBuffer insert(int index, char[] str, int offset, int len)将数组参数 str 的子数组的字符串表示形式插入此序列中。
StringBuffer insert(int dstOffset, CharSequence s)将指定 CharSequence 插入此序列中。
StringBuffer insert(int dstOffset, CharSequence s, int start, int end)将指定 CharSequence 的子序列插入此序列中。
StringBuffer insert(int offset, double d)将 double 参数的字符串表示形式插入此序列中。
StringBuffer insert(int offset, float f)将 float 参数的字符串表示形式插入此序列中。
StringBuffer insert(int offset, int i)将 int 参数的字符串表示形式插入此序列中。
StringBuffer insert(int offset, long l)将 long 参数的字符串表示形式插入此序列中。
StringBuffer insert(int offset, Object obj)将 Object 参数的字符串表示形式插入此字符序列中。
StringBuffer insert(int offset, String str)将字符串插入此字符序列中。
  • 跟append 一样,重载的多
  • insert方法可以让你以指定位置插入,append 只能在末尾加
 sbf.insert(4,"-"); // 插入
 System.out.println(sbf );//java-666
  • 其他方法
声明方法描述
int capacity()返回当前容量。
char charAt(int index)返回此序列中指定索引处的 char 值。
int codePointAt(int index)返回指定索引处的字符(统一代码点)。
int codePointBefore(int index)返回指定索引前的字符(统一代码点)。
int codePointCount(int beginIndex, int endIndex)返回此序列指定文本范围内的统一代码点。
StringBuffer delete(int start, int end)移除此序列的子字符串中的字符。
StringBuffer deleteCharAt(int index)移除此序列指定位置的 char。
void ensureCapacity(int minimumCapacity)确保容量至少等于指定的最小值。
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)将字符从此序列复制到目标字符数组 dst。
int indexOf(String str)返回第一次出现的指定子字符串在该字符串中的索引。
int indexOf(String str, int fromIndex)从指定的索引处开始,返回第一次出现的指定子字符串在该字符串中的索引。
int lastIndexOf(String str)返回最右边出现的指定子字符串在此字符串中的索引。
int lastIndexOf(String str, int fromIndex)返回最后一次出现的指定子字符串在此字符串中的索引。
int length()返回长度(字符数)。
int offsetByCodePoints(int index, int codePointOffset)返回此序列中的一个索引,该索引是从给定 index 偏移 codePointOffset 个代码点后得到的。
StringBuffer replace(int start, int end, String str)使用给定 String 中的字符替换此序列的子字符串中的字符。
StringBuffer reverse()将此字符序列用其反转形式取代。
void setCharAt(int index, char ch)将给定索引处的字符设置为 ch。
void setLength(int newLength)设置字符序列的长度。
CharSequence subSequence(int start, int end)返回一个新的字符序列,该字符序列是此序列的子序列。
String substring(int start)返回一个新的 String,它包含此字符序列当前所包含的字符子序列。
String substring(int start, int end)返回一个新的 String,它包含此序列当前所包含的字符子序列。
String toString()返回此序列中数据的字符串表示形式。(默认)
void trimToSize()尝试减少用于字符序列的存储空间。

三、StringBuilder

2.1 StringBuffer介绍

  • StringBuilder和StringBuffer,String一样代表字符串

  • 也是可变字符序列,API与StringBuffer完全一致,就是为了替换StringBuffer

  • StringBuilder是不保证线程安全,相对StringBuffer在改变字符串时效率较快

  • 如果不考虑线程安全,改变字符建议Builder,如果要求线程安全使用Buffer

StringBuilder 与 StringBuffer 方法完全一致,这里就不在列出了,讲述了,下面总结一下这String,StringBuffer ,StringBuilder 这三个的区别

四、String,StringBuffer ,StringBuilder 区别

  • String 不可变,拼接字符串效率最低
  • StringBuffer 、StringBuilder 均可变
  • StringBuffer 适合多线程,可保证线程安全,但是拼接字符串效率较低。
  • StringBuilder适合单线程,不保证线程安全,拼接字符串效率较高。

最后

编写不易,如果感觉有收获的话,点个赞 👍🏻 吧。
❤️❤️❤️本人菜鸟修行期,如有错误,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍在这里插入图片描述

  • 36
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值