java 几种性能优化的总结

22 篇文章 0 订阅
[size=large][color=red][b]1、使用StringBuilder[/b][/color][/size]
一般来说,使用 StringBuilder 的效果要优于使用 + 操作符。如果可能的话请在需要跨多个方法传递引用的情况下选择 StringBuilder,因为 String 要消耗额外的资源。JOOQ在生成复杂的SQL语句便使用了这样的方式。在整个抽象语法树(AST Abstract Syntax Tree)SQL传递过程中仅使用了一个 StringBuilder 。

[color=blue][b]更加悲剧的是,如果你仍在使用 StringBuffer 的话,那么用 StringBuilder 代替 StringBuffer 吧,毕竟需要同步字符串的情况真的不多。[/b][/color]

[size=x-large][color=red][b]2、不要使用iterator()方法[/b][/color][/size]
这条建议不适用于一般的场合,仅适用于在 N.O.P.E 分支深处的场景。尽管如此也应该有所了解。Java 5格式的循环写法非常的方便,以至于我们可以忘记内部的循环方法,比如:
for (String value : strings) {
// Do something useful here
}

当每次代码运行到这个循环时,如果 strings 变量是一个 Iterable 的话,代码将会自动创建一个Iterator 的实例。如果使用的是 ArrayList 的话,虚拟机会自动在堆上为对象分配3个整数类型大小的内存。
private class Itr implements Iterator<E> {
int cursor;
int lastRet = -1;
int expectedModCount = modCount;
// ...

也可以用下面等价的循环方式来替代上面的 for 循环,仅仅是在栈上“浪费”了区区一个整形,相当划算。
for (int i = 0; i < size; i++) {
String value : strings.get(i);
// Do something useful here
}


[b]如果循环中字符串的值是不怎么变化,也可用数组来实现循环。[/b]
for (String value : stringArray) {
// Do something useful here
}


小结
无论是从易读写的角度来说,还是从API设计的角度来说迭代器、Iterable接口和 foreach 循环都是非常好用的。
但代价是,使用它们时是会额外在堆上为每个循环子创建一个对象。

[size=large][color=red][b]3、使用entrySet()[/b][/color][/size]
当我们想遍历一个用键值对形式保存的 Map 时,必须要为下面的代码找到一个很好的理由:
for (K key : map.keySet()) {
V value : map.get(key);
}

更不用说下面的写法:
for (Entry<K, V> entry : map.entrySet()) {
K key = entry.getKey();
V value = entry.getValue();
}


在我们使用 N.O.P.E. 分支应该慎用map。因为很多看似时间复杂度为 O(1) 的访问操作其实是由一系列的操作组成的。而且访问本身也不是免费的。至少,如果不得不使用map的话,那么要用 entrySet() 方法去迭代,这样的话,我们要访问的就仅仅是Map.Entry的实例。

小结
[color=blue][b]在需要迭代键值对形式的Map时一定要用 entrySet() 方法。[/b][/color]

[size=large][color=red][b]4.for循环优化[/b][/color][/size]

[b]list.size()每次循环都会被执行一次,这无疑会影响程序的性能,所以应该将其放到循环外面,用一个变量来代替。[/b]

避免在for循环中捕捉异常

[color=blue][b]提取与循环无关的表达式避免在for循环中进行一些无用的运算[/b][/color]

[size=large][color=red][b]5.集合初始化时初始化个数[/b][/color][/size]

[size=medium][color=red][b]6.尽量实现对象重用 [/b][/color][/size]
系统要花时间生成对象,以后还需花时间对这些对象进行垃圾回收和处理。因此,生成过多的对象将会给程序的性能带来很大的影响。

[size=medium][color=red][b]7.将闲置的资源进行释放 [/b][/color][/size]
Java 编程过程中,进行数据库连接、I/O流操作时务必小心,在使用完毕后,及时关闭以释放资源。[b]因为对这些大对象的操作会造成系统大的开销,稍有不慎,会导致严重的后果。[/b]

[size=medium][color=red][b]8.StringTokenizer代替substring()和indexOf() [/b][/color][/size]
StringTokenizer是java中object类的一个子类,继承自 Enumeration( public interface Enumeration实现 Enumeration(列举) 接口的对象,它生成一系列元素,一次生成一个)接口。

[size=medium][color=red][b]9.System.arraycopy()实现数组值的拷贝 [/b][/color][/size]
两个数组间的复制建议不要使用循环,Java提供了一个数组拷贝的方法。

[size=medium][color=blue][b]10.尽量指定类、方法的final修饰符[/b][/color][/size]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值