Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 308|回复: 0

[Java基础知识]避免创建不必要的对象

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-9-30 17:43:26 | 显示全部楼层 |阅读模式
    试比较以下两行代码在被多次反复执行时的效率差异:由于String被实现为不可变对象,JVM底层将其实现为常量池,既所有值等于"stringette" 的String对象实例共享同一对象地址,而且还可以保证,对于所有在同一JVM中运行的代码,只要他们包含相同的字符串字面常量,该对象就会被重用。 我们继续比较下面的例子,并测试他们在运行时的效率差异:  Boolean b = Boolean.valueOf("true");
    Boolean b = new Boolean("true");

         前者通过静态工厂方法保证了每次返回的对象,如果他们都是true或false,那么他们将返回相同的对象。换句话说,valueOf将只会返回Boolean.TRUE或Boolean.FALSE两个静态域字段之一。
      
       
       

         
       

         
       
      
         而后面的Boolean构造方式,每次都会构造出一个新的Boolean实例对象。这样在多次调用后,第一种静态工厂方法将会避免大量不必要的Boolean对象被创建,从而提高了程序的运行效率,也降低了垃圾回收的负担。 继续比较下面的代码:
    1. import java.util.*;
    2.    /*
    3.   public class Person {   
    4.          private final Date birthDate;  
    5.          public Person(Date birthDate){
    6.               this.birthDate=birthDate;
    7.          }
    8.          //判断该婴儿是否是在生育高峰期出生的。   
    9.          public boolean isBabyBoomer() {   
    10.              Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT"));   
    11.              c.set(1946,Calendar.JANUARY,1,0,0,0);   
    12.              Date dstart = c.getTime();   
    13.              c.set(1965,Calendar.JANUARY,1,0,0,0);   
    14.              Date dend = c.getTime();   
    15.              return birthDate.compareTo(dstart) >= 0 && birthDate.compareTo(dend) < 0;   
    16.          }   
    17.      }   
    18.         */
    19.      public class Person {   
    20.          private static final Date BOOM_START;   
    21.          private static final Date BOOM_END;  
    22.          private final Date birthDate;   
    23.          public Person(Date birthDate){
    24.               this.birthDate=birthDate;
    25.          }
    26.             
    27.          static {   
    28.              Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT"));   
    29.              c.set(1946,Calendar.JANUARY,1,0,0,0);   
    30.              BOOM_START = c.getTime();   
    31.              c.set(1965,Calendar.JANUARY,1,0,0,0);   
    32.              BOOM_END = c.getTime();   
    33.          }   
    34.          public boolean isBabyBoomer() {   
    35.              return birthDate.compareTo(BOOM_START) >= 0 && birthDate.compareTo(BOOM_END) < 0;   
    36.          }   
    37.      }  
    复制代码
       改进后的Person类只是在初始化的时候创建Calender、TimeZone和Date实例一次,而不是在每次调用isBabyBoomer方法时都创建一次他们。如果该方法会被频繁调用,效率的提升将会极为显著。 集合框架中的Map接口提供keySet方法,该方法每次都将返回底层原始Map对象键数据的视图,而并不会为该操作创建一个Set对象并填充底层Map所有键的对象拷贝。因此当多次调用该方法并返回不同的Set对象实例时,事实上他们底层指向的将是同一段数据的引用。 在该条目中还提到了自动装箱行为给程序运行带来的性能冲击,如果可以通过原始类型完成的操作应该尽量避免使用装箱类型以及他们之间的交互使用。见下例:

    1. public static void main(String[] args) {   
    2.          Long sum = 0L;   
    3.          for (long i = 0; i < Integer.MAX_VALUE; ++i) {   
    4.              sum += i;   
    5.          }   
    6.          System.out.println(sum);   
    7.      }  
    复制代码
    本例中由于错把long sum定义成Long sum,其效率降低了近10倍,这其中的主要原因便是该错误导致了2的31次方个临时Long对象被创建了。




      
      
       
       

         
       

         
       
      
    复制代码
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-20 17:46 , Processed in 0.369782 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表