java性能优化--字符串优化处理
- String对象
String对象是java中重要的数据类型,在大部分情况下我们都会用到String对象。其实在Java语言中,其设计者也对String做了大量的优化工作,这些也是String对象的特点,它们就是:不变性,常量池优化和String类的final定义。1.1 不变性
String对象的状态在其被创建之后就不在发生变化。为什么说这点也是Java设计者所做的优化,在java模式中,有一种模式叫不变模式,了解的童鞋也应该知道不变模式的作用:在一个对象被多线程共享,而且被频繁的访问时,可以省略同步和锁的时间,从而提高性能。而String的不变性,可泛化为不变模式。1.2 常量池优化
常量池优化指的是什么呢?那就是当两个String对象拥有同一个值的时候,他们都只是引用了常量池中的同一个拷贝。所以当程序中某个字符串频繁出现时,这个优化技术就可以节省大幅度的内存空间了。例如:
String s1 = "123";
String s2 = "123";
String s3 = new String("123");
System.out.println(s1==s2); //true
System.out.println(s1==s3); //false
System.out.println(s1==s3.intern()); //true以上代码中,s1和s2引用的是相同的地址,故而第四行打印出的结果是true;而s3虽然只与s1,s2相等,但是s3时通过new String("123")创建的,重新开辟了内存空间,因引用的地址不同,所以第5行打印出false;intern方法返回的是String对象在常亮池中的引用,所以最后一行打印出true。
1.3 final的定义
String类以final进行了修饰,在系统中就不可能有String的子类,这一点也是出于对系统安全性的考虑。 字符串操作中的常见优化方法
2.1 split()方法优化
通常情况下,split()方法带给我们很大的方便,但是其性能不是很好。建议结合使用indexOf()和subString()方法进行自定义拆分,这样性能会有显著的提高。2.2 String常量的累加操作优化方法
示例代码:String s = "";
long sBeginTime = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
s+="s";
}
long sEndTime = System.currentTimeMillis();
System.out.println("s拼接100000遍s耗时: " + (sEndTime - sBeginTime) + "ms"); StringBuffer s1 = new StringBuffer();
long s1BeginTime = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
s1.append("s");
}
long s1EndTime = System.currentTimeMillis();
System.out.println("s1拼接100000遍s耗时: " + (s1EndTime - s1BeginTime) + "ms"); StringBuilder s2 = new StringBuilder();
long s2BeginTime = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
s2.append("s");
}
long s2EndTime = System.currentTimeMillis();
System.out.println("s2拼接100000遍s耗时: " + (s2EndTime - s2BeginTime) + "ms");结果:
上例所示,使用+号拼接字符串,其效率明显较低,而使用StringBuffer和StringBuilder的append()方法进行拼接,效率是使用+号拼接方式的百倍甚至千倍,而StringBuffer的效率比StringBuilder低些,这是由于StringBuffer实现了线程安全,效率较低也是不可避免的。所以在字符串的累加操作中,建议结合线程问题选择,应避免使用+号拼接字符串。
2.3 StringBuffer和StringBuilder的选择
上例中也使用过StringBuffer和StringBuilder了,两者只有线程安全方面的差别,所以呢,在无需考虑线程安全的情况下,建议使用性能相对较高的StringBuilder类,若系统要求线程安全,就选择StringBuffer类。2.4 基本数据类型转化为String类型的优化方案
示例代码:
Integer num = 0;
int loop = 100000; // 将结果放大100000倍,以便于观察结果
long beginTime = System.currentTimeMillis();
for (int i = 0; i < loop; i++) {
String s = num+"";
}
long endTime = System.currentTimeMillis();
System.out.println("+\"\"的方式耗时: " + (endTime - beginTime) + "ms"); beginTime = System.currentTimeMillis();
for (int i = 0; i < loop; i++) {
String s = String.valueOf(num);
}
endTime = System.currentTimeMillis();
System.out.println("String.valueOf()的方式耗时: " + (endTime - beginTime) + "ms"); beginTime = System.currentTimeMillis();
for (int i = 0; i < loop; i++) {
String s = num.toString();
}
endTime = System.currentTimeMillis();
System.out.println("toString()的方式耗时: " + (endTime - beginTime) + "ms");以上示例中,String.valueOf()直接调用了底层的Integer.toString()方法,不过其中会先判空;+""由StringBuilder实现,先调用了append()方法,然后调用了toString()方法获取字符串;num.toString()直接调用了Integer.toString()方法,所以效率是:num.toString()方法最快,其次是String.valueOf(num),最后是num+""的方式。以下是结果截图:
建议童鞋们避免使用+""的方式转换,最好是使用基本数据类型自带的toString()方法转换。就先分享到这儿吧!!!
java性能优化--字符串优化处理的更多相关文章
- Java 性能优化之 String 篇
原文:http://www.ibm.com/developerworks/cn/java/j-lo-optmizestring/ Java 性能优化之 String 篇 String 方法用于文本分析 ...
- 有哪些Java性能优化方法?
面试官:"有性能优化经验没?" 应聘者:"有一点." 面试官:"那你们从哪些方面做了优化?" 应聘者:"sql优化.JV ...
- 推荐:Java性能优化系列集锦
Java性能问题一直困扰着广大程序员,由于平台复杂性,要定位问题,找出其根源确实很难.随着10多年Java平台的改进以及新出现的多核多处理器,Java软件的性能和扩展性已经今非昔比了.现代JVM持续演 ...
- Java 性能优化手册 — 提高 Java 代码性能的各种技巧
转载: Java 性能优化手册 - 提高 Java 代码性能的各种技巧 Java 6,7,8 中的 String.intern - 字符串池 这篇文章将要讨论 Java 6 中是如何实现 String ...
- 10种简单的Java性能优化
你是否正打算优化hashCode()方法?是否想要绕开正则表达式?Lukas Eder介绍了很多简单方便的性能优化小贴士以及扩展程序性能的技巧. 最近“全网域(Web Scale)”一词被炒得火热,人 ...
- 【转】10种简单的Java性能优化
10种简单的Java性能优化 2015/06/23 | 分类: 基础技术 | 14 条评论 | 标签: 性能优化 分享到: 本文由 ImportNew - 一直在路上 翻译自 jaxenter.欢迎加 ...
- 44个Java性能优化
44个Java性能优化 首先,代码优化的目标是: 减小代码的体积 提高代码运行效率 代码优化细节 1 .尽量指定类.方法的final修饰符 带有final修饰符的类是不可派生的.在Java核心AP ...
- Java 性能优化的55个细节(珍藏版)
在Java程序中,性能问题的大部分原因并不在于Java语言,而是程序本身.养成良好的编码习惯非常重要,能够显著地提升程序性能. 1.尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间 ...
- Java性能优化的50个细节,我必须分享给你!
来源:blog.csdn.net/dongnan591172113/article/details/51790428 ;i<list.size();i++) ,len=list.size();i ...
随机推荐
- 迁移桌面程序到MS Store(9)——APPX With Desktop Extension
在<迁移桌面程序到MS Store(8)——通过APPX下载Win32Component>中我们讨论了通过APPX来下载Service部分的安装包.但是纯UWP的客户端并不能自动运行下载的 ...
- 原子操作CAS-最小的线程安全
原文连接:(http://www.studyshare.cn/blog-front/blog/details/1166/0 )一.原子操作是什么? 如果有两个线程分别执行两个操作A和B,从第一个线程执 ...
- 给VS设置代码创建人的宏
Sub AddFunComment() Dim DocSel As EnvDTE.TextSelection DocSel = DTE.ActiveDocument.Selection DocSel. ...
- Web自动化测试 二 ----- HTML
HTML 一.结构 html> 与 </html> 之间的文本描述网页 <body> 与 </body> 之间的文本是可见的页面内容 <h1> 与 ...
- HTTP 学习笔记02
请求行 格式:请求方式 资源路径 HTTP版本号 HTTP1.1 还需要 [host] 例:GET /test.html HTTP/1.0 GET /test.html HTTP/ ...
- HttpUtility.UrlEncode讲解
hello 大家好,今天讲讲HttpUtility.UrlEncode编码 HttpUtility.UrlEncode方法有4个重载分别如下 我们有这么一个字符串 string str = " ...
- 小代学Spring Boot之开篇
想要获取更多文章可以访问我的博客 - 代码无止境. 前情提要 小代是一名入职不久的程序员,公司同事都亲切的称他小代.有一天小代的老大陈BOSS和小代说,公司后端最近准备换技术框架了. 小代: 换成啥? ...
- django基础知识之中间件:
中间件 是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出 激活:添加到Django配置文件中的MIDDLEWARE_CLASSES元组中 每个中间件 ...
- find文件删除
find /root/title/test -type f -name '*.txt' -exec rm {} \; 查找并删除test文件夹下所有txt文件 find /root/title/t ...
- 雅阁微信群、雅阁车友群、十代雅阁交流微信QQ群
最近一直在关注第十代雅阁,不论是普通汽油版本还是油电混动版本都很不错,在网上看到很多评测文章和视频 后续都会整理发布到微信群中. 由于论坛发帖,博客发文都不是很方便,为了及时沟通,先创建了微信群,方便 ...