首先,说一下这三者之间常见的问题
1. String和new String的区别
2. String和StringBuffer的转换
3. String StringBuffer StringBuilder的区别
4. ==和equal的区别、
针对这四个问题,我们进行 一 一 分析
1. String str1 =“ABC" 和 String str2 = new String("ABC")的区别
对于字符串:其对象是存储在栈中的""定义的存储在常量池中 new 确定存储在堆中
相等的字符串在常量池中只有一份,在堆中有多份(String str在栈中 “ABC"在常量池中 new String() 在堆中)
String str1="ABC"可能创建一个对象或者不创建对象,
如果"ABC"这个字符串在java String池里不存在,会在java String池创建这个一个String对象("ABC")如果已经存在,str1直接reference to 这个String池里的对象。
String str2 = new String("ABC")至少创建一个对象,也可能两个。
因为用到new关键字,会在heap(堆)创建一个 str2 的String 对象,它的value 是 "ABC".同时,如果"ABC"这个字符串在java String池里不存在,会在java String池创建这个一个String对象("ABC").
String str1 = new String(“abc”) str1 != str2 (== 与equals的区别)
String str2 = new String("abc")
String str3 = "ABC" str3 = str4
String str4 = "ABC" str3 = str4 = str5
String str5 = "A"+"BC";
2. String和StringBuffer的转换
2.1 String转StringBuffer:
StringBuffer sb = new StringBuffer(s); String s = new String("xxx");
2.2 StringBuffer转String:
String str = sb.toString();
3.String和StringBuffer StringBuilder的区别
1) 执行速度:StringBulider>StringBuffer>String
2) 变量(常量)线程安全
String
常量,不可变的
在进行字符串处理时,会产生新的String对象
添加字符串使用“+”
线程安全
StringBuffer
变量,可以修改内容
在进行字符串处理时,不会产生新的String对象
添加字符是使用append()
线程安全的(多线程程序中可以使用但执行效率缓慢)
StringBuilder
变量,可以修改内容
线程不安全的(单线程中的性能比StringBuffer高)
总结:
1.如果要操作少量的数据用 = String
2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer
4.==和equal的区别
==是一个运算符 equals则是string对象的方法
==比较的是引用类型 比较的是地址值是否相同
equals比较的是内容是否相同(堆中的内容是否相同)
扩展String的一种方式比StringBuffer快的多
e.g. String s = "you"+"are"+"better"这种方式比StringBuffer的append()快的多,这就被jvm解析成StringBuffer对象的拼接
String s = "you" String s2 = "are" String s3 = "better" String s4 = s+s2+s3这种方式比StringBuffer慢的多这样jvm就规规矩矩的拼接String字符串了