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

【慎重使用静态变量】

public class Student {

private static Instance instance = new Instance();

}

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

【减少代码的重复计算】

如:

for(int i=0;i

// do something

}

1

应该改为:

for(int i=0,size=list.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 hashMap = new HashMap<>(100);

StringBuffer buffer = new StringBuffer(100);

ArrayList 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负担更大,程序运行效率更差。

本文同步分享在 博客“爱吃早餐的程序员”(CSDN)。

如有侵权,请联系 support@oschina.cn 删除。

本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

java项目怎样提高性能_从代码的角度谈如何优化JAVA代码以提高性能【初、中级程序员必看】...相关推荐

  1. 静态网页托管_求职季,教你制作一份精美的在线网页简历,程序员必看!!

    引言 近期和学弟交流了一下找实习的相关的话题,谈到了简历这块.虽然近期没有找工作的打算,但还是会不定期的更新自己的简历. 于是将自己的简历分享了一下,没想到得到了这样的评价,心里还是挺高兴的. 简历的 ...

  2. java书籍_Java程序员必看的 13 本 Java 书籍!

    原文:Java程序员必看的 13 本 Java 书籍! 作者: java技术栈 关乎于程序员,除了做项目来提高自身的技术,还有一种提升自己的专业技能就是:多!看!书! 毕竟,书是学习的海洋呢!So,J ...

  3. java架构师之路:JAVA程序员必看的15本书的电子版下载地址

    java架构师之路:JAVA程序员必看的15本书的电子版下载地址 作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从.我想就我自己读过的技术书籍中挑选出来一 ...

  4. JAVA程序员必看的15本书

    java架构师之路:JAVA程序员必看的15本书的电子版下载地址 作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从.我想就我自己读过的技术书籍中挑选出来一 ...

  5. Java程序员必看的15本书的电子版下载地址

    Java程序员必看的15本书的电子版下载地址 作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从.我想就我自己读过的技术书籍中挑选出来一些,按照学习的先后顺 ...

  6. java程序员必看书籍

    学习Java最痛苦的事情莫过于对未来职业方向的选择.尤其是选择开发Java Application还是Java Web方向,在你先定好大类后还有数不尽的小类教你无从学起. 因此,作为初学者的你必须看完 ...

  7. java中的model_Java程序员必看之springmvc中的Model对象在重定向中的数据

    原标题:Java程序员必看之springmvc中的Model对象在重定向中的数据 在springmvc框架中,一个handler方法中的参数可以内置接收Model类型的对象,主要用于存储数据之用,主要 ...

  8. Java之父James Gosling鼎力推荐《Effective Java 第三版》最新中文版,Java程序员必看神书

    前言 Java之父James Gosling鼎力推荐.Jolt获奖作品全新升级,针对Java 7.8.9全面更新,Java程序员必备参考书.包含大量完整的示例代码和透彻的技术分析,通过90条经验法则, ...

  9. java软件学习网站_Java程序员必看的十大学习网站

    无论是作为资深Java程序员,还是刚刚Java入门的小白,都不可缺少平时学习的网站.以下小编收集了Java程序员必看的十大学习网站,这些网站可以提供信息.以及一些很棒的讲座 , 还能解答一般问题.面试 ...

最新文章

  1. 6 js 比较两个数组的差异_每天一道算法题(js)(3)——寻找两个有序数组的中位数...
  2. pandas按照索引来赋值,按照数据表的索引批量给某一个变量赋值的方法。
  3. 医院计算机管理在品管圈中的应用,品管圈在医院管理中怎么用?看完就明白了...
  4. 安卓车机root改流浪地球_教你王者荣耀改战区
  5. [Vue] Computed property XXX was assigned to but it has no setter.
  6. bzoj 1626: [Usaco2007 Dec]Building Roads 修建道路(最小生成树)
  7. 无法识别依赖属性_设计模式起步-UML学习 - 认识UML类图(依赖)
  8. [转载]c语言中命令行参数argc,argv
  9. 新人如何在职场中生存
  10. 数据合并concat
  11. Python调用graphviz绘制结构化图形网络
  12. 教你用Java获取IP归属地
  13. 本地计算机无法启动dhcp服务,重装系统后dhcp服务器无法启动怎么办
  14. 统计学原理 数据的来源
  15. 八类网线和七类网线的区别_Cat8 八类网线是什么?与Cat5、Cat6、Cat7网线的区别?...
  16. Jetson AGX Orin 平台关于c240000 I2C总线和GMSL ses地址冲突问题
  17. 华氏温度转换成摄氏温度
  18. UI自动化工具Cypress测试案例、生成报告---Linux版
  19. python画词云图、词云图模糊不清
  20. VGA 接口电阻网络阻抗

热门文章

  1. NBT:王运浩、区健辉等综述纳米孔测序技术
  2. 中国核酸数据库GSA数据提交指南
  3. 华裔教授教你写论文2.引言的逻辑解析
  4. R语言可视化、编写自定义函数可视化水平排序条形图(horizontal bar plot)、自定义图像布局模仿经济学人杂志可视化效果、右侧添加标签数值图像方框、自定义背景色、水平条形图中间线条等
  5. R语言ggplot2可视化绘制分组水平并行条形图(bar plot)并为条形图内添加标签
  6. pandas使用pd.concat纵向合并多个dataframe实战:纵向合并(ignore_index参数)、为纵向合并的多个dataframe设置标识符指定数据来源(通过字典方式设置数据来源键)
  7. seaborn将图例放置在图像外部并使用move_legend函数将图例(legend)放置在图像的底部(bottom)、且单行展开显示
  8. R语言ggplot2可视化在可视化图像中添加上限线条、下限线条、添加上下限图例实战
  9. R语言将dataframe长表转化为宽表实战:使用reshape函数、使用tidyr包的spread函数、使用data.table
  10. R语言Logistic回归模型案例:分析吸烟、饮酒与食管癌的关系