作家
登录

Java程序员应知道的十条Java优化策略,让你的系统健步如飞

作者: 来源: 2017-10-31 11:47:56 阅读 我要评论

V value : map.get(key);

2017年架构师最重要的48个小时 | 8折倒计时


1、应用StringBuilder(技巧文)

StingBuilder 应当是在我们的Java代码中默认应用的,应当避免应用 + 操作符。或许你会对 StringBuilder 的语法糖(syntax sugar)持有不合看法,比如:

String x = "a" + args.length + "b";

如不雅轮回中字符串的值是不怎么变更,也可用数组来实现轮回。

将会被编译为:

0 new java.lang.StringBuilder [16]

3 dup

4 ldc <String "a"> [18]

9 aload_0 [args]

10 arraylength

11 invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [23]

【编辑推荐】

  1. JavaScript中缺点精确处理方法,你用对了吗?
  2. Kotlin将超出Java成为Android开辟的第一说话?
  3. Java在线问题排查利器之Btrace&Greys
  4. 编程说话之争,谁将会杀逝世Java?
  5. 外媒速递:关于Java生态体系值得存眷的五大年夜趋势
【义务编辑:张燕妮 TEL:(010)68476606】

16 invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [29]

19 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [32]

22 astore_1 [x]

但毕竟产生了什么?接下来是否须要用下面的部分来对 String 进行改良呢?

String x = "a" + args.length + "b";

if (args.length == 1)

x = x + args[0];

如今应用到了第二个 StringBuilder,这个 StringBuilder 不会消费堆中额外的内存,但却给 GC 带来了压力。

StringBuilder x = new StringBuilder("a");

x.append(args.length);

x.append("b");

if (args.length == 1);

x.append(args[0]);

小结

在膳绫擎的样例中,如不雅你是依附Java编译器来隐式生成实例的话,那么编译的效不雅几乎和是否应用了 StringBuilder 实例毫无关系。请记住:在 N.O.P.E 分支中,每次CPU的轮回的时光到白白的消费在GC或者为 StringBuilder 分派默认空间上了,我们是在浪费 N x O x P 时光。

加倍悲剧的是,如不雅你仍在应用 StringBuffer 的话,那么竽暌姑 StringBuilder 代替 StringBuffer 吧,毕竟须要同步字符串的情况真的不多。

2、避免应用正则表达式(好技巧文)

这是最好照样用通俗的 char[] 数组或者是基于索引的操作。比如下面这段可读性比较差的代码其实起到了雷同的感化。

正则表达式给人的印象是快捷简便。然则在 N.O.P.E 分支中应用正则表达式将是最糟糕的决定。如不雅万不得已非要在计算密集型代码中应用正则表达式的话,至少要将 Pattern 缓存下来,避免反复编译Pattern。

static final Pattern HEAVY_REGEX =

6 invokespecial java.lang.StringBuilder(java.lang.String) [20]

如不雅仅应用到了如下如许简单的┞俘则表达式的话:

String[] parts = ipAddress.split("\.");

int length = ipAddress.length();

声明式编程。

int offset = 0;

14 ldc <String "b"> [27]

int part = 0;

for (int i = 0; i < length; i++) {

if (i == length - 1 ||

ipAddress.charAt(i + 1) == '.') {

遵守LGPL协定的 trove4j 是一个Java集合类库,它为我们供给了优于整形数组 int[] 更好的机能实现。

parts[part] =

ipAddress.substring(offset, i + 1);

part++;

if (this == that) {

vals[index] = maskNull(value);

offset = i + 2;

}

}

膳绫擎的代码同时注解了过早的优化是没有意义的。固然与 split() 办法比拟较,这段代码的可保护性比较差。

挑衅:聪慧的小伙伴能想出更快的算法吗?迎接留言。

小结

for (Entry<K, V> entry : map.entrySet()) {

正则表达式是十分有效,然则在应用时也要付出价值。尤其是在 N.O.P.E 分支深处时,要不吝一切代码避免应用正则表达式。还要当心各类应用到正则表达式的JDK字符串办法,比如 String.WordStrAll() 或 String.split()。可以选择用比较风行的开辟库,比如 Apache Commons Lang 来进行字符串操作。

3、不要应用iterator()办法

这条建议不实用于一般的场合,仅实用于在 N.O.P.E 分支深处的场景。尽管如斯也应当有所懂得。Java 5格局的轮回写法异常的便利,以至于我们可以忘记内部的轮回办法,比如:

for (String value : strings) {

// Do something useful here

}

当每次代码运行到这个轮回时,如不雅 strings 变量是一个 Iterable 的话,代码将会主动创建一个Iterator 的实例。如不雅应用的是 ArrayList 的话,虚拟机会主动在堆上为对象分派3个整数类型大年夜小的内存。

public boolean equals(Object that) {

// ...

private class Itr implements Iterator<E> {

int cursor;

int lastRet = -1;

int expectedModCount = modCount;

// ...

也可以用下面等价的轮回方法来替代膳绫擎的 for 轮回,仅仅是在栈上“浪费”了掉掉一个整形,相当划算。

int size = strings.size();

for (int i = 0; i < size; i++) {

 1/4    1 2 3 4 下一页 尾页

  推荐阅读

  Linux用户登录密码的生成

2017年架构师最重要的48个小时 | 8折倒计时 一、大年夜主动化需求说起对于这个问题,秉承实在用主义的精力,我本来也不会去深究。毕竟,安装的时刻会设置暗码,安装完毕后能经由过程passwd>>>详细阅读


本文标题:Java程序员应知道的十条Java优化策略,让你的系统健步如飞

地址:http://www.17bianji.com/lsqh/38303.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)