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.避免浮点类型的使用