不要创建非必要对象

原文地址:http://leihuang.net/2014/11/10/avoid-creating-unnecessary-objects/

首先我们来看下面两个语句的区别:

String s = new String("hello world!") ;
String s = "hello world!" ;

当你循环调用上面两个语句的时候,你会发现:第一条语句总是new了一个新的值相等的对象,而第二条则一直是同一个值为"hello world!"的对象。由此第二条语句的效率要更高。

其实我们前面讲过的静态工厂方法其实也是遵循这个原理。

看下面这段代码,是判断一个人是否是1946至1964年之间所生。

class Preson {
    private final Date birthDate;

    // Other fields, methods, and constructor omittedITEM 5: AVOID CREATING
    // UNNECESSARY OBJECTS
    // DON‘T DO THIS!
    public boolean isBabyBoomer() {
        // Unnecessary allocation of expensive object
        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函数中其实有很大一部分是不需要每次都调用的,因为1946和1965的起始时间时固定不变的,但是每次调用这个函数的时候,都要执行这些代码,所以我们就可以对其进行改进,如下。

class Preson {
    private final Date birthDate;

    static{
        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();
    }
    public boolean isBabyBoomer() {
        return birthDate.compareTo(boomStart) >= 0
                && birthDate.compareTo(boomEnd) < 0;
    }
}

这样静态区域里面的代码就不属于Person类的对象了,而属于Person自己了,就是说每一个Person都拥有了同一份数据。



再看下面一段代码

Long sum = 0L;
for (long i = 0; i < Integer.MAX_VALUE; i++) {
    sum += i;
}

上面这段代码其实时效率非常低的,因为它变量sum申明的是Long对象,而不是long。这样每一次执行加法操作的时候,都要创建一个新的Long对象(Long是final class)。

prefer primitives to boxed primitives, and watch out for unintentional autoboxing.



2014-11-10 15:45:38

Brave,Happy,Thanksgiving !

时间: 2024-10-11 13:27:51

不要创建非必要对象的相关文章

SQL 基础之创建其他方案对象(十五)

视图概述: – 从视图中创建.修改和检索数据 – 在视图上的数据操纵语言(DML)操作 – 删除视图 数据库对象 Object 对象 Description 描述 Table 表 基本的数据存储集合,由行和列组成. View 视图 从一张表或多张表中抽出的逻辑上相关的数据集合 Sequence 序列 生成规律的数值 Index 索引 提高查询性能 Synonym 同义词 给对象起的别名 什么是视图?我的理解就是从一张表或多张表创建一个自定义的关联虚拟表 视图有如下几个优点: 限制数据访问 简化查

IE6/7/8不支持jQuery创建非闭合格式的链接A

代码如下 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script src="jquery-1.6.4.js"></script> </head> <body> <div></div> <script> var $a = $('<a href="javasc

jsWindow 对象 Window 对象 Window 对象表示浏览器中打开的窗口。 如果文档包含框架(frame 或 iframe 标签),浏览器会为 HTML 文档创建一个 window 对象,并为每个框架创建一个额外的 window 对象。 注释:没有应用于 window 对象的公开标准,不过所有浏览器都支持该对象。 Window 对象集合 集合 描述 frames[] 返回窗口中所有命

一.JSX简介 JSX就是Javascript和XML结合的一种格式.React发明了JSX,利用HTML语法来创建虚拟DOM.当遇到<,JSX就当HTML解析,遇到{就当JavaScript解析. 如下(JS写法) var child1 = React.createElement('li', null, 'First Text Content'); var child2 = React.createElement('li', null, 'Second Text Content'); var

创建非聚集索引

创建非聚集索引 SQL Server 2014 其他版本 2(共 2)对本文的评价是有帮助 - 评价此主题 您可以使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 2014 中创建非聚集索引. 非聚集索引是一种与存储在表中的数据相分离的索引结构,可对一个或多个选定列重新排序. 非聚集索引通常可帮助您通过比搜索基础表更快的速度查找数据:有时可以完全由非聚集索引中的数据回答查询,或非聚集索引可将数据库引擎指向基础表中的行. 一般来

Javascript创建类和对象

现总结一下Javascript创建类和对象的几种方法: 1.原始的创建方法: 1 <script type="text/javascript"> 2 var person = new Object(); 3 person.name="Amy"; 4 person.sex="Woman"; 5 person.show=function(){ 6 document.write("name is: "+this.name

匿名对象与非匿名对象的区别

类封装完以后就可以通过使用new关键字和类的构造方法来创建对象,这种对象分为两种:匿名对象与非匿名对象.何为匿名对象,何为非匿名对象呢?举个例子:假如有如下类: package com.heima.vo; public class Student{                    private String name="lisi";                    private int age=12;                    public void pri

不同浏览器创建 ajax XMLHTTPRequest对象的方法及兼容性问题总结

XMLHttpRequest 对象是AJAX功能的核心,要开发AJAX程序必须从了解XMLHttpRequest 对象开始. 了解XMLHttpRequest 对象就先从创建XMLHttpRequest 对象开始,在不同的浏览器中创建XMLHttpRequest 对象使用不同的方法: 先看看IE创建XMLHttpRequest 对象的方法(方法1): var xmlhttp=ActiveXobject("Msxml12.XMLHTTP");//较新的IE版本创建Msxml12.XMLH

关于String s = new String(&quot;xyz&quot;); 创建几个对象的问题

引用自这位朋友:http://blog.sina.com.cn/s/blog_6a6b14100100zn6r.html 你知道在java中除了8中基本类型外,其他的都是类对象以及其引用.所以 "xyz "在java中它是一个String对象.对于string类对象来说他的对象值是不能修改的,也就是具有不变性. 看: String   s= "Hello "; s= "Java "; String   s1= "Hello "

[Effective Java]第二章 创建和销毁对象

第一章      前言 略... 第二章      创建和销毁对象 1.            考虑用静态工厂方法代替构造器 创建对象方法:一是最常用的公有构造器,二是静态工厂方法.下面是一个Boolean的简单示例: public static Boolean valueOf(boolean b) { return (b ? Boolean.TRUE : Boolean.FALSE); } l  静态工厂方法与构造器不同的第一大优势在于,它们有名称. 作用不同的公有构造器只能通过参数来区别(因