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中跟字符串相关的类主要有:StringStringBuilderStringBuffer。关于这三个类的区别在前面的文章《从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
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

你可能感兴趣的:(Android)