可变字符串
StringBuffer和StringBuilder类
由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,多线程的情况下,则必须使用 StringBuffer 类【StringBuilder 和 StringBuffer 用法基本一致】。
总结:
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
说简单点就是可灵活操作的字符串
StringBuffer和String的区别
String只能赋值一次,每次内容发生改变都生成了一个新的对象,然后原有的对象引用新的对象,所以说String本身是不可改变。每次改变String的字符串内容,都会在内存创建新的对象,而每一次生成新的对象都会对系统性能产生影响,这会降低Java虚拟机的工作效率。
改变变量前:
String str = "abc";
|堆:new String()| → |栈:abc|
修改变量后
String str = "abc";
String str = "abcde";
|堆:new String()| → |栈:abc|
|堆:new String()| → |栈:abcde|
只有整个函数运行完内存才会被释放(栈中的值会清除)
而StringBuffer不同,每次都是操作自身对象,而不是生成新的对象,其所占的空间会随着内容的增加而扩充,做大量的修改时,不会因产生大量匿名对象(new Xxx())而影响系统性能。
改变变量前:
StringBuffer str = new StringBuffer("abc");
|堆:new StringBuffer()| → |栈:abc|
修改变量后
StringBuffer str = new StringBuffer("abc");
str.append("de"); //向str中添加元素
|堆:new StringBuffer()| → |栈:abcde|
StringBuffer和StringBuilder使用
StringBuilder和 StringBuffer用法基本一致
使用append在末尾追加元素
sbf.append(str);
示例代码:
public class test {
public static void main(String[] args) {
StringBuffer sBuffer = new StringBuffer("这里面可添加值:"); // 创建sBuffer的对象
sBuffer.append("one,");
sBuffer.append("two,");
sBuffer.append("three");
// 链式编程(也可以下面这样写)
// sBuffer.append("one,").append("two,").append("three");
System.out.println("第一次输出:" + sBuffer);
StringBuffer bf = new StringBuffer(",这是新的StringBuffer");
sBuffer.append(bf);
System.out.println("第二次输出:" + sBuffer);
}
}
eclipse执行结果:
第一次输出:这里面可添加值:one,two,three
第二次输出:这里面可添加值:one,two,three,这是新的StringBuffer
使用setCharAt修改指定索引值
sbf.setCharAt(index, str);
示例代码:
public class test {
/**
* 将StringBuffer中后3位替换为x
* */
public static void main(String[] args) {
StringBuffer sbf = new StringBuffer("18312345678");
for (int i=8;i
sbf.setCharAt(i, 'x');
}
System.out.println(sbf);
}
}
eclipse执行结果:
18312345xxx
使用insert向指定索引插入值
sbf.insert(index,str)
示例代码:
public class test {
/**
* 在StringBuffer中索引为8的后面插入值
* */
public static void main(String[] args) {
StringBuffer sbf = new StringBuffer("18312345678");
sbf.insert(8, "我要插队");
System.out.println(sbf);
}
}
eclipse执行结果:
18312345我要插队678
使用delete删除指定索引值
sbf.delete(start,end)
示例代码:
public class test {
/**
* 将StringBuffer中索引0-5的元素删除
* */
public static void main(String[] args) {
StringBuffer sbf = new StringBuffer("12345上山打老虎");
sbf.delete(0, 5); //0-5但不包含下标为5的元素
System.out.println(sbf);
}
}
eclipse执行结果:
上山打老虎
使用reverse翻转字符串
public class Demo {
public static void main(String[] args) {
StringBuffer sBuffer = new StringBuffer("abcd");
sBuffer.reverse();
System.out.println("字符串翻转后的值:" + sBuffer);
}
}
eclipse执行结果:
字符串翻转后的值:dcba
StringBuilder和String相互转换
/*
* StringBuilder和String的相互转换
*
* StringBuilder -- String
* public String toString():通过toString()就可以实现把StringBuilder转成String
*
* String -- StringBuilder
* StringBuilder(String str):通过构造方法就可以实现把String转成StringBuilder
*/
public class StringBuilderTest {
public static void main(String[] args) {
//StringBuilder --> String
StringBuilder sb = new StringBuilder();
sb.append("hello").append("world");
String s = sb.toString();
System.out.println(s);
//String --> StringBuilder
String s = "helloworld";
StringBuilder sb = new StringBuilder(s);
System.out.println(sb);
}
}