Java基础:减少对象的创建提高java性能

 
许多通常的 Java 性能问题都起源于在设计过程早期中的类设计的思想, 早在许多开发者开始考虑性能问题之前. 在这个系列中, Brian Goetz 讨论了通常的 Java 性能上的冒险以及怎么在设计时候避免它们. 在第二部分, 他讨论了减少临时对象创建的一些技术。

  虽然许多程序员把性能管理一直推迟到开发过程的最后, 性能考虑应该从第一天起就和设计周期结合在一起. 这个系列探索一些早期的设计思想能够极大影响应用程序性能的方法.在这篇文章里, 我继续探索大量临时对象创建的问题, 并且提供一些避免它们的一些技术.
  临时对象就是一些生命周期比较短的对象, 一般用于保存其他数据而再没有其他用途. 程序员一般用临时变量向一个方法传递数据或者从一个方法返回数据. 第一部分探讨了临时对象是怎样给一个程序的性能带来负面的冲击, 以及一些类接口的设计思想怎样提供了临时对象的创建. 避免了那些接口的创建, 你就能极大地减少那些影响你的程序性能的临时对象创建的需求。
  只是对 String 说不吗?
  当它要创建临时变量时, String 类是最大的罪人中的一个. 为了演示, 在第一部分我写了一个正规表达式匹配的例子, 通过和一个类似的但是经过仔细设计的接口相比较, 演示了看起来无害的接口是怎样引起大量对象的创建, 而慢上几倍. 这里是原来的和好一些的类的接口:
坏的正则表达式匹配实例:
public class BadRegExpMatcher {
  public BadRegExpMatcher(String regExp);
  public String match(String inputText);
}                                                                                                                          

好的正则表达式匹配实例:

class BetterRegExpMatcher {
  public BetterRegExpMatcher(...);//省略了一些

  public int match(String inputText);
  public int match(char[] inputText);
  public int match(char[] inputText, int offset, int length);
 
  public int getMatchLength();
  public String getMatchText();
}
    大量使用 BadREgExpMatcher 的程序比使用 BtterRegExpMatcher 的要慢好多. 首先,调用者不得不创建一个 String 传入 match(), 接着 match() 又创建了一个 String 来返回匹配的文本. 结果是每次调用都有两个对象创建, 看起来不多, 但是如果要经常调用match(), 这些对象创建带给性能的代价就太大了. BadRegExpMatcher 的性能问题不是在它的实现中, 而是它的接口; 象它定义的接口, 没有办法避免一些临时变量的创建。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索正则表达式
, 设计
, int
, 对象
, 接口
变量
,以便于您获取更多的相关知识。

时间: 2024-11-10 00:10:09

Java基础:减少对象的创建提高java性能的相关文章

《Java和Android开发学习指南(第2版)》—— 第1章 Java基础 1.1 下载和安装Java

第1章 Java基础 要使用Java编程,需要Java SE开发工具包(Java SE Development Kit,JDK).因此,本章的第1节将介绍如何下载和安装JDK.开发Java程序,涉及编写代码,将其编译为字节码,以及运行字节码.在Java程序员的职业生涯中,这是一个一次又一次重复的过程,并且,它对于你适应这个职业至关重要.因此,本章的主要目标是让你体验用Java进行软件开发的过程. 编写的代码不仅要能够工作,还要容易阅读又便于维护,这一点很重要,因此本章将向你介绍Java编码惯例.

Java String字符串对象的创建及管理

Constant Pool常量池的概念: 在讲到String的一些特殊情况时,总会提到String Pool或者Constant Pool,但是我想很多人都不太明白Constant Pool到底是个怎么样的东西,运行的时候存储在哪里,所以在这里先说一下Constant Pool的内容. String Pool是对应于在Constant Pool中存储String常量的区域.习惯称为String Pool,也有人称为String Constant Pool.好像没有正式的命名. 在java编译好的

Java基础入门(一):Java里面的时间

这是一篇非常基础的Java技术文章,简单的说就是一个知识点,是自己在写业务代码时的一点总结,大神请绕行. 在 java 里面 表示 时间 ,一种是 java.util.Date 类,一种是 long 型的Unix时间戳,还有一种是String的字符串,当然前两种时间表示方法是时间定义的,可以对其进行操作计算得到一定的时间含义的,String字符串大多是前端显示之用,那当这三种形式共存时,必不可少就需要类型之间的转换及其对时间上的计算操作,这是在做一些业务功能上经常会用到的,现在总结一下通常所用的

Java基础教程之构造器与方法重载_java

在方法与数据成员中,我们提到,Java中的对象在创建的时候会初始化(initialization).初始化时,对象的数据成员被赋予初始值.我们可以显式初始化.如果我们没有给数据成员赋予初始值,数据成员会根据其类型采用默认初始值. 显式初始化要求我们在写程序时就确定初始值,这有时很不方便.我们可以使用构造器(constructor)来初始化对象.构造器可以初始化数据成员,还可以规定特定的操作.这些操作会在创建对象时自动执行. 定义构造器 构造器是一个方法.像普通方法一样,我们在类中定义构造器.构造

JavaSE学习总结(一)——Java基础

一.Java是什么 Java 是由 Sun Microsystems 在 1995 年首先发布的编程语言和计算平台.Java 是一项用于开发应用程序的技术,可以让 Web 变得更有意思和更实用.有许多应用程序和 Web 站点只有在安装 Java 后才能正常工作,而且这样的应用程序和 Web 站点日益增多.Java 快速.安全.可靠.从笔记本电脑到数据中心,从游戏控制台到科学超级计算机,从手机到互联网,Java 无处不在! java是当前最流行,应用最广泛的编程语言.点击查看tiobe排行 1.2

java中如何用反射创建一个对象

问题描述 java中如何用反射创建一个对象 java中如何用反射创建一个对象 如何理解java的反射,反射是一种怎么样的机制呢 解决方案 楼上说的理论很多了,,给你来点实际的,, Class clazz=Class.forName("test.User"); Object obj=clazz.newInstance(); 这是用反射创建对象的方法之一,,也是最常用的 解决方案二: 反射主要做两件事情,一个是运行时创建(dc)(最典型的,插件程序,插件在主程序后被开发出来,主程序要创建插

Java基础03 构造器与方法重载

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   在方法与数据成员中,我们提到,Java中的对象在创建的时候会初始化(initialization).初始化时,对象的数据成员被赋予初始值.我们可以显式初始化.如果我们没有给数据成员赋予初始值,数据成员会根据其类型采用默认初始值. 显式初始化要求我们在写程序时就确定初始值,这有时很不方便.我们可以使用构造器(constructor)来初始化对象.构造器可以初始化数据成员,还可以

Java基础:初学者Java语言入门精典文章

初学 Java总有它的千般好处使你选择它,但这些随便翻翻书或在网上逛一圈就能找到答案.在本文中,笔者把自己学习Java的一些切身体会和过程写出来,供初学者做个参考. 我在学习Java的过程中主要围绕以下几个方面来学习: 1.时刻提醒自己Java是一种OOP语言工具,而不仅仅是编码,只有这样才能总体把握和运用Java. 2.在学习的过程中,最好能够了解Java的底层机制,而不是仅仅停留在表层,不是抄书上的例子运行出结果就可以.要注意,即便对一个简单的例子也要有耐心去琢磨.调试.改动. 3.在学习的

java基础(数据类型,运算符)

java基础之数据类型(变量) java中存在的数据有常量和变量 常量:在程序执行的过程中其值不可以发生改变 常量的分类 字面值常量 字面值常量的分类 常量 描述 字符串常量 用双引号括起来的内容 整数常量 所有整数 小数常量 所有小数 字符常量 用单引号括起来的内容,里面只能放单个数字,单个字母或单个符号 布尔常量 较为特殊,只有true和false 空常量 null(数组部分) - - 自定义常量 变量:在程序执行的过程中,在某个范围内其值可以发生改变的量 定义格式: 数据类型 变量名 =