JAVA性能提升的几个细节

1、尽量指定类、方法的final修饰符

2、尽量重用对象:出现字符串连接时应该使用StringBuilder/StringBuffer代替

3、尽可能使用局部变量

4、及时关闭流

5、尽量减少对变量的重复计算

for (int i = 0, length = list.size(); i < length; i++)
{...}

6、尽量采用懒加载的策略,即在需要的时候才创建

7、慎用异常

8、不要在循环中使用try…catch…,应该把其放在最外层

9、如果能估计到待添加的内容长度,为底层以数组方式实现的集合、工具类指定初始长度

10、当复制大量数据时,使用System.arraycopy()命令

11、乘法和除法使用移位操作

for (val = 0; val < 100000; val += 5)
{
	a = val << 3; //×8
	b = val >> 1; //÷2
}

12、循环内不要不断创建对象引用

Object obj = null;for (int i = 0; i <= count; i++) { obj = new Object(); }

13、基于效率和类型检查的考虑,应该尽可能使用array,无法确定数组大小时才使用ArrayList,尽量使用HashMap、ArrayList、StringBuilder,除非线程安全需要,否则不推荐使用Hashtable、Vector、StringBuffer,后三者由于使用同步机制而导致了性能开销

15、不要将数组声明为public static final,将数组声明为public更是一个安全漏洞,这意味着这个数组可以被外部类所改变

16、尽量在合适的场合使用单例,使用单例可以减轻加载的负担、缩短加载的时间、提高加载的效率,但并不是所有地方都适用於单例,简单来说,单例主要适用于以下三个方面:

(1)控制资源的使用,通过线程同步来控制资源的并发访问

(2)控制实例的产生,以达到节约资源的目的

(3)控制数据的共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信

17、尽量避免随意使用静态变量

18、及时清除不再需要的会话

19、实现RandomAccess接口的集合比如ArrayList,应当使用最普通的for循环而不是foreach循环来遍历

if (list instanceof RandomAccess)
{ for (int i = 0; i < list.size(); i++){}
}else{
	Iterator<?> iterator = list.iterable(); 
	while (iterator.hasNext()){iterator.next()}
}

20、使用同步代码块替代同步方法

21、将常量声明为static final,并以大写命名

22、不要创建一些不使用的对象,不要导入一些不使用的类

23、程序运行过程中避免使用反射

24、使用数据库连接池和线程池

25、使用带缓冲的输入输出流进行IO操作

26、顺序插入和随机访问比较多的场景使用ArrayList,元素删除和中间插入比较多的场景使用LinkedList

27、不要让public方法中有太多的形参,public方法即对外提供的方法,如果给这些方法太多形参的话主要有两点坏处:

(1)违反了面向对象的编程思想,Java讲求一切都是对象,太多的形参,和面向对象的编程思想并不契合

(2)参数太多势必导致方法调用的出错概率增加,至于这个”太多”指的是多少个,3、4个吧。比如我们用JDBC写一个insertStudentInfo方法,有10个学生信息字段要插入Student表中,可以把这10个参数封装在一个实体类中,作为insert方法的形参。

28、字符串变量和字符串常量equals的时候将字符串常量写在前面

29、不要对数组使用toString()方法

30、不要对超出范围的基本数据类型做向下强制转型

31、公用的集合类(也就是说不是方法里面的属性)中不使用的数据一定要及时remove掉

32、把一个基本数据类型转为字符串,基本数据类型.toString()是最快的方式、String.valueOf(数据)次之、数据+””最慢

33、遍历Map的方式有很多,通常场景下我们需要的是遍历Map中的Key和Value,那么推荐使用的、效率最高的方式是:

HashMap<String, String> hm = new HashMap<String, String>();
hm.put("111", "222");
Set<Map.Entry<String, String>> entrySet = hm.entrySet();
Iterator<Map.Entry<String, String>> iter = entrySet.iterator();
while (iter.hasNext())
{
	Map.Entry<String, String> entry = iter.next();
	System.out.println(entry.getKey() + "\t" + entry.getValue());
}
//如果你只是想遍历一下这个Map的key值,那用”Set keySet = hm.keySet();”会比较合适一些

34、对资源的close()建议分开操作

注意事项:

1、不用的方法加过期注解@Deprecated

2、尽量不要使用Byte

3、增删改的操作必须有事务处理注解@Transactional

4、接口->实现类,如果实现类中调用该接口的其他实现方法,需要使用如下方式

final A service = (A) AopContext.currentProxy();

以上内容参考公众号《我是程序汪》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章