从今天开始我们将进行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布局优化
网友评论