字符串连接操作下的String和StringBuilder(一)

看第一种情形:用String做字符串连接操作  连接一万次

public class Demo_01 {
    public static void main(String[] args) {
        String str = "123";
        String[] temp = new String[10000];
        for (int i = 0; i < temp.length; i++) {
            temp[i] = "456";
        }

        long begin = System.nanoTime()/1000000L;
        System.out.println(begin);
        for (int i = 0; i < temp.length; i++) {
            str += temp[i];
        }
        long end = System.nanoTime()/1000000L;
        System.out.println(end);
        System.out.println("连接操作消耗的时间:"+(end-begin)+"毫秒");
    }
}

编译 执行

做同样的字符串连接 也是连接一万次 这次使用StringBuilder

public class Demo {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        sb.append("123");
        String[] temp = new String[10000];
        for (int i = 0; i < temp.length; i++) {
            temp[i] = "456";
        }
        long begin = System.nanoTime()/1000000L;
        System.out.println(begin);
        for (int i = 0; i < temp.length; i++) {
            sb.append(temp[i]);
        }
        long end = System.nanoTime()/1000000L;
        System.out.println(end);
        System.out.println("连接操作消耗的时间:"+(end-begin)+"毫秒");
    }
}

编译 执行

对比执行消耗的时间,String是479毫秒  StringBuilder是2毫秒 。(毫秒数仅作参考,不同Pc配置和OS环境因素下可能不同)

做同样的字符串连接操作 使用StringBuilder用时仅需使用String的1/240左右。

可见做大量字符串连接时用StringBuilder效率更高。

这学过Java的都知道啊,用你说。

可是为什么做大量字符串连接时 StringBuilder效率更高呢?

这是一个值得思考的问题。

嗯,我们先从编译器给我们反馈的信息看看。

对于用String进行连接,使用反汇编命令

得到如下信息

可以看到79 行 goto语句指向47行 这之间是循环体。

嗯?我明明是用的String啊,但是事实上是编译器擅作主张用了StringBuilder做连接操作。(StringBuilder效率高)

注意到54行 每次循环都会创建新的StringBuilder对象。

再看使用StringBuilder进行操作的情况:

反馈的信息

注意看78行的goto语句 指向59行  这之间也是循环体。

但是这次循环体中只有一个StringBuilder对象。编译器不会每次循环都创建新的StringBuilder对象。

所以相比使用String,在进行大量字符串连接时,StringBuilder效率更高。

下一节将从源码的角度出发,探讨StringBuilder效率更高的原因。

字符串连接操作下的String和StringBuilder(一)

时间: 2024-10-06 23:20:36

字符串连接操作下的String和StringBuilder(一)的相关文章

字符串连接操作下的String和StringBuilder(二)

重点关注StringBuilder的append方法 使用source insight查看Jdk中提供的源码 定位到StringBuilder.java 搜索append方法 定位到append方法的一种重载 public StringBuilder append(String str) { super.append(str); return this; } 可见是调用父类的append方法 定位到父类的append(String str)方法 public AbstractStringBuil

php大力力 [024节]PHP中的字符串连接操作(2015-08-27)

2015-08-27 php大力力024.PHP中的字符串连接操作 PHP中的字符串连接操作  阅读:6185次   时间:2012-03-25 PHP字符串的连接的简单实例 时间:2013-12-30 很多时候我们需要将几个字符串连接起来显示,在PHP中,字符串之间使用“点”来连接,也就是英文中的句号”.”,具体使用方式如下 //定义字符串 $str1 = "Hello World!"; $str2 = "Welcome to HutaoW's BLOG!"; /

string和stringbuilder的个人总结

String和StringBuilder的深入解析   前言:本文出发点是我们开发的过程中是否真正的理解stringbuilder的使用,string字符串操作的是如何实现(哈希表),stringbuilder是否设置默认值容量,什么时候才用stringbuilder. 一概念String和stringbulider的理解 string是我们用的最多的类型之一,是一个特殊的引用类型,直接派生于Object,因此它的值储存在托管堆上.构造一个新字符串的时候,不需要用new.它是”不可变的“.初始化

C#中string和StringBuilder的区别

string在任何语言中都有它的特殊性,在.NET中也是如此.它属于基本数据类型,也是基本数据类型中唯一的引用类型.字符串可以声明为常量,但它却放在了堆中. 一:不可改变对象 在.NET中String是不可改变对象,一旦创建了一个String对象并给它赋值,它就不可能再改变,也就是你不可能改变一个字符串的值.这句活初听起来似乎有些不可思议,大家也许马上会想到字符串连接操作,我们不也可以改变字符串吗?看下面的这段代码: public static void Main(string[] args)

(转)c# String与StringBuilder

阅读目录 1.什么时候用String?什么时候用StringBuilder? 2.String与StringBuilder的区别 总结 1.什么时候用String?什么时候用StringBuilder? 字符串一旦创建就不可修改大小,每次使用System.String类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间.在需要对字符串执行重复修改的情况下,与创建新的String对象相关的系统开销可能会非常昂贵.如果要修改字符串而不创建新的对象,则可以使用Syste

转:String StringBuffer StringBuilder区别

转自:http://www.iteye.com/topic/522167 作者:每次上网冲杯Java时,都能看到关于String无休无止的争论.还是觉得有必要让这个讨厌又很可爱的String美眉,赤裸裸的站在我们这些Java色狼面前了.嘿嘿.... 众所周知,String是由字符组成的串,在程序中使用频率很高.Java中的String是一个类,而并非基本数据类型. 不过她却不是普通的类哦!!! [镜头1] String对象的创建       1.关于类对象的创建,很普通的一种方式就是利用构造器,

java中String与StringBuilder的区别

本篇文章介绍了,java中String与StringBuilder的区别. 相信大家对 String 和 StringBuffer 的区别也已经很了解了,但是估计还是会有很多同志对这两个类的工作原理有些不清楚的地方,今天我在这里重新把这个概念给大家复习一下,顺便牵出 J2SE 5.0 里面带来的一个新的字符操作的类—— StringBuilder (先别忙着扔我砖头,我还算清醒,我这里说的不是 C #, Java 也有 StringBuilder 类).那么这个 StringBuilder 和

解析C#中的string和StringBuilder的区别

string的缺点是每次字符串变量的内容发生了改变时,都必须重新分配内存.你想想,如果创建一个迭代100000次的循环,每次迭代都将一个字符连接到字符串,这样内存中就会有100000个字符串,每个字符串仅仅与前一个字符串相伴只是有一个字符不同,性能影响是很大的.StringBuilder通过分配一个缓存,就是一个工作区来解决这些问题,在工作区中队字符串应用StringBuilder类的相关方法.包括添加,删除,移除,插入和替换字符等等.执行完之后,将调用ToString方法把工作区中的内容转换为

C# string和StringBuilder的区别

主要的区别在于 stringbuilder相对于string,效率要高些,string会在每次改变的时候进行内存重新组合,而stringbuilder则不会从新组合,另外stringbuilder有append,insert,replace 等一些方法,用起来比较方便.String 对象是不可改变的.每次使用 System.String 类中的方法之一或进行运算时(如赋值.拼接等)时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间.而 StringBuilder 则不会.在需