NO.13 共享经济下的对象 | Java敲黑板系列

开场白

老铁 :通过上述两篇文章,我们已经get到减少创建对象数量,将可以提升程序运行效率。今天我们再来说说另外一项在创建对象方面能优化程序运行性能的技术——“对象复用”。

对象复用

所谓“对象复用”仍然是一项与编程语言无关的技术,它是一种在程序运行过程中减少创建对象数量的策略与方法。即:尽量能重用已有对象,而不是再重新创建一个。

基于对象复用技术,能减少程序在创建对象与回收对象时的性能开销,进而提升程序的运行性能。

应用举例

下面我们通过代码举例来说明如何运行“复用对象”技术,先看代码1。

public class Student {
    private String name;
    private String course;
    private double score;

    public Student(){}

    public Student(String name, String course, double score) {
        this.name = name;
        this.course = course;
        this.score = score;
    }

    public double getScore() {
        return this.score;
    }

    //计算学生总成绩
    public double totalScore(String[] names, String[] courses, double[] scores) {
        int nLen = (null == names) ? 0 : names.length;
        int cLen = (null == courses) ? 0 : courses.length;
        int sLen = (null == scores) ? 0 : scores.length;

        double total = 0;

        if (nLen == cLen && cLen == sLen) {
            for (int i = 0; i < nLen; i++) {
            //实例化一个学生对象
            Student s = new Student(names[i], courses[i], scores[i]); //1
            total += s.getScore();
            }
        }

        return total;
    }
}

在代码1中,我们定义了一个Student类,该类中包括了三个成员,为客户端提供了计算多位学生的总成绩功能totalScore函数。在该函数中存在一个循环语句用于遍历每位学生的成绩并进行叠加。在每次循环的时候都会创建一个Student对象,如果学生数量为N,那么就会创建N个对象,并且这些对象一旦被创建后,脱离循环后就不会被使用。我们可以想象JVM耗费了内存和时间创建出来的对象没有怎么被“发扬光大”就这样“默默无闻”的被回收了,想想都觉得很是可惜。

的确是很可惜,对于上述业务场景,我们可以采用“对象复用”技术,减少创建对象数量,提高对象利用率,进而提升程序性能,如代码2所示。

public class Student {
    private String name;
    private String course;
    private double score;

    public Student(){}

    public Student(String name, String course, double score) {
        this.name = name;
        this.course = course;
        this.score = score;
    }

    public double getScore() {
        return this.score;
    }

    //为对象的所有成员重新赋值
    public void reInit(String n,String c,double s){
        this.name = n;
        this.course = c;
        this.score = s;
    }

    //计算学生总成绩
        public double totalScore(String[] names, String[] courses, double[] scores) {
        int nLen = (null == names) ? 0 : names.length;
        int cLen = (null == courses) ? 0 : courses.length;
        int sLen = (null == scores) ? 0 : scores.length;

        double total = 0;

        Student s = new Student();
        if (nLen == cLen && cLen == sLen) {
            for (int i = 0; i < nLen; i++) {
            //在循环体内不断的复用对象引用s而不再实例化新的学生对象
            s.reInit(names[i], courses[i], scores[i]); //2
            total += s.getScore();
            }
        }

        return total;
    }
}

如代码2所示,“对象复用”的实现方式,就是把已定义好的对象进行复用,具体复用的方式如上述代码中的reInit函数所示,需要将待复用的对象的所有或必要的成员变量进行重新初始化,这样内存空间不变、地址不变、只是内存中存放的内容发生了变化,对业务而言好像是重新变成了另外一个对象一样。

是不是很简单?欢迎老铁们结合一下自身的实际编程经验在留言区写下的您的感悟,大家共同讨论交流。

注意事项

敲黑板

  1. 对象复用技术应用在循环语句中,由于可以减少大量的新对象创建,其效果是非常明显的;如本文的代码2的业务场景中。
  2. 将对象进行复用在JVM垃圾回收器方面也存在诸多益处。因为对象是被拿回复用而不是解除引用,垃圾回收器需要做的工作也就更少一些,也就减少了因为运行垃圾回收而造成的程序停顿,进而提升了程序运行速度。

转载自公众号:代码荣耀
图1

猜你喜欢

转载自blog.csdn.net/maijia0754/article/details/80576988