提高Java 性能的5点 理解+实用

估计下一步公司会安排优化的任务,所以未雨绸缪一下吧。这个确实是个好活,不用耽误时间。几年前这类的文章还看不懂,现在能够写一下读书笔记,也算是一个进步。或者说是意外收获,因为很久以来已经把大部分的时间放在了android上。没想到java 还能略带着进步进步!

 

=============华丽的分割线,吹牛以及胡扯到此结束====================

一:java 优化之原则性问题:

  • 良好的设计将会使优化变得更加容易。
  • 过早的优化并不能解决多有的性能问题,但是不良的设计将会导致优化难度的增加。

 

  • 每条查询都用唯一的StringBuilder来生成。
  • 模板引擎实际上处理的是字符而并非正则表达式。
  • 选择尽可能的使用数组,尤其是在对监听器进行迭代时。
  • 对JDBC的方法敬而远之。
  • 等等。

 

二:具体实现

1、使用StringBuilder :一般来说,使用StringBuilder 的效果要优于使用 + 操作符。如果可能的话请在需要跨多个方法传递引用的情况下选择 StringBuilder,因为 String 要消耗额外的资源。如果你仍在使用 StringBuffer 的话,那么用 StringBuilder 代替 StringBuffer 吧,毕竟需要同步字符串的情况真的不多。

 

2、避免是用正则表达式:

至少要将 Pattern 缓存下来,避免反复编译Pattern。

static final Pattern HEAVY_REGEX =    Pattern.compile("(((X)*Y)*Z)*");


还要小心各种使用到正则表达式的JDK字符串方法,比如 String.replaceAll() String.split()。可以选择用比较流行的开发库,比如 Apache CommonsLang 来进行字符串操作。

 

3、不要使用iterator()方法

这条建议不适用于一般的场合,仅适用于在 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 循环,仅仅是在栈上“浪费”了区区一个整形,相当划算。


int size = strings.size();
for (int i = 0; i < size; i++) {
    String value : strings.get(i);
    // Do something useful here
}

 

4、使用原始类型和栈

//存储在堆上
Integer i = 817598;


……如果这样写的话:

// 存储在栈上
int i = 817598;


在使用数组时情况可能会变得更加糟糕:

//在堆上生成了三个对象
Integer[] i = { 1337, 424242 };


……如果这样写的话:

// 仅在堆上生成了一个对象
int[] i = { 1337, 424242 };


5、使用entrySet()

当我们想遍历一个用键值对形式保存的 Map 时,必须要为下面的代码找到一个很好的理由:

 

for (Entry<K, V>entry : map.entrySet()) {
    K key =entry.getKey();
    V value = entry.getValue();
}


至少,如果不得不使用map的话,那么要用entrySet() 方法去迭代!这样的话,我们要访问的就仅仅是Map.Entry的实例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值