java 优化

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.使用数据库连接池和线程池
这两个池都是用于重用对象的,前者可以避免频繁地打开和关闭连接,后者可以避免频繁地创建和销毁线程

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值