StringBuffer 和 StringBuilder复习(java)

本文详细介绍了Java中的StringBuffer和StringBuilder类,以及它们与String的区别,包括可变性、效率、线程安全性和使用场景建议。重点讨论了字符串创建、转换、常见操作方法及特殊情况下处理NULL的情况。
摘要由CSDN通过智能技术生成

StringBuffer

StringBuffer 继承了 AbstractStringBuilder,所以底层是 char[] value。它是可变的数组,。而且放在堆区,

在这里插入图片描述

StringBuilder触发扩容机制时,其内部字符数组的地址会改变,但StringBuilder对象的地址本身不会改变


创建 StringBuffer

//1. 创建一个 大小为 16 的 char[], 用于存放字符内容
StringBuffer stringbuffer = new StringBuffer();

//2. 通过构造器指定 char[] 大小
StringBuffer stringbuffer1 = new StringBuffer(100);

//3. 通过 给一个String 创建 StringBuffer , char[] 大小就是 str.length() + 16,可以用 capacity方法证明
StringBuffer hello = new StringBuffer("hello");

String 与 StringBuffer 互相转换

  • String 转 StringBuffer
//第一种方法:构造器
String str = "hello tom";
StringBuffer stringBuffer = new StringBuffer(str);

//第二种方法:append 方法        
StringBuffer stringBuffer1 = new StringBuffer();
stringBuffer1 = stringBuffer1.append(str);
  • StringBuffer 转 String
//第一种方法:使用 toString 方法
StringBuffer stringBuffer = new StringBuffer("chicken");
String s = stringBuffer.toString();

//第二种方法: 使用String 构造器
String s1 = new String(stringBuffer);

StringBuffer常用方法

  • 追加
StringBuffer stringBuffer = new StringBuffer("hello");
stringBuffer.append("fuck").append("world");
System.out.println(stringBuffer);
  • 删除
 StringBuffer stringBuffer = new StringBuffer("hello");
stringBuffer.delete(1, 3); //左闭右开 [1,3) 这里删掉 el
System.out.println(stringBuffer);
  • 替换
StringBuffer stringBuffer = new StringBuffer("fuck world!");
stringBuffer.replace(0,5, "hello "); //左闭右开
System.out.println(stringBuffer);
  • 查找
 StringBuffer stringBuffer = new StringBuffer("fuck world!")
 int index = stringBuffer.indexOf("fuck");
 System.out.println(index);//和String规则一样,返回0
  • 插入
StringBuffer stringBuffer = new StringBuffer("man");
stringBuffer.insert(0, "damn ");
System.out.println(stringBuffer);

String 为 NULL 转 StringBuffer 问题

String str = null;
StringBuffer sb = new StringBuffer();
sb.append(str);

System.out.println(sb.length());//输出为 4

append 底层又遇到 NULL 会转成 空字符 “NULL”;
在这里插入图片描述


扩容机制

  • StringBuilder 默认初始化容量16,构造参数为 String 默认为 String 的
    长度 + 16

  • StringBuilder 扩容策略:默认从当前容量开始,每次扩为原来的 2 倍再加上 2。如果要扩容的量大于原来的 2 倍再加上 2,那就直接按照这个值扩容 比如:你数组长度 40,默认value数组为 16,按照初始策略 16 * 2 + 1 = 34 ,不够扩,那就直接扩成 40


StringBuilder 类

StringBuilder 东西和 StringBuffer 一样的。知识 StringBuilder 效率高,但是线程不安全。没啥好讲的所以直接跳到 三个 String 的比较



String - StringBuilder - StringBuffer 比较

;
String:字符序列不可变,效率最低,因为共享原则,复用率高
StringBuffer:字符序列可变,效率三者中第二,线程是安全的
StingBuilder:字符序列可变,效率最高,线程不安全


使用建议

  • 如果字符串要大量修改,单线程用 StringBuilder, 多线程用 StringBuffer
  • 如果字符串很少修改,被多个对象引用,可以使用 String


常用方法

  1. append(Type data): 将指定类型的数据追加到此字符串缓冲区的末尾。

  1. delete(int start, int end): 删除此字符串缓冲区中的部分字符,从start索引开始到end索引之前。

  1. deleteCharAt(int index): 删除此字符串缓冲区在指定索引处的字符。

  1. insert(int offset, String str): 在此字符串缓冲区的指定位置插入字符串。

  1. replace(int start, int end, String str): 使用给定的字符串替换此字符串缓冲区中的一个子字符串,从start索引开始到end索引之前。

  1. reverse(): 反转此字符串缓冲区的字符序列。

  1. setCharAt(int index, char ch): 使用指定字符替换此字符串缓冲区在指定索引处的字符。

  1. setLength(int newLength): 设置此字符串缓冲区的长度。如果新长度大于当前长度,则用null字符(‘\0’)填充;如果小于当前长度,则截断字符串。

  1. charAt(int index): 返回此字符串缓冲区在指定索引处的字符。

  1. indexOf(String str): 返回指定子字符串在此字符串缓冲区中第一次出现的位置。

  1. indexOf(String str, int fromIndex): 从指定的索引开始,返回指定子字符串在此字符串缓冲区中第一次出现的位置。

  1. lastIndexOf(String str): 返回指定子字符串在此字符串缓冲区中最后一次出现的位置。

  1. lastIndexOf(String str, int fromIndex): 从指定的索引开始,返回指定子字符串在此字符串缓冲区中最后一次出现的位置。

  1. length(): 返回此字符串缓冲区的长度。

  1. substring(int start): 返回一个新的字符串,它是此字符串缓冲区的一个子字符串,从指定的start索引开始直到字符串的末尾。

  1. substring(int start, int end): 返回一个新的字符串,它是此字符串缓冲区的一个子字符串,从指定的start索引开始到end索引之前。

  1. toString(): 返回此字符串缓冲区的字符串表示形式。
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值