`
laodizhuq
  • 浏览: 26131 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

小优化,带来大收获-String类的效率问题

阅读更多
我们在编码过程中,有很多字符串相关的操作,

基本上每个java程序员都知道String和StringBuffer两个在处理字符串上面有很大的效率差别,

归根结底是String是一次性开辟一段定长空间的char[],如果之后对String做修改,java是重新new一个新的String对象(char[]),然后拷贝原有对象到新对象中的。这个过程会非常消耗资源。

StringBuffer好处是默认开辟一个char[16],在修改字符串时是在char数组中添加内容,然后移动下标。当长度超过原有长度后,再开辟一段两倍于新长度+1的char[](
int newCapacity = (value.length + 1) * 2;
),然后进行内容拷贝。

所以StringBuffer的高效率在于不是每次都做new char[]然后做拷贝,只有在长度不够的情况下才做,而且每次就扩展新长度的两倍。这样扩容的几率就不是很高了。

那么我们在使用了StringBuffer还有没有优化的可能呢?StringBuffer的实例化方法中提供制定初始长度的方法,那么我们在使用StringBuffer时就可以更加高效的使用它了,在可以预知的长度字符串操作时,我们就可以使用该实例化方法(new StringBuffer(newStrLen);),这样做字符串操作过程中就不会出现扩容的过程了。

-------------------------------------------------------------

上面讲到的内容,大部分人都知道了,下面讲讲字符串的另外两个方法String.slipt()和String.replaceAll(),这两个方法的执行效率也非常低,主要原因是这两个方法都是支持正则表达式的。但是我们在使用这两个方法的很多时候都是用不着正则表达式的,那么我们可以使用宝宝写的StringUtil类来处理,

StringUtil.split()和StringUtil.replace,这两个方法是直接处理String中的chra[]的,效率及其高,下面我们可以看看我的测试结果

String a = "asdfasdf.asdf.asdf.asd..fasd......fasdf.asdf.as.df.asdgfa.sdf.as.df.ghwrtyrtuerty.rwtgwertkqertwerg,rtujhteyujrtgklrgf.ergkaerpogekrgmer.g.ergkjseorh.srth.sekrgoserpg.";
long start = System.currentTimeMillis();
for(int i=0; i<1000000; i++) {
	String aa[] = a.split("\\.");
}
System.out.println("String.slipt cost:"+(System.currentTimeMillis()-start));
start = System.currentTimeMillis();
for(int i=0; i<1000000; i++) {
	String aa[] = StringUtil.split(a,".");
}
System.out.println("StringUtil.slipt cost:"+(System.currentTimeMillis()-start));

String.slipt cost:9587
StringUtil.slipt cost:2177
String.replaceAll cost:12986
StringUtil.replace cost:3696

我们可以看到,split的方法效率在4倍以上,replace方法的效率也在将近4倍。

在我们商品属性类目属性这种有着大量循环中字符串split和replace使用的地方,如果这个的修改会有很大的提高。



但是这里要注意一点的是String.slipt()和StringUtil.split()两个方法并不是完全相同的,在两个连续分隔符的情况下,String.split会截取出空字符,而StringUtil.split()会自动将连续的分割符抛弃。
在我同事的提醒下,还有一个注意点,StringUtil.split()只支持单个分隔符的情况。
17
3
分享到:
评论
16 楼 kevinpan45 2012-05-07  
也就快了十分之一这样,你的提高这么多应该说明提升的地方是有针对性的
15 楼 kevinpan45 2012-05-07  
有这么高的效率吗,我换了以后提高的效率没这么明显啊
14 楼 laodizhuq 2010-02-03  
StringUtil类,可以参考一下
org.apache.commons.lang.StringUtils
13 楼 咖啡仔 2010-02-03  
http://commons.apache.org/lang/
的common-lang.jar
的org.apache.commons.lang.StringUtils么?
12 楼 jubin2002 2010-02-02  
四虎,大家都对宝宝写的StringUtil类很感兴趣
11 楼 清晨阳光 2010-02-02  
我平常使用StringBuilder,而不用StringBuffer
使用List,而不用Vector
看看老外项目的源码,大多都用的是StringBuilder
多数情况下,并不需要线程安全
Apache的StringUtils类的方法,都是null值安全的
比如StringUtils.length(null)会得到0,而不是抛出异常
10 楼 oaklet 2010-02-02  
俺也写过一个split,一个join,
估计速度就那样了,没有太大提升了
9 楼 whg333 2010-02-01  
“宝宝写的StringUtil类”是指的org.apache.commons.lang.StringUtils类吧?
8 楼 hanz188 2010-01-31  
“宝宝写的StringUtil类”是哪个类,能贴出来看看吗,或者把相关包上传下也行,想在自己机器上试验下的,结果发现没有对应的类。
7 楼 rovanz 2010-01-30  
额...还有这么一堆被误导的
6 楼 rovanz 2010-01-30  
貌似StringTokenizer也不支持正则表达式,没有你说的那个问题
String#replace也不支持正则表达式,你自己非要用replaceAll
5 楼 jameswolf 2010-01-30  
优化一定要看看是不是必要,如果程序中 不是循环调用 string + 操作 没有必要用 StringBuffer ,
就像 你自己写的split ,有必要循环1000000次来看优化结果吗,如果文本太大应该分段考虑 ,有必要一次做完吗??
4 楼 wuhua 2010-01-30  
StringUtil.split()和StringUtil.replace 在那里可以下载能,能否贴代码上来看下呢
3 楼 因为java所以java 2010-01-29  
以前都是直接用java自带的,觉得挺方便的。现在学习了,呵呵。
2 楼 doccent 2010-01-29  
以前都是直接用String的方法,以后用之前要先测一下。
1 楼 form_rr 2010-01-29  
呵呵!
java自带的split和replaceAll实在太低!
我们也换了!

相关推荐

    数据结构专业课程设计方案报告在表达式中左边的适当位置插入运算符或以使等式成立.docx

    - 递归的使用和C++中`std::string`类的掌握是本次设计的重点收获,同时对递归解决问题的思维方式有了更直观的认识。 - 遇到困难时,通过查阅资料和自我探索,提高了问题解决能力。 通过这个课程设计,不仅锻炼了...

    Excel+VBA之快速上手

    | 字符串型 | `String` | 以 `$` 结尾,最大长度65535个字符 | | 字节型 | | 1字节 | | 布尔型 | | 2字节 | | 整型 | `%` | 2字节 | | 长整型 | `&` | 4字节 | | 单精度型 | `!` | 4字节 | | 双精度型 | `#` | 8字节...

    高质量C++编程

    - **String类示例**:通过具体的String类示例,展示构造函数和析构函数的实际应用。 - **拷贝构造函数与赋值函数**:强调拷贝构造函数和赋值函数的重要性,以及何时需要显式定义它们。 - **派生类中实现基本函数**:...

    jdk源码 src

    《深入解析JDK1.6源码:洞察Java编程的本质》 在编程世界里,对源码的理解是提升技术水平的关键步骤。...源码阅读需要耐心和毅力,但其带来的收获是无法估量的,它将使我们成为真正的Java编程专家。

    蓝桥杯到底难不难?(内附第11届省赛+国赛真题解析).pdf

    - 方案二:使用Python内置函数提高效率,例如利用`string.ascii_lowercase`和`max()`函数组合实现。 - **题目二:蓝跳跳** - **题目描述**:这是一个典型的动态规划问题。题目要求计算在给定条件下,从起点跳跃...

    Java工程师面试宝典

    - **线程同步**:使用 `synchronized` 关键字或者 `ReentrantLock` 类进行锁管理,防止多个线程同时访问共享资源导致的问题。 - **线程通信**:通过 `wait()` 和 `notify()` 方法实现线程间的协作。 #### 2. Java...

    黑马面试宝典知识点复习

    - **String类方法**:如split()、replace()、substring()等用于字符串处理的方法。 ### 数据库 #### SQL之连接查询 - **内连接**:INNER JOIN,返回两个表中匹配的数据行。 - **外连接**:LEFT JOIN、RIGHT JOIN,...

    JSP与Servlet训练

    5. **实验报告撰写**:最后,学生需要根据实验过程和结果撰写详细的实验报告,总结实验过程中的收获和遇到的问题。 #### 四、实验步骤详解 实验步骤提供了具体的指导,帮助学生顺利完成实验任务: 1. **创建Web...

    银行储蓄系统设计报告

    - **收获**: 通过此次课程设计,不仅提升了软件工程理论知识的应用能力,还增强了团队协作和解决问题的能力。 - **挑战**: 在实际开发过程中遇到了诸如功能完善、性能优化等问题,通过不断学习和实践得以解决。 - **...

    MPPT for PV using PSO

    MPPT(Maximum Power Point Tracking)是太阳能光伏系统中的关键技术,其目标是使光伏电池阵列在各种环境条件下工作在最大功率点,以提高太阳能转换效率。在这个项目中,"MPPT for PV using PSO"(粒子群优化算法...

    java实验报告坦克大战单词分析等

    这个实验可以帮助学生理解如何处理大量文本数据,以及如何设计和优化数据结构以提高效率。 实验报告中,每个部分都应该详细记录了实验目的、设计思路、实现步骤、遇到的问题及解决方案,还应该有对最终结果的分析。...

    javajdk源码学习-JavaResources:jdk源码学习

    Java JDK源码学习是每一位Java开发者深入理解编程基础和提升技术能力的重要步骤。JDK(Java Development Kit)是Oracle公司发布的用于开发Java应用程序...这是一项长期且富有挑战性的任务,但其带来的收获将无可估量。

    简易文本编辑器报告(课程设计)

    - **数据结构选择**:为提高效率和简化实现过程,选择合适的数据结构。 - **程序调试**:编写测试用例,验证各个功能模块的正确性。 - **界面设计**:确保用户界面简洁直观,便于操作。 #### 结论 - **设计目标...

    perl programming

    Perl(实用提取报告语言)是一种解释型脚本语言,专为扫描任意文本文件、从这些文件中提取信息并基于该信息打印报告而优化。它同样适用于多种系统管理任务。作为一种实用主义语言,Perl在设计上更注重实用性、易用性...

    Go语言实战读书笔记系列合集.zip

    它旨在提高程序员的生产效率,同时保持系统的可移植性和高效率。Go语言实战读书笔记系列合集,正如其名,是一份全面涵盖Go语言学习和实践的资料集合,对于想要深入理解Go语言特性和应用的开发者来说,无疑是一份宝贵...

    SNMP仿真课程设计

    6. **总结与心得体会**:最后,通过总结课程设计过程中的收获,可以反思编程技巧、协议理解、问题解决策略等方面,有助于巩固学习成果。 7. **参考文献**:查找相关的技术文档、标准规范和已有的开源SNMP实现,可以...

    Codewars:我在Java中的Codewars解决方案

    10. **持续学习与实践**:解决 Codewars 的Kata就像是一场永不停歇的编程马拉松,每次成功解决一个问题都会带来新的收获。不断挑战自己,从失败中学习,逐渐积累经验,你的Java技能会得到显著提升。 总的来说,通过...

Global site tag (gtag.js) - Google Analytics