StringBuffer

StringBuffer详解

  1.概述

StringBuffer类和String类一样,代表字符串,由于StringBuffer的内部实现方式和String不同,在进行字符串处理时,不生成新的对象,所以在内存使用上要优于String类。因此,在实际使用时,如果经常需要对一个字符串进行修改(插入、删除)等操作,使用StringBuffer要更加适合。StringBuffer类中存在很多和String类一样的方法,这些方法在功能上和String类中的功能是完全一样的,但是StringBuffer对象的每次修改都会改变对象自身,这点是和String类最大的区别。另外StringBuffer是线程安全的,所以在多线程程序中也可以很方便的进行使用,但是程序的执行效率相对来说就要稍微慢一些。

2.初始化

Java对StringBuffer对象的初始化提供了和String不同的语法,通常使用构造方法进行初始化。

错误的方式:

1 StringBuffer sb="jfl";    //不能将String类型的字符串赋给StringBuffer对象

正确的方式:

1 StringBuffer sb=new StringBuffer();
2 
3 StringBuffer sb=new StringBuffer("jfl");

3.类型转换

StringBuffer和String虽然都代表字符串,但是属于不同的类型,强制转换时需要注意以下几点:

错误的方式:

1 StringBuffer sb=(StringBuffer) "jfl";   //两者无父子关系,无法强转

正确的方式:

1 String s="jfl";
2 
3 StringBuffer sb=new StringBuffer("abc");
4 
5 String s1=sb.toString   //StringBu转为String
6 
7 StringBuffer sb1=new StringBuffer(s);   //String转为StringBuffer

4.方法

StringBuffer 上的主要操作是 appendinsert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而insert方法则在指定的点添加字符。

4.1 append(A a)

其中A指boolean,char,char[],double,float,int,long,String,Object,CharSequence等类型,append 方法始终将这些字符添加到缓冲区的末端.

1 StringBuffer sb=new StringBuffer("jfl");
2 
3 sb.append("123");         //结果变为"jfl123"

4.2 char charAt(int index)

返回此序列中指定索引处的 char 值,该序列的索引和数组相同,从0开始。

1 StringBuffer sb=new StringBuffer("jfl");
2 
3 System.out.println(sb.charAt(2));   //输出'f'

4.3 delete(int start, int end)

移除此序列的子字符串中的字符;其中,区间为[start,end)。

1 StringBuffer sb=new StringBuffer("Iamjfl");
2 
3 sb.delete(1,3);  
4 
5 System.out.println(sb);   //输出"Ijfl"

4.4 deleteCharAt(int index) 

移除此序列指定位置的char

1 StringBuffer sb=new StringBuffer("jfl");
2 
3 sb.delete(1); 
4 
5 System.out.println(sb);   //输出"jl"

4.5 int indexOf(String str, int fromIndex)

从指定的索引处开始,返回第一次出现的指定子字符串在该字符串中的索引。相对简单的有indexOf(String str),返回第一次出现的指定子字符串在该字符串中的索引。

1 StringBuffer sb=new StringBuffer("jfljfl");
2 
3 int i=sb.indexOf("f",2);
4 
5 System.out.println(i);   //输出4

4.6 insert(int offset, A a)

 其中A指boolean,char,char[],double,float,int,long,String,Object,CharSequence等类型 , 将 A 参数的字符串表示形式插入此序列中

1 StringBuffer sb=new StringBuffer("jfl");
2 
3 sb.insert(1,"123");
4 
5 System.out.println(sb);     //输出"j123fl"

 4.7  reverse()

将此字符序列用其反转形式取代

1 StringBuffer sb=new StringBuffer("jfl");
2 
3 System.out.println(sb.reverse());      //输出"lfj"

4.8 void setCharAt(int index, char ch)

将给定索引处的字符设置为 ch

1 StringBuffer sb=new StringBuffer("jfl");
2 
3 sb.setCharAt(1,'j');
4 
5 System.out.println(sb);    //输出"jjl"

4.9 String toString()

返回此序列中数据的字符串表示形式,即上述的强制转换,将StringBuffer转为String。

注:StringBuffer中还有许多方法没有列出,详情请查询api文件。

5.效率

通过以下测试可知,当字符串长度越长时,对StringBuffer类字符串的操作用时远比String 类型少。

public  class TestStringBuffer {   

    public static void main(String[] args){      

       String str = "abcde";      

       int count = 10000;

       // 通过String对像

       long timeStart1 = System.currentTimeMillis();

       String str1 = "";

       for (int i=0; i<count; i++) {

        str1 += str;

         }

         long timeEnd1 = System.currentTimeMillis();

        System.out.println("String: " + (timeEnd1 - timeStart1) + "ms");

        // 通过StringBuffer对象

        long timeStart2 = System.currentTimeMillis();

        StringBuffer str2 = new StringBuffer();

        for (int i=0; i<count; i++) {

        str2.append(str);

        }

        long timeEnd2 = System.currentTimeMillis();

       System.out.println("StringBuffer: " + (timeEnd2 - timeStart2) + "ms");

        }             

}  

6.StringBuilder类

StringBuilder类和StringBuffer类相类似,区别在于StringBuffer类是多线程安全的,而StringBuilder不是线程安全的。StringBuffer、StringBuilder、String中都实现了CharSequence接口。它们对CharSequence接口的实现方式如下图:

 

 

转载于:https://www.cnblogs.com/jfl-xx/p/4779409.html

### 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、付费专栏及课程。

余额充值