五、避免创建不必要的对象

一般来说,对于java的对象来说,可以重用对象的情况下:尽量不要在需要的时候就创建一个相同功能的对象

1、String

@Test
    public void test02() {
        btime=System.currentTimeMillis();
        for(long i=0;i<1000000000;i++){
            String a=new String("a");
        }
        etime=System.currentTimeMillis();
        System.out.println(etime-btime);
        //这种方式创建String对象10亿次花了9574

    }

    @Test
    public void test03() {
        btime=System.currentTimeMillis();
        for(long i=0;i<1000000000;i++){
            String a="a";
        }
        etime=System.currentTimeMillis();
        System.out.println(etime-btime);
        //这种方式花了2337
    }

2、尽量用静态初始化一些相同功能的对象

class Person231 {
    private final Date birth = new Date();

    public boolean isBabyBoomer() {
        Calendar g = Calendar.getInstance();
        g.set(1946, Calendar.JANUARY, 1, 0, 0);
        Date start = g.getTime();
        g.set(1965, Calendar.JANUARY, 1, 0, 0);
        Date end = g.getTime();
        return birth.before(end) && birth.after(start);

    }
}
@Test
    public void test21() {
        Person231 p=new Person231();

        btime=System.currentTimeMillis();
        for(long i=0;i<10000000;i++){
            p.isBabyBoomer();
        }
        etime=System.currentTimeMillis();
        System.out.println(etime-btime);
    }//调用一千万次,花了27585

改进后:

class Person231 {

    private final static Date birth = new Date();
    private static Calendar g;
    private static Date start;
    private static Date end;
    static{
        g= Calendar.getInstance();
        g.set(1946, Calendar.JANUARY, 1, 0, 0);
        start=g.getTime();
        g.set(1965, Calendar.JANUARY, 1, 0, 0);
        end=g.getTime();
    }
    public boolean isBabyBoomer() {

        return birth.before(end) && birth.after(start);
    }
}
       @Test
    public void test21() {
        Person231 p=new Person231();

        btime=System.currentTimeMillis();
        for(long i=0;i<10000000;i++){
            p.isBabyBoomer();
        }
        etime=System.currentTimeMillis();
        System.out.println(etime-btime);
    }//调用一千万次,花了148    

3、基本类型及其包装类---优先使用基础类

//使用包装类,每使用一次创建一个对应类
@Test
    public void test20() {
        int i = Integer.MAX_VALUE;
        System.out.println(i);
        Long sum = 0L;
        btime = System.currentTimeMillis();
        for (int j = 0; j < i; j++) {
            sum = sum + j;
        }
        etime = System.currentTimeMillis();
        System.out.println(etime - btime);
    }// 调用2147483647次,花了28551
@Test
    public void test20() {
        //使用基本类型
        int i = Integer.MAX_VALUE;
        System.out.println(i);
        long sum = 0L;
        btime = System.currentTimeMillis();
        for (int j = 0; j < i; j++) {
            sum = sum + j;
        }
        etime = System.currentTimeMillis();
        System.out.println(etime - btime);
    }// 调用2147483647次,花了5151
时间: 2024-08-28 14:20:14

五、避免创建不必要的对象的相关文章

五种创建UIImage的类方法

五种创建UIImage的类方法 UIImage有五个类方法,用来创建UIImage的.下面介绍一下每个类方法的作用和创建实例. 1.使用类方法imageNamed:创建 + (UIImage *)imageNamed:(NSString *)name; // load from main bundle name是照片名称.创建UIImage对象,代码如下: UIImage *image = [UIImage imageNamed:@"ganggang"]; 使用imageNamed:初

HTML5离线Web应用实战:五步创建成功

[IT168 技术]HTML5近十年来发展得如火如荼,在HTML 5平台上,视频,音频,图象,动画,以及同电脑的交互都被标准化.HTML功能越来越丰富,支持图片上传拖拽.支持localstorage.支持web sql database.支持文件存储api等等.它任重而道远,致力于将Web带入一个更为成熟的应用平台.在所有炫酷特性中,最让我喜欢的是它具有离线缓存Web应用的功能. 开发离线Web 应用程序:三大核心功能 在开发支持离线的 Web 应用程序时,开发者通常需要使用以下三个方面的功能:

VSTO之旅系列(五):创建Outlook解决方案

原文:VSTO之旅系列(五):创建Outlook解决方案 本专题概要 引言 Outlook对象模型 自定义Outlook窗体 小结 一.引言 在上一个专题中,为大家简单介绍了下如何创建Word解决方案的,所以本专题中将为大家介绍下Outlook相关的内容.我们从Visual Studio 2010 中Office节点下的模板中我们可以看到,Outlook只有外接程序的模板,并没有提供像Word或Excel这样的文档级的模板,所以VSTO没有为Outlook解决方案创建宿主项和宿主控件(Excel

String s=new String("xyz");创建几个String对象的问题

首先让我们了解几个概念: 栈 :由JVM分配区域,用于保存线程执行的动作和数据引用. 堆 :由JVM分配的,用于存储对象等数据的区域. 常量池constant pool :在堆中分配出来的一块存储区域,用于存储显式 的String,float或者integer.这是一个特殊的共享区域,可以在内存中共享的不经常改变的东西,都可以放在这里. 进入正题: String a = "abc";①String b = "abc";② 使用String a = "abc

【VMCloud云平台】SCCM(五)创建第一个集合

继上一篇云平台完成SCCM部署篇之后,SCCM篇正式开始,今天将开始介绍SCCM创建第一个集合,集合作用跟GPO中的作用域是一样的,即有时候你需要对不同范围的机器进行分发操作或其他操作时则需要把范围规定起来(紫色为完成实施,红色为实施中): 1. 打开管理控制台,定位点客户端符合性: 2. 在设备集合上点击右键选择创建设备集合: 3. 输入新集合名称,并选择目标机器所在的集合: 4. 点击下一步,新建成员规则,选择直接规则: 5. 输入资源类型与规则: 6. 接着就会出现筛选出来的值,进行勾选:

Item 5 避免创建不必要的对象

场景一: 这个是经常出现的问题,因为我们经常误用String. public class Test { public static void main(String[] args) { //参数"terrible"会创建一个对象 //然后,new String(),这个语句会创建一个对象 //所以,这个语句执行过程中,会创建两个对象 String s = new String("terrible."); //只创建一个对象,该对象的引用被赋值到变量 ok Strin

Effective Java之避免创建不必要的对象和消除过期的引用

为什么要避免创建不必要的对象?创建对象的过程还是比较耗性能的,根据书上给出的性能测试,重复创建对象的时间消耗是重用对象时间消耗的250倍.下面列出一些可以重用对象的场景. 1.String类型要注意,String s = "as" 和 String s = new String("as")之间有很大的差别,第二种创建String实例的方法其实会产生两个"as"对象. 2.针对已知不会被修改的可变对象,可以只在第一次使用时初始化,而不是在每次使用时

String str=new String(&quot;abc&quot;)到底创建了几个对象

这句代码到底创建了几个对象?研究了好一阵,现在才能说清楚. package com.sun.test; public class Test<T> { T a; /** * @param args */ public static void main(String[] args) { String str=new String("abc"); } } 我们来看下这段简单代码的字节码: <pre name="code" class="java

在lua中创建字段安全的对象

lua萌新,刚刚学习和使用不到一个月.有不对的地方,还望各路大神不吝赐教. lua中可以用table来模拟对象,但table是可以任意增加键值的.在对象模拟中,暂且也叫它为字段(field)吧.如果在面向对象中,你定义了一个对象,可以在对象以外的地方随意改动这个对象的字段,访问不存在的字段,你想象一下这有多恐怖?比如你定义了一个Vector3{float x = 0; float y = 0; float z = 0;}  我在外面某处加一个float t = 1; 当你在创建并引用这对象的时候

避免创建不必要的对象

1,一般来说,做好能重用对象而不是在每次需要的时候就创建一个相同功能的对象,重用方式即快速,又流行.如果对象是不可变的,他就始终可以被重用. 如:String s=new String("stringtee");该语句在每次执行时都会创建一个新的String实例,如果这种用法是在一个循环中,或者是在一个频繁调用的方法中,就会创建出成千上万个不必要的String实例. 改进方法: String s="stringtee";这个版本只用了一个实例而不是每次都创建一个新的