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类对象内容不能修改,但并不代表其引用不能改变,下面通过内存的分配图说明字符串不可改变的真正含义:
堆内存里面开辟了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 */ }