1.尽量不要在循环内new对象,尽量减少对变量的重复计算。
尽量不要在循环体内用try catch,应把Try/Catch放在循环最外层。
final int len=9800;
String[] arr=new String[len];
Random r=new Random();//写到循环外
for(int i=0;i<len;i++) {//把循环体中的arr.length改为len
arr[i]+=r.nextInt();
}
实在要写到循环里,就把对象引用放外面:
final int len=1391800;
String[] arr=new String[len];
StringBuffer str;//在循环外不new
for (int i = 0; i < len; i++) { //
str=new StringBuffer();//在内存中只有1份StringBuffer对象引用,否则为len份
str.append(i+"");
str.append("ok");
arr[i]=str.toString();
}
重复计算的例子,在hbase中插入数据用到:
put.add("column1".getBytes(), Bytes.toBytes("name"), Bytes.toBytes("zheng"));
改成,以防止重复计算:
final byte[]CF1="column1".getBytes();
final byte[]NAME="name".getBytes();
put.add(CF1, NAME, Bytes.toBytes("zheng"));
还可以改成static,引用到static语句的越多,效率越高;但要慎用,gc通常是不会回收这个static对象所占有的堆内存的,直到程序终止。
2.字符串拼接速度,String<StringBuffer<stringBilder,但多线程不安全
StringBuffer str;
for (int i = 0; i < len; i++) {
str=new StringBuffer(256);//指定数组缓冲容量
str.append(i+"wo是谁,是谁,我叫什么名字,我没什么特长,只会吗代码是谁,我叫什么名字,我没什么特长,只会吗代码");
arr[i]=str.toString();
}
String 的Equals方法:("123".equals(str)) 如果改为str.equals("123")可能报空指针异常
把一个基本数据类型转为字符串,基本数据类型.toString()是最快的方式、String.valueOf(数据)次之、数据+”"最慢
3.尽量使用局部变量。
调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快。其他变量,如静态变量,实例变量等,都在堆(Heap)中创建,速度较慢。
尽量使用基础类型代替对象。int i=1//存储在栈上 Integer i=1;//堆上
采用在需要的时候才开始创建的策略。 懒
例如:
String str="abc";
if(i==1){ list.add(str);}
应修改为:
if(i==1){String str="abc"; list.add(str);}
4.使用移位操作来代替乘法和除法
public class sdiv {
public static final int num = 16; //尽量使用final修饰符
public void calculate(int a) {
int div = a >> 2; // a/4
int div2 = a >> 3; // a/8
int temp = a / 3; // 不能转换成位移操作
int c=a<<4; // a*16
}
}
不要使用 i % 2 == 1 来判断是否是奇数,因为i为负奇数时不成立,请使用 i % 2 != 0 来判断是否是奇数,
或使用 高效式 (i & 1) != 0来判断。
计算一天中的微秒数,:
long microsPerDay = 24L * 60 * 60 * 1000 * 1000;// 正确结果应为:86400000000
加上L,防止计算过程中溢出。
5.在字符串相加的时候,使用 ' ' 代替 " ",如果该字符串只有一个字符的话
string = "abc" + 'd'
6.使用条件操作符替代"if (cond) return; else return;" 结构
public int method(boolean isdone) {
return (isdone ? 0 : 10);
}
7.array(数组)和ArrayList的使用。
array 数组效率最高,但容量固定,无法动态改变,ArrayList容量可以动态增长,但牺牲了效率。
8.HaspMap的遍历。
Map<String, String[]> paraMap = new HashMap<String, String[]>();
for( Entry<String, String[]> entry : paraMap.entrySet() )
{
String appFieldDefId = entry.getKey();
String[] values = entry.getValue();
}
利用散列值取出相应的Entry做比较得到结果,取得entry的值之后直接取key和 value。
9.单线程应尽量使用 HashMap, ArrayList,除非必要,否则不推荐使用HashTable,Vector,她们使用了同步机制,而降低了性能。
10.在使用同步机制时,应尽量使用方法同步代替代码块同步。
11.在使用io或者数据库时一定要注意close流,这些数据都是大对象
建议对资源的close()建议分开操作
try{
XXX.close();
YYY.close();
}catch (Exception e)
建议修改为:
try{ XXX.close(); }catch (Exception e) { ... }try{ YYY.close(); }catch (Exception e) { ... }
万一XXX.close()抛异常了,那么就进入了cath块中 了,YYY.close()不会执行,YYY这块资源就不会回收了,一直占用着,这样的代码一多,是可能引起资源句柄泄露的。而改为下面的写法之后,就保 证了无论如何XXX和YYY都会被close掉。
12.使用数据库连接池和线程池
这两个池都是用于重用对象的,前者可以避免频繁地打开和关闭连接,后者可以避免频繁地创建和销毁线程
尽量不要在循环体内用try catch,应把Try/Catch放在循环最外层。
final int len=9800;
String[] arr=new String[len];
Random r=new Random();//写到循环外
for(int i=0;i<len;i++) {//把循环体中的arr.length改为len
arr[i]+=r.nextInt();
}
实在要写到循环里,就把对象引用放外面:
final int len=1391800;
String[] arr=new String[len];
StringBuffer str;//在循环外不new
for (int i = 0; i < len; i++) { //
str=new StringBuffer();//在内存中只有1份StringBuffer对象引用,否则为len份
str.append(i+"");
str.append("ok");
arr[i]=str.toString();
}
重复计算的例子,在hbase中插入数据用到:
put.add("column1".getBytes(), Bytes.toBytes("name"), Bytes.toBytes("zheng"));
改成,以防止重复计算:
final byte[]CF1="column1".getBytes();
final byte[]NAME="name".getBytes();
put.add(CF1, NAME, Bytes.toBytes("zheng"));
还可以改成static,引用到static语句的越多,效率越高;但要慎用,gc通常是不会回收这个static对象所占有的堆内存的,直到程序终止。
2.字符串拼接速度,String<StringBuffer<stringBilder,但多线程不安全
StringBuffer str;
for (int i = 0; i < len; i++) {
str=new StringBuffer(256);//指定数组缓冲容量
str.append(i+"wo是谁,是谁,我叫什么名字,我没什么特长,只会吗代码是谁,我叫什么名字,我没什么特长,只会吗代码");
arr[i]=str.toString();
}
String 的Equals方法:("123".equals(str)) 如果改为str.equals("123")可能报空指针异常
把一个基本数据类型转为字符串,基本数据类型.toString()是最快的方式、String.valueOf(数据)次之、数据+”"最慢
3.尽量使用局部变量。
调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快。其他变量,如静态变量,实例变量等,都在堆(Heap)中创建,速度较慢。
尽量使用基础类型代替对象。int i=1//存储在栈上 Integer i=1;//堆上
采用在需要的时候才开始创建的策略。 懒
例如:
String str="abc";
if(i==1){ list.add(str);}
应修改为:
if(i==1){String str="abc"; list.add(str);}
4.使用移位操作来代替乘法和除法
public class sdiv {
public static final int num = 16; //尽量使用final修饰符
public void calculate(int a) {
int div = a >> 2; // a/4
int div2 = a >> 3; // a/8
int temp = a / 3; // 不能转换成位移操作
int c=a<<4; // a*16
}
}
不要使用 i % 2 == 1 来判断是否是奇数,因为i为负奇数时不成立,请使用 i % 2 != 0 来判断是否是奇数,
或使用 高效式 (i & 1) != 0来判断。
计算一天中的微秒数,:
long microsPerDay = 24L * 60 * 60 * 1000 * 1000;// 正确结果应为:86400000000
加上L,防止计算过程中溢出。
5.在字符串相加的时候,使用 ' ' 代替 " ",如果该字符串只有一个字符的话
string = "abc" + 'd'
6.使用条件操作符替代"if (cond) return; else return;" 结构
public int method(boolean isdone) {
return (isdone ? 0 : 10);
}
7.array(数组)和ArrayList的使用。
array 数组效率最高,但容量固定,无法动态改变,ArrayList容量可以动态增长,但牺牲了效率。
8.HaspMap的遍历。
Map<String, String[]> paraMap = new HashMap<String, String[]>();
for( Entry<String, String[]> entry : paraMap.entrySet() )
{
String appFieldDefId = entry.getKey();
String[] values = entry.getValue();
}
利用散列值取出相应的Entry做比较得到结果,取得entry的值之后直接取key和 value。
9.单线程应尽量使用 HashMap, ArrayList,除非必要,否则不推荐使用HashTable,Vector,她们使用了同步机制,而降低了性能。
10.在使用同步机制时,应尽量使用方法同步代替代码块同步。
11.在使用io或者数据库时一定要注意close流,这些数据都是大对象
建议对资源的close()建议分开操作
try{
XXX.close();
YYY.close();
}catch (Exception e)
建议修改为:
try{ XXX.close(); }catch (Exception e) { ... }try{ YYY.close(); }catch (Exception e) { ... }
万一XXX.close()抛异常了,那么就进入了cath块中 了,YYY.close()不会执行,YYY这块资源就不会回收了,一直占用着,这样的代码一多,是可能引起资源句柄泄露的。而改为下面的写法之后,就保 证了无论如何XXX和YYY都会被close掉。
12.使用数据库连接池和线程池
这两个池都是用于重用对象的,前者可以避免频繁地打开和关闭连接,后者可以避免频繁地创建和销毁线程