可变字符串
- String字符串对象是一个常量,在其定义之后值不可被改变。
- 如果在使用的过程中频繁的进行赋值,n次就要创建n个字符串对象。这样就会花费很多时间和内存空间,从而导致效率低。
- 这个时候就需要我们使用可变字符串类。
StringBuilder类
StringBuilder:用于表示可变字符串的一个类,是非线程安全的,建议在单线程环境下使用,效率略高于StringBuffer。
StringBuffer类
StringBuffer:用于表示可变字符串的一个类,是线程安全的,建议在多线程环境下使用,效率略低于StringBuilder。
构造方法
构造方法 | 作用 |
---|---|
StringBuilder( ) | 默认创建一个大小为16的字符数组 |
StringBuilder(int num) | 创建一个指定大小的字符数组 |
StringBuilder(String str) | 默认创建一个str长度+16的字符串数组后,将str添加到其中 |
常用方法
方法 | 作用 |
---|---|
append(Object obj) | 将指定内容添加到原可变字符串对象末尾 |
delete(int start,int end) | 删除[start,end)范围内的字符 |
deleteCharAt(int index) | 删除指定索引的字符 |
insert(int index,Object obj) | 将obj添加到index位置上 |
replace(int start,int end,String str) | 将[start,end)范围内的字符替换为str |
reverse() | 反转原字符串 |
注意事项:
- 以上方法都是直接操作原字符串,不管使用什么方法,原字符串都会发生改变。
- StringBuilder和StringBuffer中并没有重写equals方法,所以比较两个可变字符串对象的值是否相同的时候,需要将可变字符串对象转换成String对象后,在使用equals方法进行比较。
可变字符串与不可变字符之间的转换
- 有些方法如index()、charAt()等,在String和可变字符串StringBuilder和StringBuffer中都存在,可以不用转换。
- 但是有些方法:getBytes()、contains()、equals()等,只能通过String进行调用,所以需要进行转换后使用。
//创建一个不可变字符串对象
String str = "ABC";
//创建一个可变字符串对象,同时将不可变字符串对象作为参数
StringBuilder sb = new StringBuilder(str)
//这就是不可变字符串转换为可变字符串的过程
//创建一个可变字符串对象
StringBuffer sbf = new StringBuffer("DEF");
//调用toString()方法将可变字符串对象转换为String类型
String str = sbf.toString();
StringBuilder和StringBuffer的线性安全
- StringBuilder是非线程安全的
- StringBuffer是线程安全的,因为其中方法使用synchronized修饰为同步方法,所以在多线程的情景下,使用StringBuffer。
以上就是总结的StringBuilder和StringBuffer的相关知识点,如有不足望指出。