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]
【编辑推荐】
【义务编辑:张燕妮 TEL:(010)68476606】
- JavaScript中缺点精确处理方法,你用对了吗?
- Kotlin将超出Java成为Android开辟的第一说话?
- Java在线问题排查利器之Btrace&Greys
- 编程说话之争,谁将会杀逝世Java?
- 外媒速递:关于Java生态体系值得存眷的五大年夜趋势
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++) {
推荐阅读
2017年架构师最重要的48个小时 | 8折倒计时 一、大年夜主动化需求说起对于这个问题,秉承实在用主义的精力,我本来也不会去深究。毕竟,安装的时刻会设置暗码,安装完毕后能经由过程passwd>>>详细阅读
本文标题:Java程序员应知道的十条Java优化策略,让你的系统健步如飞
地址:http://www.17bianji.com/lsqh/38303.html
1/2 1


网友点评
精彩导读
科技快报
品牌展示