在实际开发中,重复使用同一个对象要比每次需要的时候就创建一个对象要好的多;

  作为一个比较极端的反面例子,看下面这个语句:

  String s = new String("haha");

  改语句每次被执行时都会创建一个新的String实例,如果这种用法是在一个循环中,或者是在一个被频繁调用的方法中,将会有成千上万个String实例被创建,这样的做法是没有必要的,可改进成如下这样:

  String s = “haha”;

  这个版本只使用一个String实例,而不是每次被执行的时候都创建了一个实例。对于在同一个虚拟中,运行的代码,只要包含相同的字符串字面常量,则改对象就会被重用。

  除了重用非可变的对象外,对于那些已知不会被修改的可变对象,也是可以重用它们,看个比较常见的例子:

 public class Person{
    private final Date birthDate;     public Person(Date birthDate){
      this.birthDate = birthDate;
    }     public boolean isBabyBoomer(){
      Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));       gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);
      Date boomStart = gmtCal.getTime();       gmtCal.set(1965, Calendar.JANUARY, 1, 0, 0, 0);
      Date boomEnd = gmtCal.getTime();       return birthDate.compareTo(boomStart) >= 0 && birthDate.compareTo(boomEnd) < 0;
    }   }

  isBabyBoomer每次被调用的时候,都会创建一个新的Calendar, 一个新的TimeZone,两个新的Date对象,这是不必要的,下面的版本使用一个静态的初始化器,避免了上面例子的低效:

 public class Person{
    private final Date birthDate;     public Person(Date birthDate){
      this.birthDate = birthDate;
    } private static final Date BOOM_START;
private static final Date BOOM_END; static{
Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));     gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);
    BOOM_START = gmtCal.getTime();     gmtCal.set(1965, Calendar.JANUARY, 1, 0, 0, 0);
    BOOM_END = gmtCal.getTime();
}   public boolean isBabyBoomer(){
    return birthDate.compareTo(boomStart) >= 0 && birthDate.compareTo(boomEnd) < 0;
  } }

  改进版本的Person类仅在初始化时刻创建Calendar、TimeZone和Date实例一次,而不是在每次isBadyBoomer被调用的时候创建它们。

                                                  摘自Effective java

JAVA:避免重复的创建对象的更多相关文章

  1. Java中是构造器创建对象吗?

    首先,这里说明” Java中是构造器创建对象 “这句话是完全错误的. Java中构造器的作用主要是为了初始化变量的值...其实在执行构造器之前,Java对象所需要的内存空间,已经产生了... 一般可以 ...

  2. 转 java中5种创建对象的方法

    作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如spring去创建对象.然而这里有很多创建对象的方法,我们会在这篇文章中学到. Java中有5种创建对象的方式,下面给出它们的 ...

  3. 学习练习 java 不重复的三位偶数

    编写一个Java程序,计算一下1,2,…,9这9个数字可以组成多少个互不相同的.无重复数字的三位偶数. package com.hanqi; //编写一个Java程序,计算一下1,2,…,9 //这9 ...

  4. java去除重复的字符串和移除不想要的字符串

    在java开发中碰到了有些字符串是重复的,如果在进行业务处理要全部遍历太对的数据就会重复,所以在进行业务处理前进行一个去重操作. 这里由于业务需要所以先将字符串转化为string数组,使用split分 ...

  5. java查找重复类/jar包/普通文件

    开发web应用时,有时更新了类却没有生效,其实是因为jboss/tomcat中其他发布包下有同名类(包括全路径都相同). 于是萌发了做个程序来检查指定目录是否存在重复类(通过asm从类文件中取类的全路 ...

  6. java 去除重复项

    import java.util.Arrays; import java.util.HashSet; import java.util.Set; class Demo20 { public stati ...

  7. Java 8——重复注解和注解的作用范围的扩大化

    一.重复注解 在某些情况下,希望将相同的注解应用于声明或类型用途.从Java SE 8发行版开始,重复注解使可以执行此操作. 例如,正在编写代码以使用计时器服务,该服务使能够在给定时间或某个计划上运行 ...

  8. Java采用反射技术创建对象后对目标类的成员变量和成员方法进行访问

    实现: package com.ljy; import java.lang.reflect.Field; import java.lang.reflect.Method; /** * * @Class ...

  9. java去处重复输出

    去除重复输出问题:   数组:大量相同数据类型的集合 数据类型[ ] 数组名=new 数据类型[长度] 数据类型[ ] 数组名=new 数据类型[ ]{值1,值 2,值3.....} 数据类型[ ] ...

随机推荐

  1. C++,C#,Python

    1.C++的思路:无论是基本类型,还是类类型,对象的传递提供了两种方式,一个是整体拷贝,一个是复制引用.整体拷贝对应着copy构造和copy赋值,复制引用就是通过引用或者指针实现的,当然指针本身还是整 ...

  2. android 动态改变屏幕方向

    LANDSCAPE与PORTRAIT 范例说明 要如何通过程序控制Activity的显示方向?在Android中,若要通过程序改变屏幕显示的方向,必须要覆盖 setRequestedOrientati ...

  3. JS来推断文本框内容改变事件

       oninput,onpropertychange,onchange的使用方法 onchange触发事件必须满足两个条件: a)当前对象属性改变,而且是由键盘或鼠标事件激发的(脚本触发无效) b) ...

  4. quickstack is a tool to take call stack

    https://github.com/yoshinorim/quickstack quickstack is a tool to take call stack traces with minimal ...

  5. Javassist初体验

           最初接触javassist是在研究dubbo源码的时候,那会对其的理解还停留在动态生成字节码的位置,可以做动态代理之类的动态化处理.最近由于项目需要扫描springMVC中control ...

  6. win7配置nginx + php

    nginx的下载地址:  http://www.nginx.cn/nginx-download 在nginx下创建文件php-cgi.cmd,并写入内容: "D:\nginx_php-5.6 ...

  7. mysql中 case when的使用

    SELECT a.hsid, a.house_code, a.sale_date, a.pjid, COUNT( sdid ) AS num, b.hsid, b.pscid, b.hscode, b ...

  8. liunx 文件相关

    一.linux中 文件属性以 l.b.c.d.开头的都是什么文件? lrwxrwxrwx 1 root root 11 Aug 20 08:38 core -> /proc/kcoredrwxr ...

  9. Redis 性能测试

    Redis 性能测试是通过同时执行多个命令实现的. 语法 redis 性能测试的基本命令如下: redis-benchmark [option] [option value] 实例 以下实例同时执行 ...

  10. MySQL在Django框架下的基本操作(MySQL在Linux下配置)

    [原]本文根据实际操作主要介绍了Django框架下MySQL的一些常用操作,核心内容如下: ------------------------------------------------------ ...