StringBuffer和StringBuilder

StringBuffer和StringBuilder

文章资料参考:runoob
因为String本身是不可更改的。当你进行以下操作时:

String a = "我爱中国";
	  int code = a.hashCode();
	  a = "我深爱中国";
	  int code2 = a.hashCode();
	  System.out.println(code);//776638640
	  System.out.println(code2);//-1717605791
	  System.out.println(code==code2);//false

code和code2的hashcode完全不同,表示这两个字符串是不同的引用,所以对字符串a进行再次赋值时,内存会重新创建一个新的字符串,让a重新指向内存中这个新的字符串。
StringBuffer和StringBuilder正是弥补了String不能修改内容的这一缺点。和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
Stringbuffer和stringbuilder的继承关系
上图是Stringbuffer和stringbuilder的继承关系。

StringBuffer

Stringbuffer是一个可变的字符序列。 字符串缓冲区类似于String ,但可以进行修改。 在任何时间点它都包含一些特定的字符序列,但序列的长度和内容可以通过某些方法调用来改变。
字符串缓冲区可供多个线程使用。 这些方法在必要时进行同步,以便任何特定实例上的所有操作都表现得好像它们以某个串行顺序出现,这与所涉及的每个单独线程所进行的方法调用的顺序一致。
StringBuffer上的主要操作是append和insert方法,它们被重载以接受任何类型的数据。 每个都有效地将给定的数据转换为字符串,然后将该字符串的字符追加或插入字符串缓冲区。 append方法总是在缓冲区的末尾添加这些字符; insert方法在指定点添加字符。
一般情况下,如果某人是指的一个实例StringBuffer ,然后sb.append(x)具有相同的效果sb.insert(sb.length(), x) 。
从JDK 5版本开始,这个类已经补充了一个设计用于单个线程的等效类, StringBuilder 。 通常应优先使用StringBuilder类,因为它支持所有相同的操作,但速度更快,因为它不执行同步。

创建StringBuffer对象
//默认的初始长度为16个字符长度。
StringBuffer s1 = new StringBuffer();
//显示定义长度为15个字符长度
StringBuffer s2 = new StringBuffer(15);
//长度为str.length() + 16
StringBuffer s3 = new StringBuffer("str");
//追加字符串
s1.append("china");
Stringbuffer中的常见方法
public StringBuffer append(String s)

作用:在StringBuffer的后面追加字符串
举例:

StringBuffer s1 = new StringBuffer();
String s = "china";
s1.append(s);
System.out.println(s1);//china
public StringBuffer reverse()

作用:将该字符序列顺序反转
举例:

 StringBuffer s1 = new StringBuffer();
 String s = "china";
 s1.append(s);
 s1.reverse();
 System.out.println(s1);//anihc
public delete(int start, int end)

作用:删除指定区间的子序列
举例:

StringBuffer s1 = new StringBuffer("123456789");
s1.delete(3,4);
System.out.println(s1);//12356789

【知识扩展】:

//AbstractStringBuilder.java中的源码
public AbstractStringBuilder delete(int start, int end) {
        if (start < 0)
            throw new StringIndexOutOfBoundsException(start);
        if (end > count)
            end = count;
        if (start > end)
            throw new StringIndexOutOfBoundsException();
        int len = end - start;
        if (len > 0) {
            System.arraycopy(value, start+len, value, start, count-end);
            count -= len;
        }
        return this;
    }

从源码中可以看出,当start小于0或者start>end时,会产生StringIndexOutOfBoundsException异常。而end值如果超出了这个序列的容量,那么它会自动帮你修改为这个序列的最大长度count。条件中的len如果等于0,即start等于end那么删除就不会执行,原来的字符序列也不会进行改变。

public insert(int offset, int i)

作用:将int参数的字符串形式插入到指定位置后面。
举例:

StringBuffer s1 = new StringBuffer("地球");
s1.insert(1, 100);
System.out.println(s1);//地100球
insert(int offset, String str)

作用:将指定字符串插入到指定位置后面。
举例:

StringBuffer s1 = new StringBuffer("地球");
s1.insert(1, "上的篮");
System.out.println(s1);//地上的篮球
replace(int start, int end, String str)

作用:替换指定位置的子字符串

StringBuffer s1 = new StringBuffer("123456789");
s1.replace(1, 3, "世界");
System.out.println(s1);//1世界456789

其他方法:StringBuffer类API

Stringbuilder

StringBuilder的构造方法和常用方法与StringBuffer大同小异,因此在这里就不列举了,具体查看:StringBuilder类API

StringBuffer和StringBuilder的区别

Stringbuffer的线程安全,可变的字符序列。 字符串缓冲区类似于String ,但可以进行修改。 字符串缓冲区可供多个线程使用。 这些方法在必要时进行同步,以便任何特定实例上的所有操作都表现得好像它们以某个串行顺序出现,这与所涉及的每个单独线程所进行的方法调用的顺序一致。
StringBuilder类,它支持与Stringbuffer所有相同的操作,但速度更快,因为它不执行同步。

### 回答1: StringBufferStringBuilderJava 中的字符串操作类。它们都是可变的字符序列,可用于在运行时构造字符串。 两者的主要区别在于线程安全性。StringBuffer 是线程安全的,它的每个方法都是同步的,因此可以在多线程环境中使用。StringBuilder 是非线程安全的,它的方法不是同步的,因此不能在多线程环境中使用。 因此,如果不需要线程安全,建议使用 StringBuilder,因为它比 StringBuffer 更快。如果需要线程安全,则使用 StringBuffer。 ### 回答2: StringBufferStringBuilderJava中的两个字符串操作类,它们都可以用来处理可变的字符串。 StringBuffer是一个线程安全的类,适用于多线程环境下。它提供了多个方法来操作字符串,如添加、插入、删除、替换等。StringBuffer对象是可变的,可以在原有字符串的基础上进行修改,而不会创建新的对象。这使得在频繁修改字符串的情况下,StringBufferString更高效。 StringBuffer使用同步机制来保证线程安全,因此在多线程环境中频繁地操作字符串时,建议使用StringBufferStringBuilder也是一个可变的字符串类,与StringBuffer类似,它也提供了多个方法来操作字符串。然而,StringBuilder不是线程安全的,因此在单线程环境下使用效果更好。相比于StringBufferStringBuilder的操作速度更快,因为它不需要进行同步控制。 一般来说,在单线程环境下,如果需要频繁地进行字符串拼接、替换等操作,建议使用StringBuilder;而在多线程环境下,或者需要保证线程安全性时,应使用StringBuffer。 总之,StringBufferStringBuilder在处理可变字符串时都非常有效。具体使用哪个类可以根据实际情况来选择,考虑到线程安全和性能方面的需求。 ### 回答3: StringBufferStringBuilder都是Java中用于处理可变字符串的类。它们的主要区别在于线程安全性和性能。 StringBuffer是一个线程安全的类,它的所有公共方法都被synchronized修饰,因此多个线程可以同时访问一个StringBuffer对象而不会出现问题。这使得StringBuffer适用于在多线程环境中进行字符串操作的场景。然而,由于同步的代价是一定的,所以StringBuffer的性能相对较低。 StringBuilder是一个非线程安全的类,它的方法没有被synchronized修饰,因此在多线程环境中使用StringBuilder可能会出现不可预期的结果。但是,由于没有同步的开销,StringBuilder的性能比StringBuffer高很多。 因此,如果在单线程环境中进行字符串操作,推荐使用StringBuilder,因为它的性能更好。但是在多线程环境中进行字符串操作时,为了保证数据的一致性,应该使用StringBuffer。 需要注意的是,无论是StringBuffer还是StringBuilder,它们都继承自AbstractStringBuilder,并且都有append、insert、delete等方法,可以方便地对字符串进行修改。另外,它们还都重写了toString方法,可以将字符串对象转化为String类型的字符串。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值