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

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

创新互联公司是一家专注于网站建设、网站制作与策划设计,浮山网站建设哪家好?创新互联公司做网站,专注于网站建设十年,网设计领域的专业建站公司;建站业务涵盖:浮山等地区。浮山做网站价格咨询:18982081108

看下面两个示例,示例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 值的,结果得到了是之前循环体内的值。

循环内定义变量

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

总结

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

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

名称栏目:90%的 Java 程序员被误导的一个性能优化策略!
URL链接:http://www.shufengxianlan.com/qtweb/news3/274403.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联