StringStringBuilder和StringBuffer
Posted lxy522
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了StringStringBuilder和StringBuffer相关的知识,希望对你有一定的参考价值。
-
String
类代表字符串。Java程序中的所有字符串文字(例如"abc"
)都被实现为此类的实例。字符串不变; 它们的值在创建后不能被更改。 字符串缓冲区支持可变字符串。 因为String对象是不可变的,它们可以被共享。 例如:
String str = "abc";
相当于:
char data[] = {‘a‘, ‘b‘, ‘c‘}; String str = new String(data);
StringBuilder
-
一个可变的字符序列。此类提供与
StringBuffer
的API,但不保证同步。此类设计用作简易替换为StringBuffer
在正在使用由单个线程字符串缓冲区的地方(如通常是这种情况)。在可能的情况下,建议使用这个类别优先于StringBuffer
,因为它在大多数实现中将更快。StringBuilder的主要
StringBuilder
是append
和insert
方法,它们是重载的,以便接受任何类型的数据。 每个都有效地将给定的数据转换为字符串,然后将该字符串的字符附加或插入字符串构建器。append
方法始终在构建器的末尾添加这些字符;insert
方法将insert
添加到指定点。例如,如果
z
引用当前内容为“start
”的字符串构建器对象,那么方法调用z.append("le")
将导致字符串构建器包含“startle
”,而z.insert(4, "le")
会将字符串构建器更改为包含“starlet
”。一般情况下,如果某人是指的一个实例
StringBuilder
,则sb.append(x)
具有相同的效果sb.insert(sb.length(), x)
。每个字符串构建器都有一个容量。 只要字符串构建器中包含的字符序列的长度不超过容量,则不需要分配新的内部缓冲区。 如果内部缓冲区溢出,则会自动变大。
StringBuilder的
StringBuilder
不能安全使用多线程。 如果需要同步, 那么建议使用StringBuffer
。除非另有说明,否则将
null
参数传递给null
中的构造函数或方法将导致抛出NullPointerException
。//空参构造
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("lixy");
System.out.println(stringBuilder);
//有参构造
StringBuilder builder = new StringBuilder("haha");
builder.append("lixy");
System.out.println(builder);
//反转内容
builder.reverse();
System.out.println(builder);
//toString
builder.append(22).append(‘a‘).append(true).append("中国");
String string = builder.toString();
System.out.println(string); -
结果:
lixy
hahalixy
yxilahah
yxilahah22atrue中国
StringBuffer
-
线程安全,可变的字符序列。字符串缓冲区就像一个
String
,但可以修改。在任何时间点,它包含一些特定的字符序列,但可以通过某些方法调用来更改序列的长度和内容。字符串缓冲区可以安全地被多个线程使用。 这些方法在必要时进行同步,以便任何特定实例上的所有操作都按照与所涉及的各个线程所执行的方法调用顺序一致的顺序发生。
StringBuffer的主要
StringBuffer
是append
和insert
方法,它们被重载以便接受任何类型的数据。 每个都有效地将给定的数据转换为字符串,然后将该字符串的字符附加或插入到字符串缓冲区。append
方法总是在缓冲区的末尾添加这些字符;insert
方法将insert
添加到指定点。 -
例如,如果
z
是指当前内容为"start"
的字符串缓冲区对象,那么方法调用z.append("le")
将使字符串缓冲区包含"startle"
,而z.insert(4, "le")
会将字符串缓冲区更改为包含"starlet"
。一般情况下,如果某人是指的一个实例
StringBuffer
,则sb.append(x)
具有相同的效果sb.insert(sb.length(), x)
。每当涉及源序列(例如从源序列追加或插入)的操作发生时,该类仅在执行操作的字符串缓冲器上进行同步,而不在源上。 请注意,虽然
StringBuffer
被设计为可以安全地从多个线程并发使用,但如果构造函数或append
或insert
操作被传递通过线程共享的源序列,则调用代码必须确保该操作具有一致且不变的视图在操作期间的源序列。 呼叫者通过使用不可变的源序列,或者不跨线程共享源序列,可以在呼叫期间持有锁来满足这一点。每个字符串缓冲区都有一个容量。 只要字符串缓冲区中包含的字符序列的长度不超过容量,就不必分配新的内部缓冲区数组。 如果内部缓冲区溢出,则会自动变大。
除非另有说明,否则将
null
参数传递给null
中的构造函数或方法将导致抛出NullPointerException
。
以上是关于StringStringBuilder和StringBuffer的主要内容,如果未能解决你的问题,请参考以下文章
StringStringBuilder和StringBuffer类
java中StringStringBuilder和StringBuffer理解
StringStringbuilder和StringBuffer常用方法
理解StringStringBuilder和StringBuffer