String&StringBuffer&StringBuilder区别 String

String&StringBuffer&StringBuilder区别
String

 String类是final类故不可以继承,也就意味着String引用的字符串内容是不能被修改。String有两种实例化方式
   (1)直接赋值(例中,String str = "Hello";就是直接赋值实例化了)
   (2)使用new调用构造方法完成实例化;
String str = "Hello";srt:只有一个对象
String str2 = new String("abc");St2:有2个对象

public class LianXi2 {
	public static void main(String[] args) {
		String str = "Hello";  //引用str指向对象"Hello"
		str = str + " World";  //引用str指向对象str + " World" (str + " World"是另外一个对象)
		System.out.println("str=" + str);
} }
 
     要注意的是:String类对象内容不能修改,但并不代表其引用不能改变,下面通过内存的分配图说明字符串不可改变的真正含义:
String&StringBuffer&StringBuilder区别
String
堆内存里面开辟了3个对象:"Hello"、"world!"和"hello world!"这个三个对象。str首先指向对象"Hello",经过拼接后,str指向对象"hello world!"。原来的内容并没有改变。
 因此,在以后的开发中,若要经常修改字符串的内容,请尽量少用String,因为字符串的指向“断开-连接”会大大降低性能;对于要经常修改内容的情况,建议使用:StringBuilder、StringBuffer。

stringbuffer:线程安全

stringbuilder:线程不安全(性能最高)

2个类的方法没什么区别

String&Stringbuffer&Stringbuilder性能测试

package cn.com.string;

/**
 * StringBuliderTest
 *
 * @描述:StringBulider性能演示
 */
public class StringBuliderTest {
	// 定义2个常量
	private static final String base = "abc";
	private static final int count = 2000000;

	/**
	 * 测试String性能方法
	 */
	public static void stringTest() {
		long begin, end;
		begin = System.currentTimeMillis(); // 开始时间
		String test = new String(base);
		for (int i = 0; i < count / 100; i++) {
			test = test + "add";
		}
		end = System.currentTimeMillis(); // 结束时间
		System.out.println("测试string所用时间:" + (end - begin));
	}

	/**
	 * 测试stringbuffer性能方法
	 */
	public static void stringbufferTest() {
		long begin, end;
		begin = System.currentTimeMillis(); // 开始时间
		StringBuffer test = new StringBuffer(base);
		for (int i = 0; i < count; i++) {
			test = test.append("add");
		}
		end = System.currentTimeMillis(); // 结束时间
		System.out.println("测试StringBuffer所用时间:" + (end - begin));
	}

	/**
	 * 测试stringbuilder性能方法
	 */
	public static void stringbuilderTest() {
		long begin, end;
		begin = System.currentTimeMillis(); // 开始时间
		StringBuilder test = new StringBuilder(base);
		for (int i = 0; i < count; i++) {
			test = test.append("add");
		}
		end = System.currentTimeMillis(); // 结束时间
		System.out.println("测试stringbuilder所用时间:" + (end - begin));
	}

	/**
	 * mai方法
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		stringTest();
		stringbufferTest();
		stringbuilderTest();
	}
	
	/**输出结果:
	 测试string所用时间:1114
	测试StringBuffer所用时间:140
	测试stringbuilder所用时间:63
	 */
}