StringBuffer

package cn.jason.stringbuffer.demo;
public class StringBufferDemo {
 public static void main(String[] args) {
  /*
   * stringbuffer:字符串缓冲区 作为一个字符容器 特点:
   *  1.长度可以变化
   *  2.可以对内容通过指定方法进行修改
   *  3.容器对象一般都会具备对容器中的元素进行操作的功能。增删查改
   *  4.缓冲区中可以存储不同类型的数据。啥对象都能存
   *  5.最后缓冲区存储完的数据都会变成字符串
   */
  String str = "a"+4+"c";
  //在内存中的过程。1.创建一个字符串缓冲区容器。2.将要组成字符串的元素先存储起来。3.最后将缓冲区填充数据变成字符串
  
  str=new StringBuffer().append("a").append(4).toString();
  //这就是String str 形成的过程
  
  
 }
}

package cn.jason.stringbuffer.demo;
public class StringBufferDemo2 {
 public static void main(String[] args) {
  /*
   * StringBuffer
   * 缓冲区可以对数据进行临时存储
   *
   * 了解缓冲区的常见方法
   * 添加元素:
   * StringBuffer append(各种类型的数据);追加..就是从最后添加
   * StringBuffer insert(index,各种类型的数据);指定位置添加
   *
   *
   */
  //1.创建一个缓冲区
  StringBuffer sb = new StringBuffer();
  //2.追加一个字符串
  sb.append("abc");
  System.out.println(sb);// ! pringln(),这个方法会将所有要打印的数据先转成字符串(String)再输出,
                                        //对于对象会自动调用toString方法。
  //String s = sb;         这样是错误的,因为sb是StringBuffer类型,不能自动转换
  //String s = sb.toString()         sb就需要toString手动转换成String类型
  
  //3.插入一个boolean值,true
  sb.insert(1, true);
  System.out.println(sb);
  //4.删除字符
//  sb.delete(1, 4);   //有关删除的方法的词汇就两个:delete,remove
  //所有控制头尾角标的方法,都遵循(包含头,不包含尾)
  
  //5.修改字符
  sb.replace(1, 4, "xyxyxyxyxy");//把1~4角标的替换
  System.out.println(sb);
  
  //缓冲区设置长度,只显示缓冲区内的字符
  sb.setLength(20);
  
  //反转,颠倒
  sb.reverse();
  
  
  /*
   * 字符串缓冲区中维护了一个“可变长度的数组”
   * 解释:其实就是超出内部数组长度后,新建数组长度要是原数组的1.x倍数
   * 并将原数组的数据复制到新数组中,并将新的元素也添加到新数组中
   *
   */
 }
}

package cn.jason.stringbuffer.demo;
public class StringBufferDemo3 {
 public static void main(String[] args) {
  /*
   *什么时候用字符串缓冲区
   *数据很多, 个数无所谓确定,类型无所谓确定,只要最后都转成字符串。
   *就使用StringBuffer这个容器。
   *使用的局限性:1.必须最终转成字符串。
   *   2.无法对存储进来的元素进行单独操作。因为存储进来的元素都变成字符串。
   */
  StringBuffer buf1 = new StringBuffer("hello");
  StringBuffer buf2 = new StringBuffer("java");
  test(buf1,buf2);
  System.out.println(buf1+"..."+buf2);
 }
 private static void test(StringBuffer buf1, StringBuffer buf2) {
  buf1.append(buf2);    //把buf2的数据(java),追加到buf1(java)后
  buf1=buf2;            //把buf2的对象地址赋给buf1。(buf1指向java的地址)
  //看到对象之间的运算,要判断运算的是其内部数据(比如用方法),还是控制其地址。
  //就像上面的等于号,并不是赋值的意思,而是现在对象buf1指向对象buf2的地址值,对象本身不会改变
  //当函数出栈之后,buf1便还是之前被buf2追加后的地址(hellojava)
  System.out.println(buf1+"..."+buf2);
 }
}

### StringBuffer 的基本概念 `StringBuffer` 是 Java 中的一个,用于处理可变字符串。与 `String` 不同的是,`String` 的对象一旦创建便不可更改(即它们是不可变的),而 `StringBuffer` 对象的内容可以随时修改[^3]。 以下是关于 `StringBuffer` 的一些重要特性: - 它是一个线程安全的可变字符序列。 - 所有操作都会同步执行,因此适合在多线程环境中使用。 - 提供了许多方法来操作字符串内容,比如追加、删除、替换以及反转等。 ### 创建和初始化 StringBuffer 可以通过多种方式创建一个 `StringBuffer` 实例: ```java // 使用无参构造函数创建空的 StringBuffer StringBuffer sb1 = new StringBuffer(); // 使用带有初始容量的构造函数 StringBuffer sb2 = new StringBuffer(16); // 使用指定字符串作为初始值 StringBuffer sb3 = new StringBuffer("Hello"); ``` 以上代码展示了如何通过不同的构造器来实例化 `StringBuffer` 对象[^4]。 ### 常见的操作方法 #### 追加数据 (`append`) `append()` 方法允许向现有的 `StringBuffer` 对象后面添加新的数据片段。 ```java StringBuffer buffer = new StringBuffer(); buffer.append("Java "); buffer.append("is "); buffer.append("fun!"); System.out.println(buffer); // 输出: Java is fun! ``` 此段代码演示了如何利用 `append()` 将多个部分连接成完整的句子[^5]。 #### 插入数据 (`insert`) 如果需要在一个特定位置插入新内容,则可以调用 `insert()` 方法。 ```java StringBuffer strBuf = new StringBuffer("Happy Birthday"); strBuf.insert(5, " New Year,"); System.out.println(strBuf.toString()); // Happy New Year, Birthday ``` 这里说明了怎样把 “New Year,” 放置到原字符串中间的位置上[^6]。 #### 删除子串 (`delete`) 当要移除某一段连续区域内的字符时,可以选择 `delete(startIndex,endIndex)` 函数实现这一目标。 ```java StringBuffer sbuf = new StringBuffer("0123456789"); sbuf.delete(3, 6); System.out.println(sbuf); // 结果为:0123789 ``` 上述例子清楚地表明从索引 3 到索引 5 被成功去除了[^7]。 #### 替换子串 (`replace`) 为了替换成另外一组字符集合,应该采用 `replace(indexStart,indexEnd,String)` 方式完成更新过程。 ```java StringBuffer sampleStrBuff = new StringBuffer("abcdefg"); sampleStrBuff.replace(2, 5, "XYZ"); System.out.println(sampleStrBuff); // abcXYZfg ``` 这段程序解释了如何将原始字符串中的某些字母更换成了其他符号[^8]。 #### 反转顺序 (`reverse`) 最后介绍一种非常实用的功能——翻转整个字符串的方向布局。 ```java StringBuffer reverseExample = new StringBuilder("hello world").reverse(); System.out.println(reverseExample); // dlrow olleh ``` 注意这里是用了 `StringBuilder`, 因为它也支持同样的功能而且性能更优如果没有考虑线程安全性的话[^9]. ### 性能考量 尽管 `StringBuffer` 非常强大提供了丰富的 API 接口,但由于其内部实现了同步机制,在单线程环境下可能不如它的兄弟 `StringBuilder` 效率高。所以在开发过程中需权衡两者之间的差异再做决定[^10]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值