Android应用开发揭秘学习笔记-优化

java语法的角度:
正确的运用java.lang.String 和java.util.Vector
1.尽量指定类的final,java编译器会寻找机会内联(inline)所有的final方法
2.尽量重用对象,String出现字符串连接情况应用StringBuffer代替
3.尽量使用局部变量。调用方法时传递参数以及在调用中创建的临时变量都保存
    在栈里面(stack),其他静态,实例变量都在堆(Heap)里面
4.不要重复初始化变量,特别派生类的时候会发生
5.在Oracle中尽量用大写,可以减轻Oracle解析器的负担
6.使用数据库连接,I/O流要注意关闭
7.手动把使用完的对象设为null
8.同步机制时,应该尽量使用方法同步代替代码块同步。
9.尽量减少对变量的重复计算
 例如:for(int i = 0;i<list.size;i++){}
  换成:for(int i = 0,int len=list.size();i < len;i++){}
10.尽量采用lazy loading的策略,在需要的时候才开始创建
 例如:
  String str = "aaa";
  if(i == 1){
   list.add(str);
  }
  换成:
  if(i == 1){
  String str = "aaa";
   list.add(str);
  }
11.慎用异常,异常只能用于错误处理,不应该用来控制流程
12.不要在循环中使用try/catch
13.使用一个合适的容量值来初始化StringBuffer永远是一个最佳选择,因为当他满了会增加(2*旧值+2)的容量
14.合理使用Vector,先从尾部删除元素,其实也可以removeAllElements()
15.当复制大量数据时,使用System.arraycopy()命令
16.代码重构:增强代码可读性
17. 不用new创建实例
 用new会调用所有构造函数,但如果对象实现Cloneable接口,可以调用他clone()方法。
 这样不会调用任何类的构造函数。例如工厂模式
 public static Credit getNewCredit(){
  return new Credit();
 }
 改进后使用clone()方法,如下
 private static Credit BaseCredit = ne Credit();
 public static Credit getNewCredit(){
  return (Credit)BaseCredit.clone();
 }
18.乘除法改为位运算例如5*4可以改成5<<2
19.不要将数组声明为public static final;
20.HshMap的遍历操作每次循环都取值,比从keyset取值好
21.array(数组)和ArryList的使用,array([]);最高效,但是其容量固定且无法动态改变
 ArrayList容量可以改变不过牺牲了效率
22.尽量使用HashMap和ArrayList,除非必要,不推荐使用HashTable和Vector,后者使用同步机制,而导致性能开销
23.StringBuffer是线程安全而StringBuilder不是


高级优化:
 1.对象池:
  Enemy[5] enemy = new Enemy[5];
  for(int i = 0;i<5;i++){
   enemy[i]=new Enemy();
  }
  在类Enemy里增加标志属性used和带参数的reset方法使对象可重置到初始状态
 2.尽可能使用基本类型代替对象
  例如:将子弹抽象成Bullet类,定义代表子弹对象池,在每一个gameloop中
  将Bullet对象的纵坐标减少一定数值,由于基本数据类型的效率更高
  可以
  int[][] bullet = new int[2][10];//假设屏幕同时10个子弹
  for(int i=0;i<10;i++){
   bullet[0][i] =999;//对应Bullet对象的xposition属性
   bullet[1][i] =999;//对应Bullet对象的yposition属性
  }
  在每一个gameloop中:
   while(run){
    for(int i = 0;i<10;i++){
     if(bullet[1][i]==99){
     //重置为发射子弹飞机当前的位置
     bullet[0][i]=myPlane.getXposition();
     bullet[1][i]=myPlane.getYposition();
     }else{
      //当前使用的子弹让其纵坐标减少
      bullet[i][j]-=10;
     }
    }
   }
 3.用简单的数值计算代替复杂的函数计算
  例如保存正余弦值
  public static int iAngle[] = new int[][]{
   //根据游戏需要定义不同的精度,可以从0连续定义到45°
   //因为SinX= Cos(90-x),所以不必重复定义46°到90°的函数值
   //度数,余弦,正弦
   {0,1000,0},
   {5,996,87},
   {10,985,174},
   {40,766,643},
   {45,707,707},
  }
 
 int[][] enemyBullet = new int[4][20];//假设屏幕同时显示20颗子弹
 int size = enemyBultet.lenth;
 for(int i = 0;i<size;i++){
  enemyBullet[0][i]=999;//对应敌机子弹的x坐标
  enemyBullet[1][i]=999;//对应敌机子弹的y坐标
  enemyBullet[2][i]=999;//对应敌机子弹的x坐标位移量
  enemyBullet[3][i]=999;//对应敌机子弹的y坐标位移量
 }
 按照程序的需要从数组iAngle中把特定的数值赋值到位移量enemyBullet[2][i],enemyBullet[3][i]中
 int size = enemyBullet.length;
 for(int i=0;i<size;i++){
  enemyBullet[0][i]+=enemyBullet[2][i];
  enemyBullet[1][i]+=enemyBullet[3][i];
  
 }
 
 
Android的高效开发
1.尽可能避免创建对象
 1).当从原始的输入数据中提取字符串时,试着从原始字符串返回一个
  子字符串,而不是创建一份复本,你将会创建一个新的字符串对象,但和你原始数据共享数据空间
 2).如果你有一个返回字符串的方法,你应该知道无论如何返回的结果是StringBuffer,改变你的
  函数的定义和执行,让函数直接返回而不是通过创建一个临时的对象。
 3).一个Int类型比一个Integer数组好,同样两个Int类型数组比一个(int,int)对象数组效率高
 越少的创建意味着越少的垃圾回收,更好的提高用户体验

2.使用自身方法
 当处理字符串的时候,不要犹豫,尽可能多使用String.indexOf(),String.lastIndexOf()这些对象
 自身带有的方法,因为这些方法使用C/C++来实现,要比一个java循环中做的快
3.使用静态方法优于虚拟优于接口
4.尽可能避免使用内在的Get,Set方法
 在Android编程中会产生很多代价,所以我们在外部调用使用get,set,但在内部直接调用
5.缓冲属性调用
 for(int i = 0;i< shit.mCount;i++){
  dumpItem(this.mItems[i]);
 }
 应该写成:
 int count = this.mCount;
 Item[] items = this.mIems;
 for(int i = 0;i<count;i++){
  dumpItems(items[i]);
 }

6.声明Final常量
 static int intVal = 100;
 static String strVal = "Hello,world";
 当类首次使用,编译器会调用一个类初始化方法<clinit>,将100存入变量intVal,并且
为strVal在类文件字符常量表中提取一个引用,当这些值在后面引用时,会直接属性调用,我们可以用final改进代码
 static final int intVal = 100;
 static final String strVal = "Hello,world";
 这样将不会调用<clinit>方法,直接由虚拟机处理,代码访问intVal将会使用Integer类型的100
访问strVal将使用相对节省的"字符串常量"代替一个属性调用
7.谨慎使用增强型For循环语句
8.避免枚举类型
 好用可是尺寸跟速度方面代价就很高
9.通过内联类使用包空间
10.避免浮点类型的使用
 
 
 
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值