JAVA String StringBuffer StringBuilder 区别

本文通过实验对比了Java中String、StringBuilder与StringBuffer在拼接字符串时的性能表现,并解析了String的“==”与equals方法的区别。

StringBuffer是线程安全的,在源码中可以见到synchronized关键字,效率低
这里写图片描述
效率比较
伪代码

public static void testRunTime() {
            String str = new String();
            StringBuffer sb1 = new StringBuffer();
            StringBuilder sb2 = new StringBuilder();
            long startTime = System.nanoTime();
            for (int i = 0; i < 100000; i++) {
                str = str + i;
            }
            long endTime = System.nanoTime();
            System.out.println("Stirng消耗的时间为:" + (endTime - startTime));

            startTime = System.nanoTime();
            for (int i = 0; i < 100000; i++) {
                sb2.append(i);
            }
            endTime = System.nanoTime();
            System.out.println("StirngBuilder消耗的时间为:" + (endTime - startTime));

            startTime = System.nanoTime();
            for (int i = 0; i < 100000; i++) {
                sb1.append(i);
            }
            endTime = System.nanoTime();
            System.out.println("StirngBuffer消耗的时间为:" + (endTime - startTime));
        }

使用纳秒比较
结果
Stirng消耗的时间为:20787105769
StirngBuilder消耗的时间为:3617151
StirngBuffer消耗的时间为:5312005

String的”==”与 .equals
String重写了equals方法
这里写图片描述
所以”==”比较的是内存中的地址,equals比较的是内容
伪代码

String str1 = "a";
        String s1 = "a";
        String str2 = "b";
        String str = str1 + str2;
        String str3 = "ab";
        String str4 = "a" + str2;
        String str5 = new String("ab");
        StringBuffer str6 = new StringBuffer("a");
        StringBuffer str7 = str6.append("b");
        StringBuffer str8 = new StringBuffer("ab");

        System.out.println(str1 + str2 == str3);//三个不同的内存地址                                                     
        System.out.println(str == str3);// str3在编译期间就可以确定,str由变量组成
        System.out.println(str1 == s1);// 这行代码被执行的时候,JAVA虚拟机首先在字符串池中查找是否已经存在了值为"a"的这么一个对象,它的判断依据是String类equals(Object
                                        // obj)方法的返回值。如果有,则不再创建新的对象,直接返回已存在对象的引用;如果没有,则先创建这个对象,然后把它加入到字符串池中,再将它的引用返回。
        System.out.println(str3 == str4);// 同第二个解释
        System.out.println(str5.toString() == str3);// str5在堆中开辟空间,栈中保存引用,str3在字符串常量池中,两者内存地址不同
        System.out.println(str5.toString() == str7.toString());// 两个不同的对象,内存地址不同
        System.out.println(str8.toString() == str7.toString());// 两个不同的对象,内存地址不同

结果
false
false
true
false
false
false
false

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值