Java开发过程中代码优化建议

1:尽量避免使用静态变量

当某个对象被定义为static变量所引用,那么GC通常不会回收这个对象所占有的内存,如

publi class A{
private static B b = new B();
}

此时静态变量b的生命周期和A类同步,如果A类不卸载,那么b对象会常驻内存,直到程序终止。
2:尽量避免过多过常地创建java对象

尽量避免在经常调用的方法、循环中new 对象,由于系统不仅要花费时间来创建对象,要占用过多的堆内存,而且还要花时间对这些对象进行垃圾回收和处理,
在我们可以控制的范围内,最大限度地重用对象,最好能用基本的数据类型或数组来替代对象
3:尽量使用final修饰符

带有final修饰符的类是不可派生的。在java核心API中,有许多应用final的列子,例如java、lang、string,为String类指定final防止了使用者覆盖
length()方法。另外,如果一个类是final的,则该类所有方法都是final的。java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关),
此举能能够使性能平均提高50%。
如:让访问实例内变量的geter/setter方法变成final:
简单的getter/setter方法应该被置成final,这会告诉编译器,这个方法不会被重载,所以,可以变成“inlined”,例子:

clsss MAF{
private int _size;
public void setSize(int size){
_size = size;
}
更正为
clsss MAF_fixed{
private int _size;
final public void setSize(int size){
_size = size;
}
}

4.使用基本数据类型代替对象

String str = "hello";

上面这种方式会创建”hello“字符串,而且JVM的字符缓存池还会缓存这个字符串;

String str= new String(”hello");

5.尽量合理的创建HashMap
当你创建一个比较大的hashMap时,充分利用这个构造函数。

public HashMap(int initialCapacity, float loadFactor);

避免HashMap多次进行hash重构,扩容是一件很耗费性能的事,在默认中initialCapacity只用16,而loadFactor 是0.75,需要多大的容量,你最好能准确的
估计你所需要的最佳大小,同样的HashTable,Vectors也是一样的道理。
6.尽量减少对变量的重复计算
如:

for(int i = 0;i < list.size(); i ++)

应改成:

for(int i = 0,len=list.size(); i < len; i++)

并且在循环中应该避免使用复杂的表达式,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而循环条件值不变的话,程序将会运行的更快
7.尽量使用移位来替代乘法和除法。
“/”是一个代价和高的操作,使用移位的操作将会更快和更有效
如:

int num = a/4;
int  num2 = a/8;

int num = a*4;
int  num2 = a*8;

应该改为:

int num = a>> 2;
int num2 = a >>3;
/
int num = a<<4;
int  num2 = <<8;

但注意的是移位应添加注释,因为移位操作不直观,比较难理解。
8.尽量避免使用split
除非是必须的,否者应该避免使用split,split由于支持正则表达式,所以效率比较低,如果是频繁的几十,几百万的调用将会耗费大量资源,如果确实需频繁
的调用split,可以考虑使用apache的StringUtils.split(String,char),频繁的可以缓存结果。
9.不要再循环中使用Try/catch语句,应该把Try/Catch放在循环最外层。
Error是获取系统错误的类,或者说是虚拟机错误的类。不是所有的错误Exception都能获取到的,虚拟机报错Exception就获取不到,必须用Error获取。
10.尽量重用对象。
特别是 String 对象的使用,出现字符串连接时应该使用 StringBuilder/StringBuffer 代替。由于 Java 虚拟机不仅要花时间生成对象,以后可能还需要花时间对这些对象进行垃圾回收和处理,因此生成过多的对象将会给程序的性能带来很大的影响。
11.循环内不要不断创建对象引用。
在这里插入图片描述
12.不要将数组声明为 public static final
因为这毫无意义,这样只是定义了引用为 static final,数组的内容还是可以随意改变的,将数组声明为 public 更是一个安全漏洞,这意味着这个数组可以被外部类所改变。
13.尽量在合适的场合使用单例
使用单例可以减轻加载的负担、缩短加载的时间、提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面:
控制资源的使用,通过线程同步来控制资源的并发访问;
控制实例的产生,以达到节约资源的目的;
控制数据的共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信;
14.字符串变量和字符串常量 equals 的时候将字符串常量写在前面,这样可以避免空指针
建议使用 if (i == 1) 而不是 if (1 == i) 的方式。
15.不要对数组使用 toString() 方法。
本意是想打印出数组内容,却打出来的是对象信息,甚至有可能因为数组引用为空而导致空指针异常。对于集合 toString() 是可以打印出集合里面的内容的,因为集合的父类 AbstractCollections重写了 Object 的 toString() 方法。
16.把一个基本数据类型转为字符串,基本数据类型.toString() 是最快的方式、String.valueOf(数据) 次之、数据+"" 最慢。
因为 String.valueOf() 方法底层调用了 Integer.toString() 方法,但是会在调用前做空判断;Integer.toString() 是直接调用;i + “” 底层使用了 StringBuilder 实现,先用 append 方法拼接,再用 toString() 方法获取字符串。
16.使用最有效率的方式去遍历 Map。
遍历 Map 的方式有很多,通常场景下我们需要的是遍历 Map 中的 Key 和 Value,那么推荐使用的、效率最高的方式是 entrySet(),如果只是想遍历一下这个 Map 的 key 值则 keySet() 会比较合适一些。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值