本人一直有一个问题,如果要经常调用一个类的一些方法,例如工具类(自定义的Util),是定义一个引用变量来调用还是用不断的new 这个类来调用,哪个更加高效?举个例子吧。定义了一个矩阵类Matrix,调用转置,乘积等方法。两种使用方法:class Matrix{
   //返回两个矩阵的乘积C=A*B
   public double[][] multiply(double[][] A,double[][] B){
      .......
   }
   //返回矩阵A的转置矩阵A'
   public double[][] transpose(double[][] A){
      .......
   }
   //返回两个矩阵的和C=A+B
   public double[][] add(double[][] A,double[][] B){
      .......
   }
}现在要调用Matrix类计算矩阵A = X'*X+Y,其中X,Y是两个矩阵。方法(一):
class Test{
   public static void main(String[] args){
      double[][] X = {.......};//输入X
      double[][] Y = {.......};//输入Y
      Matrix matrix = new Matrix();
      double[][] xTrans = matrix.transpose(X);
      double[][] temp = matrix.multiply(xTrans,X);
      double[][] A = matrix.add(temp,Y);
      double[][] C = matrix.multiply(X,Y);//如果还想计算C = X*Y      
   }
}方法(二):
class Test{
   public static void main(String[] args){
      double[][] X = {.......};//输入X
      double[][] Y = {.......};//输入Y
      double[][] xTrans = new Matrix().transpose(X);
      double[][] temp = new Matrix().multiply(xTrans,X);
      double[][] A = new Matrix().add(temp,Y);      
   }
}两种方法都可以吧,哪一种效率高呢?当然了,计算一次没有多大区别。如果计算X'*X+Y 是在一个循环中呢?还有一个问题是方法(一)中matrix调用了两次multiply以后是个什么状态?可能这个问题对于高手来说很简单,不吝赐教。

解决方案 »

  1.   

    我想应该是方法(一)效率高,因为方法(二)中的 new Matrix()只要一new出来就是垃圾,因为没有引用变量指向它。我不知道这两种使用方法的本质区别在哪里?
      

  2.   

    。。你的想法是对的,每new一个不但多消耗内存,而且多消耗时间,而且产生更多的垃圾,肯定是方法一效率高。
    没啥本质区别,方法二只不过是每调用一个方法就多new出了一个对象,而方法一只使用一个对象而已。不过在通常的开发中,工具类的方法一般都是声明为static,这样你就可以:类名.方法名()调用了,比你在不同的类里面都new一个对象出来效率高多了
      

  3.   

    谢谢!但是工具类声明为static也要小心,因为每个类只有一个方法和一份成员,不管new多少对象,这样数据可能还没有修改完就就进入下一个操作。那应该还要用同步synchronized。例如,假设前面的方法都是static的,这样用:double[][] A = Matrix.add(Matrix.multiply(Matrix.transpose(X),X),Y)可能会出错。
      

  4.   

    要是没用到成员变量或者静态变量,果断写成static。方便,也不用先创建类,在使用方法。
      

  5.   

    我试过,会出错,特别是在各种循环内,或者互相调用的时候,某些操作还没有搞完,可能就被别人拿去用了。我还问了专家,我说这种用法和Math类有什么区别,他说Math类是synchronized的。所以我一直很纠结像Matrix这种类怎么写,怎么用?
      

  6.   

    这种工具类就不该使用static数据了,你的Matrix例子应该不需要定义static数据吧
      

  7.   

    Matrix类中没有Static数据,里面只有矩阵的一些常用计算方法。这种时候这些方法我就不确定定义成Static方法会不会有问题?