“通用篇”讨论的问题适合于大多数Java应用。
1.1 不用new关键词创建类的实例
用new关键词创建类的实例时,构造函数链中的所有构造函数都会被自动调用。但如果一个对象实现了Cloneable接口,我们可以调用它的clone()方法。clone()方法不会调用任何类构造函数。
在使用设计模式(Design Pattern)的场合,如果用Factory模式创建对象,则改用clone()方法创建新的对象实例非常简单。例如,下面是Factory模式的一个典型实现:
public static Credit getNewCredit() {
return new Credit();
}
改进后的代码使用clone()方法,如下所示:
private static Credit BaseCredit = new Credit();
public static Credit getNewCredit() {
return (Credit) BaseCredit.clone();
}
上面的思路对于数组处理同样很有用。
1.2 使用非阻塞I/O
版本较低的JDK不支持非阻塞I/O API。为避免I/O阻塞,一些应用采用了创建大量线程的办法(在较好的情况下,会使用一个缓冲池)。这种技术可以在许多必须支持并发I/O流的应用中见到,如Web服务器、报价和拍卖应用等。然而,创建Java线程需要相当可观的开销。
JDK 1.4引入了非阻塞的I/O库(java.nio)。如果应用要求使用版本较早的JDK,在这里有一个支持非阻塞I/O的软件包。
请参见Sun中国网站的《调整Java的I/O性能》。
1.3 慎用异常
异常对性能不利。抛出异常首先要创建一个新的对象。Throwable接口的构造函数调用名为fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法检查堆栈,收集调用跟踪信息。只要有异常被抛出,VM就必须调整调用堆栈,因为在处理过程中创建了一个新的对象。
异常只能用于错误处理,不应该用来控制程序流程。
1.4 不要重复初始化变量
默认情况下,调用类的构造函数时, Java会把变量初始化成确定的值:所有的对象被设置成null,整数变量(byte、short、int、long)设置成0,float和 double变量设置成0.0,逻辑值设置成false。当一个类从另一个类派生时,这一点尤其应该注意,因为用new关键词创建一个对象时,构造函数链中的所有构造函数都会被自动调用。
1.5 尽量指定类的final修饰符
带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如java.lang.String。为String类指定final防止了人们覆盖length()方法。
另外,如果指定一个类为final,则该类所有的方法都是final。Java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关)。此举能够使性能平均提高50%。
1.6 尽量使用局部变量
调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快。其他变量,如静态变量、实例变量等,都在堆(Heap)中创建,速度较慢。另外,依赖于具体的编译器/JVM,局部变量还可能得到进一步优化。请参见《尽可能使用堆栈变量》。
1.7 乘法和除法
考虑下面的代码:
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; }
修改后的代码不再做乘以8的操作,而是改用等价的左移3位操作,每左移1位相当于乘以2。相应地,右移1位操作相当于除以2。值得一提的是,虽然移位操作速度快,但可能使代码比较难于理解,所以最好加上一些注释。
分享到:
相关推荐
"通用权限管理系统设计篇"着重探讨了如何设计一个适用于多种场景、能够处理不同用户和角色权限的系统。在这个主题下,我们将深入理解权限管理的核心概念、设计原则以及实现策略。 一、权限管理基础 权限管理主要...
总结来说,《安川机器人-操作说明书-通用篇》是一本全面的指南,不仅提供了安川MOTOMAN NX100机器人的操作指导,更强化了操作过程中的安全意识。作为使用者,必须认真阅读并遵循其中的指示,以确保机器人能够安全、...
精选2021疫情防控工作情况汇报通用篇【一】.pdf
中石化实习报告(通用10篇) 中石化实习报告(通用10篇)全文共29页,当前为第1页。中石化实习报告(通用10篇)全文共29页,当前为第1页。中石化实习报告(通用10篇) 中石化实习报告(通用10篇)全文共29页,当前为...
总的来说,Ollydbg篇通用跳转法是逆向工程和软件调试中的重要技能,熟练掌握这一技术,可以提升我们的分析能力和效率,使我们在面对复杂程序时游刃有余。在实际操作中,不断实践和探索,才能真正领悟其精髓。
【Java实习周报通用25篇】记录了一个实习生在五个礼拜内的学习和成长历程,涵盖了从适应新环境、熟悉基础语法到深入理解高级概念的过程。 第一周,实习生主要适应了公司环境,意识到实习不仅仅是学习新知识,而是...
2020 考研数学 复习全书 基础篇 数学一、二、三通用 李永乐 王式安 章纪民 By 萧曵2020 考研数学 复习全书 基础篇 数学一、二、三通用 李永乐 王式安 章纪民 By 萧曵
《一年级作文大全【通用8篇】》这份文档恰好为我们提供了一个绝佳的视角,通过分析其中包含的八篇作文,我们能够总结出一系列有助于学生提升写作能力的知识点。 首先是观察与描写的能力。在这些作文中,学生通过...
部编版一年级语文下册《荷叶圆圆》说课稿(通用5篇)
正如这篇标题为《个人生活总结参考范文通用篇.doc》的文档所展示的,作者通过自己的亲身经历为我们提供了一个生动而具体的案例,展现了一个人从志愿者到政府工作人员角色转变的心路历程。 在这个过程中,作者首先...
2021第一季度个人工作总结通用版5篇.docx
2022小学《开学第一课》教学教案通用10篇.docx
本篇将深入探讨一款通用的WEB网站后台模板,该模板以HTML格式呈现,包含TAB菜单和折叠菜单功能,极大地提升了后台的用户体验。 【描述】:这款通用后台模板旨在为各种类型的网站提供一个标准化的管理界面,无论你是...
开学第一课防疫观后感(通用4篇).doc
疫情开学第一课观后感(通用3篇).doc
开学第一课疫情观后感(通用3篇).doc
本篇文章将详细探讨如何设计一个通用的权限控制系统,旨在为数据库结构提供有效的权限管理方案。 首先,我们来理解权限管理的基本概念。权限管理通常涉及到角色(Role)、用户(User)和资源(Resource)三要素。...
在第一篇文章中,作者描述了在公交车上主动为老奶奶让座的行为,强调了尊敬老人的重要性。这是一个社会道德和传统美德的体现,也是信息技术时代不应忽视的人文关怀。 2. **环保意识**: 第二篇文章讲述了温泉鱼疗的...
在第一篇文章中,作者描述了五一劳动节与家人庆祝爸爸生日的情景,体现了家庭的温馨和节日的快乐。通过这个场景,我们可以引导孩子学习如何描述事件、刻画人物和表达情感。 第二篇文章讲述了作者和弟弟去乒乓球馆...