欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

从代码的角度谈如何优化JAVA代码以提高性能【初、中级程序员必看】

程序员文章站 2022-06-24 18:50:01
最近复习Java基础感触颇深,同样是几行代码,别人写的运行效率就很大,自己写的就不是那么随意,这就牵扯到代码的性能优化问题,这个问题在初级阶段往往没有引起太多的重视,导致后来的工作中就没有往优化这个角度去想,往往就是怎么简单怎么来,这种思维只能解决一时的问题,要想持久的解决问题,必须对代码进行深度优化。下面我将从以下几个方面来谈谈对代码优化的建议。【慎重使用静态变量】public class Student {...

       最近复习Java基础感触颇深,同样是几行代码,别人写的运行效率就很大,自己写的就不是那么随意,这就牵扯到代码的性能优化问题,这个问题在初级阶段往往没有引起太多的重视,导致后来的工作中就没有往优化这个角度去想,往往就是怎么简单怎么来,这种思维只能解决一时的问题,要想持久的解决问题,必须对代码进行深度优化。下面我将从以下几个方面来谈谈对代码优化的建议。

【慎重使用静态变量】

public class Student {
    private static Instance instance = new Instance();
}

每声明一个静态变量,就会占用堆内存,如果这个类不消失,静态变量将一直存在,如果数量过多势必会影响程序性能。

【减少代码的重复计算】

如:

for(int i=0;i<list.size();i++){
	// do something
}

1
应该改为:

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

上面的循环会不断的调用size方法,从而消耗了性能,下面的只会运行一次size。

【要在必须创建对象的时候才创建对象】

如:

A a = new A();
  if(i==0){
    list.add(a);
}

应该改为:

if(i==0){
    A a = new A();
    list.add(a);
}

这一点,在我们平时写代码的时候尤为常见,我们平时都在一个方法的前面创建一大堆初始对象,但是后续的代码却没有引用,导致前面代码执行了但是后面没用到,更有甚者,我们会复制代码创建新的方法,同样的变量遗留在方法内,时间一长,势必会影响代码运行效率。

【在finally块中释放资源】

程序中使用到的资源,比如文件流stream,redis,poi,http请求,连接池等用到资源的地方,应当被释放,以避免资源泄漏,这最好在finally块中去做。不管程序执行的结果如何,finally块总是会执行的,以确保资源的正确关闭。

【使用移位来代替’/’的操作】

“/”,"*"是消耗性能的运算符号,可以用移位来提高运算效率

如:

int temp = a / 4;
int temp = a / 8;

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

应该改为:

int temp = a >> 2;
int temp = a >> 3;
int num = a << 2;
int num = a << 3;

【慎重估计StringBuffer,ArrayList,HashMap等要存储的内容的长度并初始化】

HashMap<Object,Object> hashMap = new HashMap<>(100);
StringBuffer buffer = new StringBuffer(100);	
ArrayList<Object> arrayList = new ArrayList<>(100);

这是因为如果不给定容量,在默认情况下,如果默认容量不足时,扩容是一件消耗性能的事情。

【避免使用二维数组】

int[][] erwei =  new int[][]{{1,2},{2,3}};

二维数据占用的内存空间比一维数组多得多,大概10倍以上。

避免使用split

除非是必须的,否则应该避免使用split,split由于支持正则表达式,所以效率比较低,如果是频繁的几十,几百万的调用将会耗费大量资源,如果确实需要频繁的调用split,可以考虑使用apache的StringUtils.split(string,char),频繁split的可以缓存结果。

避免大范围抛异常

	    try {
			int i = 1/0;
		} catch (Exception e) {
			//e.printStackTrace();
			log.info(e.getMessage());
		}

尽量用日志工具打印出来,调试的时候打印当然可以,如果正式环境抛出来异常会消耗内存资源,导致性能不稳定。

【慎重对待字符串操作】

  • 在确定字符串不会变的时候,用 String声明变量而非StringBuffer
public class A {
    String method () {
        StringBuffer s = new StringBuffer ("Hello");
        String t = s + "World!";
        return t;
    }
}
  • 字符串相加的时候,用‘’,而非“”

由于操作字符串比操作char 比较费内存,如果是加一个字符就用char

    String str = "1";
	String result = str+'1';
	System.out.println(result);

【慎用synchronized,尽量减小synchronize的方法】

实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。synchronize方法被调用时,直接会把当前对象锁了,在方法执行完之前其他线程无法调用当前对象的其他方法。所以,synchronize的方法尽量减小,并且应尽量使用方法同步代替代码块同步。

【不要使用finalize方法】

实际上,将资源清理放在finalize方法中完成是非常不好的选择,由于GC的工作量很大,尤其是回收Young代内存时,大都会引起应用程序暂停,所以再选择使用finalize方法进行资源清理,会导致GC负担更大,程序运行效率更差。

本文地址:https://blog.csdn.net/weixin_39076203/article/details/110818145