Java中的可变字符串

可变字符串

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使用

StringBuilderStringBuffer用法基本一致

使用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.length();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);
	}
}
posted @ 2019-08-02 12:33  每一天,为明天。  阅读(604)  评论(0)    收藏  举报