android如何优化代码,Android优化技术(一)之代码优化篇

从今天开始我们将进行Android优化技术方面的总结,我们将从不同的视角进行优化技术的分析总结。这一篇是从代码视角进行优化,这些都是平时编码中总结的经验,如有错误或更好的方法建议欢迎各位批评指证。接下来,让我们进入主题吧。

一、循环的优化

1、不要在for循环的第二部分语句调用函数

在开发过程中,我们经常会用for循环来遍历数组操作,在程序中我们有可能会这样写:

for(int i = 0;i < list.size();i++)

{

//执行重复操作

}

这样的写法会一直执行list.size()方法,从而会消耗更多的性能,最优写法应改为:

for(int i =0,len = list.size();i < len;i++)

{

//执行循环操作

}

2、不要在循环体内实例化变量

在实际开发中,我们经常会遇到要把一系列对象添加到List当中,比如我们在给Adapter类提供数据源的场景下,我们通常会这样做:

for(int i = 0;i < count;i++)

{

//创建对象

MsgBean bean = new MsgBean();

//添加bean到list

list.add(bean);

}

这样的写法,会重复定义大量变量,消耗内存资源,所以我们应该在循环体外面定义引用变量,最优写法应改为:

MsgBean bean;

for(int i = 0;i < count;i++)

{

//创建对象

bean = new MsgBean();

//添加bean到list

list.add(bean);

}

二、尽量使用clone()代替new的方式创建对象

我们在使用new关键字创建对象时,继承树里的整个构造函数链都会被自动调用,并且总是从Object类开始执行直到当前类,因为java里所有类都继承自Object类。但,如果使用clone()方法来实例化一个对象则不会调用构造函数。前提是该类要实现Cloneable接口。在使用工厂设计模式的场景下,应该使用clone()方法代替new关键字,例如:

public static Message getInstance(){

return new Message();

}

最优写法应改为:

private static Message msg = new Message();

public static Message getInstance(){

return (Message)msg.clone();

}

三、字符串拼接操作优化

在java中跟字符串相关的类主要有:String、StringBuilder和StringBuffer。关于这三个类的区别在前面的文章《从Java源码角度彻底理解String,StringBuilder和StringBuffer的区别》里已经做过分析,此处不再赘述。如果是静态字符串拼接,则使用“+”,例如:

String str = "hello" + " world" + " test";

因为,这种形式的字符串拼接编译器最终会优化成“hello world test”,先检查常量池中是否已经有“hello world test”字符串,如果有则不再创建对象。如果是动态拼接,即拼接的字符串中有变量,则使用StringBuilder和StringBuffer,其中,StringBuffer是线程安全的,所以稍微要比StringBuilder要慢点。例如,

String result = "";

StringBuilder sb = new StringBuilder();

sb.append("hello")

.append("world")

.append("Android");

result = sb.toString();

四、若一个成员方法不需要Override,也不需要访问成员变量,则用static方法

因为,要实现多态功能,java里要维护一张类似C++里的虚函数表一样的表,所以,当一个方法不需要Override的时候则尽量使用static来修饰,如我们经常使用工具类Utils里的方法则可以全部定义成static方法。例如,

public static String getName(){

return "hello";

}

五、数据复制使用System.arrayCopy()方法

在开发过程中,我们经常会用到数据复制功能,在这里我们推荐System.arrayCopy()这个native方法。因为是native方法,其性能要比普通方法高得多。像上面提到的StringBuilder、StringBuffer里底层也使用了System.arrayCopy(),还有ArrayList和Vector底层也使用该native方法,来实现数据的复制操作。

public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

参数说明:

src:源数组; srcPos:源数组要复制的起始位置;

dest:目的数组; destPos:目的数组放置的起始位置; length:复制的长度。

最后,此处只是简单的列举了日常编码中经常用到的一些优化技巧,并不是全部,还有很多代码优化技巧就不再罗列了,比如I/O操作,网络请求等等。不过,不管何种优化技巧都有一个不变的宗旨可遵循,就是一起围绕时间和空间的角度来优化:

(1)尽最大可能减少语句的执行条数;

(2)尽最大可能减少变量的创建数目。

(3)防止内存泄露

关于前2条,在上述的优化方法技巧中都得到了体现。关于接下来Android优化技术的系列文章,我们将从以下几个视角去分析总结,敬请关注:

1.内存管理,即内存的分配和回收

2.程序设计,即常用数据结构与算法,设计模式

3.运算符使用技巧

4.UI布局优化

文/kinbos(简书作者) 原文链接:http://www.jianshu.com/p/83e159cdb32d 著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值