String类,以及和StringBuilder、StringBuffer的区别

本文深入探讨了Java中String、StringBuffer及StringBuilder的区别与联系,并通过实例解析了不同场景下字符串对象的行为表现及其内存分配方式。此外,还对比了在字符串拼接过程中不同方法的性能差异。

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对象

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值