StringBuffer类
在 Java中,除了通过 String 类创建和处理字符串还可以使用 StringBuffer 类来处理字符串。StringBuffer 类可以比 String 类更高效地处理字符串。
StringBuffer 类是可变字符串类,创建 StringBuffer 类的对象后可以随意修改字符串的内容。每个 StringBuffer 类的对象都能够存储指定容量的字符串,如果字符串的长度超过了 StringBuffer的容量,则该对象的容量会自动扩大。
为了解决String字符串操作导致的内存冗余,提高效率,Java中提供了StringBuffer和StringBuilder来操作字符串,并且提供了很多方法,便于程序员开发。
StringBuffer和StringBuilder中都有char类型可变长数组作为字符串的保存空间。使用到的方法类型和ArrayList类似。
创建StrngBuffer类的对象(构造方法)
StringBuffer() 构造一个空的字符串缓冲区,并且初始化为 16 个字符的容量。
StringBuffer str1 = new StringBuffer();
StringBuffer(int length) 创建一个空的字符串缓冲区,并且初始化为指定长度 length 的容量。
StringBuffer str2 = new String Buffer(12);
StringBuffer(String str) 创建一个字符串缓冲区,并将其内容初始化为指定的字符串内容 str,字符串缓冲区的初始容量为 16 加上字符串 str 的长度。
StringBuffer str3 = new StringBuffer("我叫妍妍的琪");
StringBuffer中方法的使用
StringBuffer中提供添加,插入,设定指定位置字符以及长度的方法
StringBuffer的主要StringBuffer
是append
和insert
方法,它们被重载以便接受任何类型的数据。 每个都有效地将给定的数据转换为字符串,然后将该字符串的字符附加或插入到字符串缓冲区。 append
方法总是在缓冲区的末尾添加这些字符; insert
方法将insert
添加到指定点。
返回值 | 方法 | 作用 |
---|---|---|
StringBuffer | append(boolean b) | 将 boolean 参数的字符串表示附加到序列中。 |
StringBuffer | append(char c) | 将 char 参数的字符串表示附加到此序列。 |
StringBuffer | append(char[] str) | 将 char 数组参数的字符串表示附加到此序列。 |
StringBuffer | append(char[] str, int offset, int len) | 将 char 数组参数的子阵列的字符串表示附加到此序列。 |
StringBuffer | append(CharSequence s) | 追加指定的 CharSequence 到这个序列。 |
StringBuffer | append(String str) | 将指定的字符串附加到此字符序列。 |
StringBuffer | append(StringBuffer sb) | 将指定 StringBuffer 这个序列。 |
StringBuffer | insert(int offset, boolean b) | 在此序列中插入 boolean 参数的字符串表示形式。 |
StringBuffer | insert(int offset, char c) | 在此序列中插入 char 参数的字符串表示形式。 |
StringBuffer | insert(int index, char[] str, int offset, int len) | 在此序列中插入 str 数组参数的子阵列的字符串表示形式。 |
StringBuffer | insert(int offset, String str) | 将字符串插入到此字符序列中。 |
。。。 | 。。。 | 。。。 |
void | setCharAt(int index, char ch) | 指定索引处的字符设置为 ch 。 |
void | setLength(int newLength) | 设置字符序列的长度。 |
案例:
StringBuffer sb=new StringBuffer();
sb.append("hello");
sb.append(1);
sb.append(1.2);
sb.append(true);
System.out.println(sb);
sb.append("hello").append(1).append(1.2).append(true);
System.out.println(sb);
sb.insert(5, 22222);
System.out.println(sb);
StringBuffer中的方法获取容量,字符串长度,字符在字符串中出现的位置功能的方法
返回值 | 方法 | 作用 |
---|---|---|
int | capacity() | 返回当前容量。 |
int | length() | 返回长度(字符数)。 |
char | charAt(int index) | 返回 char 在指定索引在这个序列值。 |
int | codePointAt(int index) | 返回指定索引处的字符(Unicode代码点)。 |
int | codePointBefore(int index) | 返回指定索引之前的字符(Unicode代码点)。 |
int | codePointCount(int beginIndex, int endIndex) | 返回此序列指定文本范围内的Unicode代码点数。 |
int | indexOf(String str) | 返回指定子字符串第一次出现的字符串内的索引。 |
int | indexOf(String str, int fromIndex) | 返回指定子串的第一次出现的字符串中的索引,从指定的索引开始。 |
int | lastIndexOf(String str) | 返回指定子字符串最右边出现的字符串内的索引。 |
int | lastIndexOf(String str, int fromIndex) | 返回指定子字符串最后一次出现的字符串中的索引。 |
int | offsetByCodePoints(int index, int codePointOffset) | 返回此序列中与 index ( codePointOffset 代码点偏移的索引。 |
StringBuffer中的方法删除,与复制功能的方法
返回值 | 方法 | 作用 |
---|---|---|
StringBuffer | delete(int start, int end) | 删除此序列的子字符串中的字符。 |
StringBuffer | deleteCharAt(int index) | 删除 char 在这个序列中的指定位置。 |
void | getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) | 字符从该序列复制到目标字符数组 dst 。 |
案例:
StringBuffer sb= new StringBuffer();
sb.append("hello").append("world").append("java");
System.out.println(sb);
//helloworldjava
sb.delete(0, 5);
System.out.println(sb);
//worldjava
sb.deleteCharAt(0);
System.out.println(sb);
//orldjava
sb.delete(0, sb.length());
sb
System.out.println("sb"+sb);
StringBuffer中的方法替换,倒序功能的方法
返回值 | 方法 | 作用 |
---|---|---|
StringBuffer | replace(int start, int end, String str) | 用指定的String中的字符替换此序列的子字符串中的 String 。 |
StringBuffer | reverse() | 导致该字符序列被序列的相反代替。 |
案例:
StringBuffer sb=new StringBuffer();
sb.append("hello").append("world").append("java");
sb.replace( 0, 5, "啦啦啦");
System.out.println(sb);//啦啦啦worldjava
StringBuffer sb=new StringBuffer();
sb.append("hello");
sb.reverse();
System.out.println(sb);//olleh
StringBuffer中的方法截取,返回该字符串功能的方法
返回值 | 方法 | 作用 |
---|---|---|
CharSequence | subSequence(int start, int end) | 返回一个新的字符序列,该序列是该序列的子序列。 |
String | substring(int start) | 返回一个新的 String ,其中包含此字符序列中当前包含的字符的子序列。 |
String | substring(int start, int end) | 返回一个新的 String ,其中包含此序列中当前包含的字符的子序列。 |
String | toString() | 返回表示此顺序中的数据的字符串。 |
案例:
StringBuffer sb =new StringBuffer();
sb.append("hello").append("world").append("java");
String s=sb.substring(5);
System.out.println(s);//worldjava
String ss=sb.substring(5, 10);
System.out.println(ss);//world
StringBuilder类
StringBuilder 对字符串的操作是直接改变字符串对象本身,而不是生成新的对象,所以新能开销小。
与StringBuffer相比StringBuilder的性能略高(15%~30%),StringBuffer为保证多线程情况下的安全性(synchronize加锁)而牺牲了性能,以时间来换取安全。而StringBuilder则没有保证线程的安全,从而性能略高于StringBuffer。
频繁使用字符串拼接的时候可以用StringBuilder(推荐)或者StringBuffer。
面试题: String,StringBuffer,StringBuilder的区别?
String 字符串常量,不可变,使用字符串拼接时是不同的 2 个空间
StringBuffer 字符串变量,可变,线程安全,字符串拼接直接在字符串后追加
StringBuilder 字符串变量,可变,非线程安全字符串拼接直接在字符串后追加
1.StringBuilder 执行效率高于 StringBuffer 高于 String.
2.String 是一个常量,是不可变的,所以对于每一次+=赋值都会创建一个新的对象,
StringBuffer 和 StringBuilder 都是可变的,当进行字符串拼接时采用 append 方法,在原来的
基础上进行追加,所以性能比 String 要高,又因为 StringBuffer 是线程安全的而 StringBuilder
是线程非安全的,所以 StringBuilder 的效率高于 StringBuffer.
3.对于大数据量的字符串的拼接,采用 StringBuffer,StringBuilder.