String 与StringBuilder
2016-01-15 13:31
483 查看
下面以字符串拼接为例讲解二者区别:
运行结果:9672ms
运行结果:6ms
二者运行时间为什么有这么大区别呢?
在java内部维护了一个String对象的常量池(new String()方式创建的String在堆内开辟空间,不属于常量池),说白了就是String对象是一个不可变对象,如果要改变String对象的内容,那么编译器每次都会构建一个新的String对象,需要不断开辟地址空间,然后进行拷贝操作,效率很低。
StringBuilder对象是动态对象,允许扩充它所封装的字符串中字符的长度,在创建StringBuilder对象的时候一般有一个初始化长度,之后进行append操作的时候如果字符串长度没有超过给定长度则直接添加;如果长度超过了StringBuilder维护的最大字符串长度,则StringBuilder会重新开辟空间,空间一般每次扩大一倍。
运行结果:
long s,e; s=System.currentTimeMillis(); String str=""; for(int i=0;i<100000;i++) { str+="hel"; } e=System.currentTimeMillis(); System.out.println(e-s);
运行结果:9672ms
long s,e; s=System.currentTimeMillis(); StringBuilder str1=new StringBuilder("hello"); for(int i=0;i<100000;i++) { str1.append("hel"); } e=System.currentTimeMillis(); System.out.println(e-s);
运行结果:6ms
二者运行时间为什么有这么大区别呢?
在java内部维护了一个String对象的常量池(new String()方式创建的String在堆内开辟空间,不属于常量池),说白了就是String对象是一个不可变对象,如果要改变String对象的内容,那么编译器每次都会构建一个新的String对象,需要不断开辟地址空间,然后进行拷贝操作,效率很低。
StringBuilder对象是动态对象,允许扩充它所封装的字符串中字符的长度,在创建StringBuilder对象的时候一般有一个初始化长度,之后进行append操作的时候如果字符串长度没有超过给定长度则直接添加;如果长度超过了StringBuilder维护的最大字符串长度,则StringBuilder会重新开辟空间,空间一般每次扩大一倍。
StringBuilder str1=new StringBuilder(); System.out.println(str1.capacity()); for(int i=0;i<20;i++) { str1.append("hel"); System.out.println(str1.capacity()); }
运行结果:
16 16 16 16 16 16 34 34 34 34 34 34 70 70 70 70 70 70 70 70 70
相关文章推荐
- Android之获取手机上的图片和视频缩略图thumbnails
- android string.xml文件中的整型和string型代替
- Android java 与 javascript互访(相互调用)的方法例子
- android上改变listView的选中颜色
- String.intern
- Prototype源码浅析 String部分(二)
- Ruby中的String对象学习笔记
- insert语句太长用StringBuilder优化一下
- PostgreSQL ERROR: invalid escape string 解决办法
- 浅谈C++中的string 类型占几个字节
- 标准C++类string的Copy-On-Write技术
- C++实现string存取二进制数据的方法
- C#中string和StingBuilder内存中的区别实例分析
- PHP STRING 陷阱原理说明
- c#中 String和string的区别介绍
- C#实现的图片、string相互转换类分享
- asp.net String.IsNullOrEmpty 方法
- js实现C#的StringBuilder效果完整实例
- JavaScript中字符串(string)转json的2种方法
- C#中string用法实例详解