我们在编码过程中,有很多字符串相关的操作,
基本上每个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()只支持单个分隔符的情况。
分享到:
相关推荐
- 递归的使用和C++中`std::string`类的掌握是本次设计的重点收获,同时对递归解决问题的思维方式有了更直观的认识。 - 遇到困难时,通过查阅资料和自我探索,提高了问题解决能力。 通过这个课程设计,不仅锻炼了...
| 字符串型 | `String` | 以 `$` 结尾,最大长度65535个字符 | | 字节型 | | 1字节 | | 布尔型 | | 2字节 | | 整型 | `%` | 2字节 | | 长整型 | `&` | 4字节 | | 单精度型 | `!` | 4字节 | | 双精度型 | `#` | 8字节...
- **String类示例**:通过具体的String类示例,展示构造函数和析构函数的实际应用。 - **拷贝构造函数与赋值函数**:强调拷贝构造函数和赋值函数的重要性,以及何时需要显式定义它们。 - **派生类中实现基本函数**:...
《深入解析JDK1.6源码:洞察Java编程的本质》 在编程世界里,对源码的理解是提升技术水平的关键步骤。...源码阅读需要耐心和毅力,但其带来的收获是无法估量的,它将使我们成为真正的Java编程专家。
- 方案二:使用Python内置函数提高效率,例如利用`string.ascii_lowercase`和`max()`函数组合实现。 - **题目二:蓝跳跳** - **题目描述**:这是一个典型的动态规划问题。题目要求计算在给定条件下,从起点跳跃...
- **线程同步**:使用 `synchronized` 关键字或者 `ReentrantLock` 类进行锁管理,防止多个线程同时访问共享资源导致的问题。 - **线程通信**:通过 `wait()` 和 `notify()` 方法实现线程间的协作。 #### 2. Java...
- **String类方法**:如split()、replace()、substring()等用于字符串处理的方法。 ### 数据库 #### SQL之连接查询 - **内连接**:INNER JOIN,返回两个表中匹配的数据行。 - **外连接**:LEFT JOIN、RIGHT JOIN,...
5. **实验报告撰写**:最后,学生需要根据实验过程和结果撰写详细的实验报告,总结实验过程中的收获和遇到的问题。 #### 四、实验步骤详解 实验步骤提供了具体的指导,帮助学生顺利完成实验任务: 1. **创建Web...
- **收获**: 通过此次课程设计,不仅提升了软件工程理论知识的应用能力,还增强了团队协作和解决问题的能力。 - **挑战**: 在实际开发过程中遇到了诸如功能完善、性能优化等问题,通过不断学习和实践得以解决。 - **...
MPPT(Maximum Power Point Tracking)是太阳能光伏系统中的关键技术,其目标是使光伏电池阵列在各种环境条件下工作在最大功率点,以提高太阳能转换效率。在这个项目中,"MPPT for PV using PSO"(粒子群优化算法...
这个实验可以帮助学生理解如何处理大量文本数据,以及如何设计和优化数据结构以提高效率。 实验报告中,每个部分都应该详细记录了实验目的、设计思路、实现步骤、遇到的问题及解决方案,还应该有对最终结果的分析。...
Java JDK源码学习是每一位Java开发者深入理解编程基础和提升技术能力的重要步骤。JDK(Java Development Kit)是Oracle公司发布的用于开发Java应用程序...这是一项长期且富有挑战性的任务,但其带来的收获将无可估量。
- **数据结构选择**:为提高效率和简化实现过程,选择合适的数据结构。 - **程序调试**:编写测试用例,验证各个功能模块的正确性。 - **界面设计**:确保用户界面简洁直观,便于操作。 #### 结论 - **设计目标...
Perl(实用提取报告语言)是一种解释型脚本语言,专为扫描任意文本文件、从这些文件中提取信息并基于该信息打印报告而优化。它同样适用于多种系统管理任务。作为一种实用主义语言,Perl在设计上更注重实用性、易用性...
它旨在提高程序员的生产效率,同时保持系统的可移植性和高效率。Go语言实战读书笔记系列合集,正如其名,是一份全面涵盖Go语言学习和实践的资料集合,对于想要深入理解Go语言特性和应用的开发者来说,无疑是一份宝贵...
6. **总结与心得体会**:最后,通过总结课程设计过程中的收获,可以反思编程技巧、协议理解、问题解决策略等方面,有助于巩固学习成果。 7. **参考文献**:查找相关的技术文档、标准规范和已有的开源SNMP实现,可以...
10. **持续学习与实践**:解决 Codewars 的Kata就像是一场永不停歇的编程马拉松,每次成功解决一个问题都会带来新的收获。不断挑战自己,从失败中学习,逐渐积累经验,你的Java技能会得到显著提升。 总的来说,通过...