moc 发表于 2018-12-22 22:23:04

Java-015StringBuffer与StringBuider类

本帖最后由 moc 于 2018-12-22 22:22 编辑

1、StringBuffer简介
①String 的值是不可变的,每次对String的操作都会生成新的String对象,不仅效率低,而且耗费大量内存空间。
②StringBuffer类和String类一样,也用来表示字符串,但是StringBuffer的内部实现方式和String不同,在进行字符串处理时,不生成新的对象,在内存使用上要优于String。
③StringBuffer 默认分配16字节长度的缓冲区,当字符串超过该大小时,会自动增加缓冲区长度,而不是生成新的对象。
④StringBuffer不像String,只能通过 new 来创建对象,不支持简写方式。
StringBuffer str1 = new StringBuffer();// 分配16个字节长度的缓冲区
StringBuffer str2 = =new StringBuffer(512);// 分配512个字节长度的缓冲区
// 在缓冲区中存放了字符串,并在后面预留了16个字节长度的空缓冲区
StringBuffer str3 = new StringBuffer("I love fish.com");2、StringBuffer方法
主要方法:

序号|原型|说明
1|public StringBuffer append(String s)|将指定的字符串追加到此字符序列。
2|public StringBuffer reverse()| 将此字符序列用其反转形式取代。
3|public delete(int start, int end)|移除此序列的子字符串中的字符。
4|public insert(int offset, int i)|将 int 参数的字符串表示形式插入此序列中。
5|public replace(int start, int end, String str)|使用给定 String 中的字符替换此序列的子字符串中的字符。与 String 类类似的方法:

序号|原型|说明
1|int capacity()|返回当前容量。
2|char charAt(int index)|返回此序列中指定索引处的 char 值。
3|void ensureCapacity(int minimumCapacity)|确保容量至少等于指定的最小值。
4|void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)|将字符从此序列复制到目标字符数组 dst。
5|int indexOf(String str)|返回第一次出现的指定子字符串在该字符串中的索引。
6|int indexOf(String str, int fromIndex)|从指定的索引处开始,返回第一次出现的指定子字符串在该字符串中的索引。
7|int lastIndexOf(String str)|返回最右边出现的指定子字符串在此字符串中的索引。
8|int lastIndexOf(String str, int fromIndex)|返回 String 对象中子字符串最后出现的位置。
9|int length()| 返回长度(字符数)。
10|void setCharAt(int index, char ch)|将给定索引处的字符设置为 ch。
11|void setLength(int newLength)|设置字符序列的长度。
12|CharSequence subSequence(int start, int end)|返回一个新的字符序列,该字符序列是此序列的子序列。
13|String substring(int start)|返回一个新的 String,它包含此字符序列当前所包含的字符子序列。
14|String substring(int start, int end)|返回一个新的 String,它包含此序列当前所包含的字符子序列。
15|String toString()|返回此序列中数据的字符串表示形式3、StringBuilder类
①StringBuilder类和StringBuffer类功能基本相似,方法也差不多,主要区别在于StringBuffer类的方法是多线程安全的,而StringBuilder不是线程安全的,相比而言,StringBuilder类会略微快一点。
②StringBuffer、StringBuilder、String中都实现了CharSequence接口。
③CharSequence是一个定义字符串操作的接口,它只包括length()、charAt(int index)、subSequence(int start, int end) 这几个API。

说明:
        ① stringbuffer 基本没有适用场景,你应该在所有的情况下选择使用 stringbuiler。
        ② 关于线程安全,即使你真的遇到了这样的场景,很不幸的是,恐怕你仍然有 99.99....99% 的情况下没有必要选择 stringbuffer,因为 stringbuffer 的线程安全,仅仅是保证 jvm 不抛出异常顺利的往下执行而已,它可不保证逻辑正确和调用顺序正确。大多数时候,我们需要的不仅仅是线程安全,而是锁。
        ③ javacjdk1.5 开始,把所有用加号连接的 string 运算都隐式的改写成 stringbuilder。

zwhe 发表于 2020-6-5 11:09:02

{:7_129:}
页: [1]
查看完整版本: Java-015StringBuffer与StringBuider类