`
javabkb
  • 浏览: 54648 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

Java基础温习有感(一) 不要创建不必要的对象

    博客分类:
  • J2SE
阅读更多

   其实我们有点java基础的同学都应该清楚能少创建对象就少创建对象,甚至在Effective Java中的多次强调让我们能不创建对象就不创建对象,可是我们在实际代码中真正做到这一点的有几个呢?
   首先我们先来看下面一段代码吧:

 

      public static void main(String[] args) {
		long startTime = System.currentTimeMillis();
		Long sum = 0L;
		for(long i = 0 ; i < Integer.MAX_VALUE ; i++) {
			
			sum += i;
		}
		System.out.println(System.currentTimeMillis() - startTime);
		
	}
    

  这段代码在我机器里打出了:44797,也就是说40几秒

 

   可是如果我们修改一下:

 

   把Long sum = 0L;改成     long sum = 0;

 

  在我机器里打出了:9016,也就是说10秒都不到

  可见创建对象与不创建对象的效率差距是多大了,其实这还好了,要是多次创建如数据库的Connection等一些更耗时的对象,那么更糟糕了。

 

  好了,我们有什么方法可以避免创建不必要的对象呢?

  第一,用静态工厂方法代替构造器

         好处:1,实例出的对象有名称;

                2,不必每次调用的时候都创建一个新的对象

                3,可以返回原返回类型的任何子类型的对象

                4,在创建参数化类型实例的时候,它们使代码变得更加简洁

  第二, 优先使用基本类型而不是装箱基本类型,要当心无意识的自动装箱

         好处:速度快,上面的例子正好说明了这一点

  第三,有效地重复利用一个已经初始化的对象

 

 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();

     两次需要用来时间,但是只初始化了一个Calendar对象,可见是相当省时.

 

     总结:本节提出的是不要创建不必要的对象,并不是指创建对象的代价非常昂贵,我们应该要尽可能地避免创建对象。相反,由于小对象的构造哭只做很少量的工作,所以,小对象的创建和回收动作是非常廉价的,特别是在现代的JVM实现上更是如此。通过创建附加的对象,提升程序的清晰性、简洁性和功能性,这通常是件好事。

 

 

 

分享到:
评论
3 楼 C_J 2011-03-13  
以Integer为例子:

    public static Integer valueOf(String s) throws NumberFormatException
    {
	return new Integer(parseInt(s, 10));
    }



Integer的缓存池占不讨论,可以看到其实static方法同样是new出了对象,并没有达到减少对象的作用,所以用static方法重点不在于“减少创建对象”:)
2 楼 javabkb 2011-03-13  
C_J 写道
少创建对象是正确的,但我记得effective java里说用静态工厂不是用来减少对象创建的,可能又是我记错了。

Effective Java第二版17页第6段上写道:对于同时提供了静态工厂方法和构造器的不可变类,通常可以使用静态工厂方法而不是构造器,以避免创建不必要的对象。例如,静态工厂方法Boolean.valueOf(String)几乎总是优先于构造器Boolean(String)。
可能是要对于不同场景吧,也没必要拘泥于这个,大概有"少创建对象"意识就行了。呵呵。
1 楼 C_J 2011-03-13  
少创建对象是正确的,但我记得effective java里说用静态工厂不是用来减少对象创建的,可能又是我记错了。

相关推荐

    资料java温习资料实用教案.pptx

    这份“资料java温习资料实用教案.pptx”主要涵盖了Java编程的基础知识、考试范围以及重点难点,为学习者提供了一份全面的复习指南。 首先,我们来关注Java的基础知识点: 1. **Java语言特性**:Java的特点包括平台...

    资料java温习资料PPT学习教案.pptx

    Java是一种广泛使用的面向对象的编程语言,以其平台无关性、安全性、分布式计算和多线程等特点而著称。Java程序的运行依赖于Java虚拟机(JVM),它是一种软件实现的虚拟计算机,使得Java程序可以在任何支持JVM的设备...

    经典的java例题,常用

    Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能、丰富的类库和强大的社区支持而闻名。在Java的学习过程中,实例是理解概念的关键。"经典的java例题"这个压缩包很可能包含了各种Java编程的经典问题和...

    温习java反射,让你对反射有全新的认识(csdn)————程序.pdf

    Java反射是Java编程语言的一个强大特性,它允许运行时动态地获取类的信息并操作类的对象。通过反射,我们可以在程序执行过程中创建和访问类、接口、字段和方法,而不必在编译时知道它们的具体名称。本文将深入探讨...

    Java基础知识点汇总

    此资源是对Java基础知识点的汇总,阅读后能够对Java知识点有更清晰的认识,可以用来温习。

    java后端1年经验和技术总结

    通过上述总结,我们可以看出,作为一名Java后端开发者,不仅要掌握语言的基本语法,还要具备扎实的基础知识,善于利用设计模式和最佳实践来提高代码质量,同时关注性能优化和系统稳定性。随着经验的增长,不断反思和...

    Java综合技能知识库

    包含 Java面向对象、Java基础类库、JDBC数据库访问、Web编程Jsp&Servlet、Hibernate持久层、iBatis持久层、Structs界面控制层、JSF界面控制层、Spring应用框架、Ejb、WebService技术、J2EE模式等其他Java相关开发...

    基于Java语言的Spring MVC知识温习与实践设计源码

    该项目为Java语言编写的Spring MVC知识温习与实践设计源码,包含54个文件,包括33个XML配置文件、10个Java源文件、7个JSP文件、1个Markdown文件、1个IntelliJ IDEA项目文件、1个属性文件和1个PNG图片文件。...

    JAVA编程百例 很经典实用

    本资源名为“JAVA编程百例”,显然是一个包含了100个经典且实用的Java编程示例的集合,旨在帮助初学者快速掌握Java编程基础,同时也可作为经验丰富的开发者温习或查找特定功能实现的参考。 这个百例集合可能涵盖了...

    《Java2范例入门与提高》所有实例源码

    对于初学java以及JAVA高手温习JAVA基础是一本难得的资料,特发过来,供大家分享。 二、资源说明 第1章 java语言概述 1.1 HelloWorldApp程序 1.2 HelloWorld小应用程序 1.3 编译和运行HelloWorld 1.4 温度转换程序 ...

    Java 8 编程实训指南与样例解析

    本文介绍了多个实用的 Java 编程实训题及其实现方式,内容覆盖基础语法(HelloWorld程序、变量、if/else等条件判断), 控制结构(for循环), 面向对象编程(类的创建,继承),以及基础数据结构(数组的操作). 它还包括了...

    梅州中考生物第一部份基础知识第二单元第一讲显微镜和细胞检测温习.pdf

    梅州中考生物第一部份基础知识第二单元第一讲显微镜和细胞检测温习.pdf

    温习Javascript基础语法之词法结构_.docx

    JavaScript,作为一种广泛应用于Web开发的动态、弱类型的解释性编程语言,其基础语法中的词法结构是理解其工作原理的关键。JavaScript与Java虽然在名称上有相似之处,但实际上两者完全不同,JavaScript最初命名为...

    自制java版五子棋简易代码(仅供参考)

    今天重新温习java书籍,看到面向对象章节,为了更好的理解面向对象含义,特意写了这样一个小程序,希望与大家分享

    中考化学基础知识点温习6.pdf

    中考化学基础知识点温习6.pdf

    用Java开发学生信息系统:Maven工程构建与标准库应用

    本文详细介绍了一个Java简易程序实例—学生信息管理系统的制作流程,涵盖创建Maven项目、配置pom.xml、编写实体类(Student)、业务管理类(StudentManager)以及主控类(Main),并介绍数据如何存于本地txt中。...

    J2EE学习以及Linux组件学习的日常总结,适合想了解和温习基础知识的童鞋。目前计划包含的内容有设计模式、Spri.zip

    在IT领域,J2EE(Java 2 Platform, Enterprise Edition)和Linux是两个重要的组成部分,对于任何想要深入理解企业级应用开发和系统管理的人来说,掌握它们的基础知识是至关重要的。这个压缩包文件“J2EE学习以及...

Global site tag (gtag.js) - Google Analytics