java基本优化方法总结
来源:互联网 发布:深圳中广核设计院 知乎 编辑:程序博客网 时间:2024/05/21 04:01
java代码优化
1、循环
通常把大循环放在里面,把小循环放在外面,例如:
- for(int i=0; i<10;i++)
- {
- for(int j=0; j<1000000;j++)
- {
- ...
- }
- }
- for(int i=0; terminal=x.length;i<terminal;i++)
- {x = x/scaleA * scaleB;}
- //应该该成:
- Double scale = scaleB*scaleA;
- for(int i=0; terminal=x.length;i<terminal;i++)
- {x = x/scale ;}
- for(int i=0; i<collection.size();i++)
- { ... }
- //尽量减少对变量的重复计算
- for(int i=0; n=collection.size();i<n;i++)
- {...}
- Try {
- } catch() {
- }
应把其放置在最外层
循环内不要创建大量的临时变量
- for(int i=1;i<=domainCount;i++){
- ...
- AuditResult auditResult =new AuditResult();
- ...
- }
- //这种做法会在内存中保存N份这个对象的引用,会浪费大量的内存空间,改为
- AuditResult auditResult;
- for(int i=1;i<=domainCount;i++){
- ...
- auditResult=new AuditResult();
- ...
- }
■ 消除字符串连接
■创建长字符串时,总是使用StringBuffter代替String
■预先分配StringBuffer空间 StringBuffer sb = new StringBuffer(5000);
■ StringBuffer 和StringBuilder的区别:
java.lang.StringBuffer线程安全的可变字符序列。一个类似于String 的字符串缓冲区,但不能修改。
StringBuilder,与该类相比,通常应该优先使用java.lang.StringBuilder类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。
3、异常
■ 异常只用于单个真正的错误条件,抛出一个异常和执行一个catch代码块花费是很高的(主要由于当创建一个异常时要获得线程栈的一个快照),只当条件真的异常时才抛出一个异常
■ 抛出异常首先要创建一个新的对象。
Throwable接口的构造函数调用名为fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法检查堆栈,收集调用跟踪信息。
只要有异常被抛出,JVM就必须调整调用堆栈,因为在处理过程中创建了一个新的对象。
异常只能用于错误处理,不应该用来控制程序流程。
■使编译器和运行时最优化,将几个方法调用放在一个try/catch块中,而不是为每个方法调用实现几个try/catch块,例如:
- try{
- Some.method1(); //Difficut for java1.4
- }catch(method1Exception e){
- handle exception 1 // to optimize this code
- }
- try{
- Some.method2(); //Difficut for java1.4
- }catch(method2Exception e){
- handle exception 2 // to optimize this code
- }
- try{
- Some.method3(); //Difficut for java1.4
- }catch(method3Exception e){
- handle exception 3 // to optimize this code
- }
- //应该写为:
- try{
- //Difficut for java1.4
- Some.method1();
- Some.method2();
- Some.method3();
- }catch(method1Exception e){
- handle exception 1
- }catch(method2Exception e){
- handle exception 2
- }catch(method3Exception e){
- handle exception 3
- }
4、尽量指定类的final修饰符
■带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如java.lang.String。其为String类指定final也防止了人们覆盖length()方法。
另外,如果指定一个类为final,则该类所有的方法都是final。Java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关)。此举能够使性能平均提高50%。
5、尽量使用局部变量
■调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快。其他变量,如静态变量、实例变量等,都在堆(Heap)中创建,速度较慢。另外,依赖于具体的编译器/JVM,局部变量还可能得到进一步优化
6、乘法和除法
- for (val =0; val <100000; val +=5) {
- alterX = val * 8;
- myResult = val * 2;
- }
- //优化后:
- for (val =0; val <100000; val +=5) {
- alterX = val << 3;
- myResult = val << 1;
- }
7、array(数组) 和 ArrayList的使用
array([]):最高效;但是其容量固定且无法动态改变;
ArrayList:容量可动态增长;但牺牲效率;
基于效率和类型检验,应尽可能使用array,无法确定数组大小时才使用ArrayList。
ArrayList内部封装了一个Object类型的数组,从一般的意义来说,它和数组没有本质的差别,甚至于ArrayList的许多方法,如Index、IndexOf、Contains、Sort等都是在内部数组的基础上直接调用Array的对应方法。
8、在JAVA + ORACLE的应用系统开发中,java中内嵌的SQL语句尽量使用大写的形式,以减轻ORACLE解析器的解析负担
9、由于JVM的有其自身的GC机制,不需要程序开发者的过多考虑,从一定程度上减轻了开发者负担,但同时也遗漏了隐患,过分的创建对象会消耗系统的大量内存,严重时会导致内存泄露,因此,保证过期对象的及时回收具有重要意义。JVM回收垃圾的条件是:对象不在被引用;然而,JVM的GC并非十分的机智,即使对象满足了垃圾回收的条件也不一定会被立即回收。所以,建议我们在对象使用完毕,应手动置成null,这样也可以提供性能。
10、尽量采用lazy loading 的策略
即在需要的时候才开始创建,例如:
- String str = “aaa”;
- if(i ==1) {
- list.add(str);
- }
- //应替换为:
- if(i ==1)
- {
- String str = “aaa”;
- list.add(str);
- }
11、在使用同步机制时,应尽量使用方法同步代替代码块同步
12、当复制大量数据时,使用System.arraycopy()命令
- java基本优化方法总结
- 程序优化基本方法
- Java字符串操作、基本运算方法等优化策略
- Java 字符串操作、基本运算方法等优化策略
- Java程序基本优化
- Android基本性能优化总结
- numpy基本方法总结
- numpy基本方法总结
- Numpy基本方法总结
- numpy基本方法总结
- 性能优化方法总结
- oracle优化方法总结
- 优化方法(总结)
- 最优化方法总结
- NGUI优化方法总结
- 各类优化方法总结
- 优化方法总结
- Java 程序优化:字符串操作、基本运算方法等优化策略
- Amazon推出了其桌面即服务
- ThinkPHP模板
- ALAssetsLibrary详解
- Managed Extensibility Framework (MEF)
- 动态规划之单调递增最长子序列
- java基本优化方法总结
- 【全】Android官网MediaPlayer章节翻译与总结(上)
- EBS查找功能所在的菜单sql
- C++获取系统时间的方式
- android user模式下如何替换odex文件
- 毕业论文抄袭率过高不着急,修改过关技巧曝光
- 重新配置php+mysql_nginx
- _WIN32_WINNT 与 LPFN_DISCONNECTEX
- 2013秋13级预备队集训练习2 --A - Palindromes