Java提高性能(部分转自http://www.matrix.org.cn)

1)这里比较一下ArrayList和LinkedList:
1.ArrayList是基于数组,LinkedList基于链表实现。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
4.查找操作indexOf,lastIndexOf,contains等,两者差不多。
这里只是理论上分析,事实上也不一定,比如ArrayList在末尾插入和删除数据就不设计到数据移动,不过还是
有这么个建议:随机访问比较多的话一定要用ArrayList而不是LinkedList,如果需要频繁的插入和删除应该
考虑用LinkedList来提高性能。

我个人认为,在大多数情况下都要优先考虑使用ArrayList。我曾经看过一个java1.5上的测试报告,数据显示当且仅当在“需要在list头部大量增删数据”时,LinkedList才显示出优势,其他情况下均败给ArrayList。有些时候,即使是需要在头部做大量操作,也可以通过反转list的形式把它变成尾部操作,这样就方便ArrayList了。所以一般LinkedList出场的几率很小。

2)复制数组的时候使用System.arraycopy静态方法,而不要通过循环遍历来一个个赋值。具体查看jdk文档。

3)multiple dimension array
Java里面的multiple dimension array实际上是用array of arrays来模拟的,这样导致他们可能并非储存在连续的内存空间,会引起比较糟糕的内存访问的问题。

IBM的ninja group开发了一个package来解决这个问题,Array Package

4)避免在循环条件中使用复杂表达式 在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快。

或许尽量在条件语句之前就计算好条件表达式是个好习惯,尽量让条件表达式是一个“量”而不是“表达式”。

5)为'Vectors' 和 'Hashtables'定义初始大小 JVM为Vector扩充大小的时候需要重新创建一个更大的数组,将原原先数组中的内容复制过来,最后,原先的数组再被回收。可见Vector容量的扩大是一个颇费时间的事。通常,默认的10个元素大小是不够的。你最好能准确的估计你所需要的最佳大小

6)使类和成员的可访问能力最小化
复合优先于继承
接口优先于抽象类

(当然,第6条乎跟性能联系不大,但却是一个很好的设计原则问题)

7)

如果字符串特别长,采用charAt逐一获取特定位置的字符是非常耗时的。因为每次获取制定索引位置的字符都要引起新的检索过程,更好的办法是将字符串通过调用toCharArray方法转换成字符数组,然后通过数组索引值获得指定位置的字符

8)使用移位操作来代替'a / b'操作 "/"是一个很“昂贵”的操作,使用移位操作将会更快更有效。

(这一条在其它语言中也是成立的,不怕麻烦的话可以考虑,不过一般不必为此周折...)

9)对于boolean值,避免不必要的等式判断 将一个boolean值与一个true比较是一个恒等操作(直接返回该boolean变量的值). 移走对于boolean的不必要操作至少会带来2个好处: 1)代码执行的更快 (生成的字节码少了5个字节); 2)代码也会更加干净

(这条貌似很浅显,但却是很多初学者会犯的毛病)

10)尽量不要将大对象放到HttpSession或其他须序列化的对象中,并注意及时清空Session

11)不要随便将大段代码放入Synchronized块中,这个很好理解,没必要的Synchronized块应该舍去。

12)在涉及字符串的大量更改操作中,使用StringBuffer/StringBuilder,若需要线程安全性,用StringBuffer;否则用StringBuider更有效率。这是因为StringBuffer为了保持线程安全性而损失了性能。同样的关系出现在Hashtable/HashMap和Vector/ArrayList上(前者线程安全,后者线程不安全,但更有效率)。

13)减少try块的使用。对于这个,一个可以接受的建议是:在编写功能组件时不进行异常的try/catch,用throws,但要给出每个方法可能抛出的异常的列表。等到在业务逻辑中(或者说main函数中)调用这些功能组件时在统一try/catch这些功能组件抛出的异常,集中处理。

好了,暂时就想到这些,肯定还有,以后再补充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值