90%的 Java 程序员被误导的一个性能优化策略!

开发 后端
我们经常看到一些 Java 性能优化的书或者理念,说不要在循环内定义变量,这样会占用过多的内存影响性能,而要在循环外面定义。接触 Java 这么久以来,相信很多 Java 程序员都被这种代码性能优化策略所误导。

90 % Java程序员被误导的一个性能优化策略

我们经常看到一些 Java 性能优化的书或者理念,说不要在循环内定义变量,这样会占用过多的内存影响性能,而要在循环外面定义。接触 Java 这么久以来,相信很多 Java 程序员都被这种代码性能优化策略所误导。

看下面两个示例,示例1在循环外定义变量,示例2是在循环内定义变量。

 

  1. /**  
  2.  * 循环外定义变量  
  3.  */  
  4. private static void outer() {  
  5.     Javastack javastack = null 
  6.     for (int i = 0; i < 10; i++) {  
  7.         javastack = new Javastack();  
  8.     }  
  9.  
  10.  
  11. /**  
  12.  * 循环内定义变量  
  13.  */  
  14. private static void inner() {  
  15.     for (int i = 0; i < 10; i++) {  
  16.         Javastack javastack = new Javastack();  
  17.     } 

 

先来分析这两个示例吧。

循环外定义变量

循环外定义变量,变量循环内每次引用指向不同的对象实例,每次循环变更对象实例时,上一次被指向的对象就会被销毁,直到***一个循环。这样,循环结束后,这个变量还存在,并指向循环内***一个对象实例,其他对象都销毁了。

这样,本应该是循环体内的生命周期变量被扩散到了循环外,如果循环外依旧用这个变量,会导致后面的业务发生不可预知的后果。这种问题在笔者工作当中经常会遇到,看下面的例子。

 

  1. /**  
  2.  * 循环外定义变量  
  3.  */  
  4. private static void outer() {  
  5.     Javastack javastack1 = null 
  6.     for (int i = 0; i < 10; i++) {  
  7.         javastack1 = new Javastack();  
  8.     }  
  9.  
  10.    Javastack javastack2 = userDao.getUser(10);  
  11.  

 

上面定义了一个 javastack2 ,如果此时在后续代码或者传递到别的方法时写错了,用了 javastack1,那这时不就有问题了吗?这只是一方面,还有如果用同一变量名,当这一变量被重用时发生异常,本来发生异常应该是 null 值的,结果得到了是之前循环体内的值。

循环内定义变量

循环内定义变量,和循环外略有不同的是,每次都会创建新的局部变量指向新的对象实例,每个变量和对象的生命周期仅限于在循环体之内,而且每次循环结束该局部变量和对象实例都会随着循环体的结束而销毁,所以不存在占用更多的内存这一说法。

总结

两种用法都会创建相同数量的对象实例,只不过循环内会反复创建相同数量的局部变量,栈内存垃圾回收频率也会更高,但对于堆垃圾回收带来的性能影响和变量生命周期带来的业务影响来说,栈内存这点性能影响可以忽略不计。

所以,建议使用循环内定义变量,这种把变量的生命周期限制在循环体范围内,也不会出现业务上重用变量而导致严重的问题。

责任编辑:庞桂玉 来源: Java技术栈
相关推荐

2020-02-22 21:51:43

程序员Microsoft SServerSQL

2018-11-29 15:00:27

Java应用程序性能指标

2019-05-30 10:46:19

程序员应聘项目

2014-01-06 09:33:32

程序员管理

2019-07-18 12:40:49

Java编程语言性能优化

2020-07-10 09:55:15

程序员技能开发者

2015-06-16 10:31:36

程序员

2011-11-24 14:20:24

Java

2017-11-14 11:28:49

程序员索引数据

2015-06-08 10:48:39

程序员程序员自白

2011-02-14 13:05:17

PythonWeb

2020-10-05 21:13:37

程序员技能开发者

2011-10-31 09:14:35

程序员

2012-01-09 17:45:48

Java程序员

2012-04-12 14:49:31

程序员

2019-04-22 10:25:52

程序员技术职场

2009-02-12 15:07:57

程序员创业经验

2010-10-18 11:39:41

程序员

2020-01-06 09:53:29

程序员

2015-08-24 10:07:13

程序员bug
点赞
收藏

51CTO技术栈公众号