Android 编码规范:(五)避免创建不必要的对象
试比较以下两行代码在被多次反复执行时的效率差异:由于String被实现为不可变对象,JVM底层将其实现为常量池,既所有值等于"stringette" 的String对象实例共享同一对象地址,而且还可以保证,对于所有在同一JVM中运行的代码,只要他们包含相同的字符串字面常量,该对象就会被重用。
我们继续比较下面的例子,并测试他们在运行时的效率差异:
- Boolean b = Boolean.valueOf("true");
- Boolean b = new Boolean("true");
前者通过静态工厂方法保证了每次返回的对象,如果他们都是true或false,那么他们将返回相同的对象。换句话说,valueOf将只会返回Boolean.TRUE或Boolean.FALSE两个静态域字段之一。而后面的Boolean构造方式,每次都会构造出一个新的Boolean实例对象。这样在多次调用后,第一种静态工厂方法将会避免大量不必要的Boolean对象被创建,从而提高了程序的运行效率,也降低了垃圾回收的负担。
继续比较下面的代码:
public class Person { private final Date birthDate; public boolean isBabyBoomer { Calender c = Calendar.getInstance(TimeZone.getTimeZone("GMT")); c.set(1946,Calendar.JANUARY,1,0,0,0); Date dstart = c.getTime(); c.set(1965,Calendar.JANUARY,1,0,0,0); Date dend = c.getTime(); return birthDate.compareTo(dstart) >= 0 && birthDate.compareTo(dend) < 0; } } public class Person { private static final Date BOOM_START; private static final Date BOOM_END; static { Calender c = Calendar.getInstance(TimeZone.getTimeZone("GMT")); c.set(1946,Calendar.JANUARY,1,0,0,0); BOOM_START = c.getTime(); c.set(1965,Calendar.JANUARY,1,0,0,0); BOOM_END = c.getTime(); } public boolean isBabyBoomer() { return birthDate.compareTo(BOOM_START) >= 0 && birthDate.compareTo(BOOM_END) < 0; } }
改进后的Person类只是在初始化的时候创建Calender、TimeZone和Date实例一次,而不是在每次调用isBabyBoomer方法时都创建一次他们。如果该方法会被频繁调用,效率的提升将会极为显著。
集合框架中的Map接口提供keySet方法,该方法每次都将返回底层原始Map对象键数据的视图,而并不会为该操作创建一个Set对象并填充底层Map所有键的对象拷贝。因此当多次调用该方法并返回不同的Set对象实例时,事实上他们底层指向的将是同一段数据的引用。
在该条目中还提到了自动装箱行为给程序运行带来的性能冲击,如果可以通过原始类型完成的操作应该尽量避免使用装箱类型以及他们之间的交互使用。见下例:
- public static void main(String[] args) {
- Long sum = 0L;
- for (long i = 0; i < Integer.MAX_VALUE; ++i) {
- sum += i;
- }
- System.out.println(sum);
- }
本例中由于错把long sum定义成Long sum,其效率降低了近10倍,这其中的主要原因便是该错误导致了2的31次方个临时Long对象被创建了。
Android 编码规范:(五)避免创建不必要的对象相关推荐
- 【转】Android编码规范建议18条
转自:http://www.chinaz.com/design/2015/0908/443732.shtml Android编码规范建议18条 适合手机app设计师和android 工程师阅读. 1. ...
- Android编码规范_优码客软件
Android编码规范 日期 作者 备注 2013年7月30日星期二 王明东 初稿 前 言 编写本规范的目的是为了进一步规范Android软件编程风格,提高软件源程序的可读性.可 ...
- Android 编码规范
一.命名规范 1.1包命名 命名规则:一个唯一包名的前缀总是所有小写ASCII字母而且是一个顶级域名,一般是com,edu,gov,mil,net,org等. 规约:以公司为准.通常是com.公司名. ...
- Android 编码规范:(七)避免使用终结方法
任何事情都存在其一定的双面性或者多面性,对于C++的开发者,内存资源是需要手工分配和释放的,而对于Java和C#这种资源托管的开发语言,更多的工作可以交给虚拟机的垃圾回收器来完成,由此C++程序得到了 ...
- Android 编码规范:(六)消除过期的对象引用
尽管Java不像C/C++那样需要手工管理内存资源,而是通过更为方便.更为智能的垃圾回收机制来帮助开发者清理过期的资源.即便如此,内存泄露问题仍然会发生在你的程序中,只是和C/C++相比,Java中内 ...
- IDesign C#编码规范(五)
4 Framework特别指导 Framework Specific Guidelines 4.1 数据访问 Data Access 1. 总是使用类型安全的数据集或者数据表.避免使用原始的ADO.N ...
- 第五章 创建和编辑AutoCAD对象
创建二维对象 图形对象创建于ModelSpace集合.PaperSpace集合或Block对象中. import win32com.client AcadApp = win32com.client.D ...
- Android安全编码规范
1.目的 为使系统开发人员能够编写符合安全要求的代码,以降低代码安全漏洞,减少代码被利用的可能性,从而提升各系统安全水平,符合国家安全合规性要求,保障产品安全稳定运营以及信息安全,特制定本规范. 2. ...
- 【朝花夕拾】Android编码风格篇
结合51CTO学院中张凌华老师讲的编码风格课程,对自己平时工作中的形成的一些编码风格做一些总结. 一. 项目开发目录命名: Requirement - 需求相关文档 Design - 设计 Plann ...
最新文章
- Color the ball(HDU1556)树状数组
- 中国溶解浆市场深度调研及投资战略决策报告2022-2028年版
- 利用PowerShell进行数据库部署冒烟测试
- java中的可检查和不检查_检查Java测试中发生了什么
- 面试了57位高级产品经理,我发现混得好的人都有这个特质!
- 2457: 很简单的一道题
- php 为什么ctrl加 没用,电脑ctrl+c不能用怎么办
- 【Spring】Unable to start ServletWebServerApplicationContext due to miss ServletWebServerFactory bean
- 基于Spring Security的认证授权_连接数据库认证_Spring Security OAuth2.0认证授权---springcloud工作笔记128
- 基于visual Studio2013解决C语言竞赛题之0701排队输出
- 基于Redis实现Spring Cloud Gateway的动态管理
- 让云触手可及——微软云计算解决方案白皮书
- 反三角函数在线计算机,arcsin计算器(反三角函数计算器在线)
- cruzer php sandisk 闪迪u盘量产工具_SanDisk Cruzer CZ36闪迪U盘 怎么量产
- 三层交换技术与链路聚合
- python除法程序_Python中的除法
- docker opengrok
- java 省市联动_Java 地区字典之省市区三级联动 (一)
- 2018互联网行业寒冬裁员实录:整个11月 公司微信群里消失了200多人
- 新手小白如何用linux云服务器搭建wordpress个人网站
热门文章
- cas登录成功返回用户更多信息
- 一个电脑安装多个系统的几个办法
- java 对象访问权限_Java面向对象--访问权限
- Android中关于Adapter的使用(下)BaseAdapter
- Java虚拟机学习 - 体系结构 内存模型
- Ext4中获取下拉框的值
- android中The connection to adb is down .. You must restart adb and Eclipse问题的解决
- 洛谷——P1495 曹冲养猪
- [20170612]FOR ALL COLUMNS SIZE repeat(11g).txt
- Microsoft.Web.RedisSessionStateProvider 运行异常问题