String:final类型,只读字符串,创建了就不会改变
StringBuffer:表示的字符串对象可以直接进行修改,线程安全,效率较低
StringBuilder:表示的字符串对象可以直接进行修改,是在单线程环境下使用的,不是线程安全的,效率比StringBuffer要高
题1:String对象的存储
请看这样两个语句:
String x = "abc";
String y = new String("abcd");
现在来分析一下内存的分配情况。如图:
可以看出,x与y存在栈中,它们保存了相应对象的引用。第一条语句没有在堆中分配内存,而是将“abc”保存在常量池中。对于第二条语句,同样会在常量池中有一个“abcd”的字符串,当new时,会拷贝一份该字符串存放到堆中,于是y指向了堆中的那个“abcd”字符串。
题2:
class StringEqualTest {
public static void main(String[] args) {
String s1 = "Programming";
String s2 = new String("Programming");
String s3 = "Program" + "ming";
String s4 = new String("ming");
String s5 = "Program" + s4;
System.out.println(s1 == s2);//false
System.out.println(s1 == s3);//true
System.out.println(s1 == s5);//false,当字符串字面值与String类型变量连接时,得到的新字符串不再保存在常量池中,而是在堆中新建一个String对象来存放。很明显常量池中要求的存放的是常量,有String类型变量当然不能存在常量池中了。
System.out.println(s1 == s1.intern());//true,String对象的intern方法会得到字符串对象在常量池中对应的版本的引用(如果常量池中有一个字符串与String对象的equals结果是true),如果常量池中没有对应的字符串,则该字符串将被添加到常量池中,然后返回常量池中字符串的引用。
}
}
题3:什么情况下用+运算符进行字符串连接比调用StringBuffer/StringBuilder对象的append方法连接字符串性能更好?
点击查看具体分析
总结:少量字符串拼接,三者的时间效率差不多;但如果有大量需要进行字符串拼接的操作,使用StringBuilder的效率明显高于使用“+”拼接字符串。使用“+”拼接字符串JVM会将其转换为StringBuilder,但是每“+”一次,就是多一个StringBuilder对象,但是使用StringBuilder拼接字符串,只会有一个StringBuilder对象
本文深入探讨了Java中String、StringBuffer及StringBuilder的区别与联系,并通过实例解析了不同场景下字符串对象的行为表现及其内存分配方式。此外,还对比了在字符串拼接过程中不同方法的性能差异。
3249

被折叠的 条评论
为什么被折叠?



