现在的位置: 首页 > 综合 > 正文

Java学习札记14:一个比较String、StringBuffer和StringBuilder之间效率差别的简单例子

2018年04月04日 ⁄ 综合 ⁄ 共 1784字 ⁄ 字号 评论关闭

String:定长的字符串,它的内容是不可以改变的,正因为如此,编译器可以让字符串共享。


StringBuffer:可变长的字符串缓冲区,多线程操作是安全的,并且在字符串连接操作上提供了性能和效率都优于 String类 的 "+" 的 append() 方法。因此,如果需要大量的频繁的进行字符连接操作时,优先采用StringBuffer 的 append() 方法。如果只是简单的字符串连接可以采用 String 的 "+" 来提高代码的可读性。


StringBuilder:是 StringBuffer 的一个等价类,区别在于 StringBuilder 是非线程安全的,但正因为如此少了很多同步的操作,在效率上要高于 StringBuffer,因此如果不涉及多线程操作,可以优先考虑StringBuilder 来提高方法的执行效率。

代码示例:

public class StringTest {

	/**
	* main method
	*
	* @param args
	*/
	public static void main(String[] args) {
		String s = "test";
		String str = "";
		long str_start = System.currentTimeMillis();
		for (int i = 0; i < 100000; i++) {
			str += s;
		}
		long str_end = System.currentTimeMillis();
		System.out.println("String need time is : " + (str_end - str_start));

		StringBuffer s_buffer = new StringBuffer("");
		long buf_start = System.currentTimeMillis();
		for (int i = 0; i < 100000; i++) {
			s_buffer.append(s);
		}
		long buf_end = System.currentTimeMillis();
		System.out.println("StringBuffer need time is :" + (buf_end - buf_start));

		StringBuilder s_builder = new StringBuilder("");
		long bui_start = System.currentTimeMillis();
		for (int i = 0; i < 100000; i++) {
			s_builder.append(s);
		}
		long bui_end = System.currentTimeMillis();
		System.out.println("StringBuilder need time is : " + (bui_end - bui_start));
	}
}

运行结果如下:

String need time is : 129765
StringBuffer need time is :10
StringBuilder need time is : 3

String、StringBuffer 和 StringBuider 虽都属于字符串类型,但是在使用的时候不能混用,需要根据实际情况选择合适的字符串类型。


String 中 "+" 实现字符串连接分析:

示例代码:

public class PlusTest {

	public static void main(String[] args) {
		String a = "a";
		String b = "b";
		String c = a + b;
		String d = c + 1;
	}

}

将上述代码编译后再反编译,得到的代码:

public class PlusTest {

	public PlusTest() {
	}

	public static void main(String args[]) {
		String a = "a";
		String b = "b";
		String c = (new StringBuilder(String.valueOf(a))).append(b).toString();
		String d = (new StringBuilder(String.valueOf(c))).append(1).toString();
	}

}

通过反编译的结果可以看出,"+" 实现字符串连接的过程中,实际上是借助了 StringBuilder 类的 append()方法,每拼接一次都要实例化一个 StringBuilder 对象,效率低是必然的。


转载自:

http://moyunyu.iteye.com/blog/1455239




抱歉!评论已关闭.