避免建立对象
- 代码流程优化
在if语句中判断是否创建对象 - 对象声明技巧
在使用Vector时,建议初始化时声明其大小
Vector v = new Vector(40);
//or
Vector v = new Vector(40,25);
- 不要多次声明对象
建议这样的写法:
public class x{
private Vector v;
public x(){
v = new Vector();
}
}
我们应该尽量避免创建短期的临时对象,越少的对象创建意味着越少的垃圾回收。
优化方法调用
- 使用自身方法,如String.indexOf()
- 使用虚拟优于使用接口
- 使用静态优于使用虚拟
静态方法会被更快的调用,因为它不需要一个虚拟函数导向表。 - 避免使用内在的get,set方法
内部变量可以自己调用,可以不需要通过这两个方法调用 - 建议使用getBytes()
- 避免使用InetAddress.getHostAddress()
它会生成许多中间字符串来返回主机地址 - 避免使用DategramPacket.getSocketAddress()
优化代码变量
- StringBuffer的使用
当需要连接String时,不要这样操作:
String str = "welcome"+"to"+"shenzhen";
应当写成:
StringButter sb = new StringButter(50);
sb.append("welcome");
sb.append("to");
sb.append("shenzhen");
- 声明Final常量
- 避免使用列举类型
public class Foo{
public enum Shrubbery{
GROUND,CRAWLING,HANGING
}
}
上述代码会转变成一个900字节的class文件(Foo$Shrubbery.class)。当第一次使用时,类的初始化要调用方法去描述列举的每一项,每一个对象都要有它自身的静态空间,整个被储存在一个数组里(一个叫$VALUE的静态数组)。
- 避免使用枚举
- 在访问内部类时,可以将内部类访问的变量和函数声明由私有改为包范围。
优化代码过程
- 慎重使用增强型for循环语句
增强型for循环就是”for-each循环“,特别是和Iterable一起使用时。 - 通过内联类使用包空间
- 避免浮点类型的使用
- 避免在条件判断语句中重复调用函数*
这个是重点,错误演示:
for(int i=0;i<s.length;i++){
char c = s.charAt(i);
}
正确形式:
int j = str.length();
for(int i=0;i<j;i++){
char c = s.charAt(i);
}
提高Cursor查询性能
while(cursor.moveToNext){
String name = cursor.getString(cursor.getColumnIndex(People.Name));
String phoneNo = cursor.getString(cursor.getColumnIndex(People.Number));
}
上述代码在查询量一多的时候,运行速度会相当慢。
int nameIndex = cursor.getColumnIndex(People.Name);
int numberIndex = cursor.getColumnIndex(People.Number);
while(cursor.moveToNaxt){
String name = cursor.getString(nameIndex);
String phoneNo = cursor.getString(numberIndex);
}
这样经过改造后,查询时运行速度明显提升了。
使用ContentProvider共享数据
可以通过ContentProvider来封装数据的query查询,添加insert,删除delete和更新update,而无须用复杂的SQLite。提高了程序运行效率。
public class NotePadProvider extends ContentProvider{
...
private static class DatabaseHelper extends SQLiteOpenHelper{
DatebaseHelper(Context context){
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@override
public void onCteate(SQLiteDatabase db){
db.execSQL(...);
}
...
}
private DatabaseHelper mOpenHelper;
@override
public boolean onCreate(){
mOpenHelper = new DatabaseHelper(getContext());
return true;
}
@override
public Cursor query(Uri uri, String projection, String selection, String[] selectionArgs, String sortOrder){
...
SQLiteDatabase db = mOpenHelper.getReadableDatabase();
Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);
c.setNotificationUri(getContext().getContentResolver(), uri);
return c;
}
}
要想开发出高效的ContentProvider存储应用,就要尽可能的减少SQL语句的编写在外部操作,封装成方法,这样有关SQL语言的执行在DatabaseHelper中也被简化和分离出来了,而SQL语句主要是体现在选择表的字段,where这样的条件限定语句,这大大减少了我们日常开发工作量,从而优化了工作。