如何自动从类数组转换为数组类

dre*_*ash 5 java arrays algorithm performance class

我想知道如何(如果可能的话)我可以使用数据布局编写Java类Array of Class,例如:

public class X{

     double a;
     double b;
     double c;
}

public X array_of_x[SIZE] = new X [SIZE];
Run Code Online (Sandbox Code Playgroud)

但在内部数据将存储为这样的布局Class of Arrays:

 public class X{

     double a[] = new double [SIZE];
     double b[] = new double [SIZE];
     double c[] = new double [SIZE];
}

public X class_x = new X();
Run Code Online (Sandbox Code Playgroud)

我的目标是程序员可以像第一个那样以更直观的方式编程,但内部我会进行转换,因此数据可以在内存中连续,我会获得更多的性能.

有没有办法这样做,所以它可以接受任何具有第一类结构的类,并能够将其转换为第二种方法?(或者是能够进行此类转换的任何工具).

krl*_*mlr 3

让我们创建一个展示第一个使用布局的界面,以及在内部使用第二个布局的该界面的实现。(从代码中删除访问修饰符。)

interface X {
    double getA();
    double getB();
    double getC();
};

interface ArrayOfX {
    X get(int index);
};

class ContiguousArrayOfX implements ArrayOfX {
    class ContiguousX implements X {
        int index;
        ContiguousX(int index) {
            this.index = index; }
        double getA() { return a[index]; }
        double getB() { return b[index]; }
        double getC() { return c[index]; }
    }

    X get(int index) {
        return new ContiguousX(index); }

    double a[] = new double [SIZE];
    double b[] = new double [SIZE];
    double c[] = new double [SIZE];
};
Run Code Online (Sandbox Code Playgroud)

如果你想减轻GC的负担,你也可以缓存所有的实例ContiguousXContiguousX如果对象完全分配在堆上,这在很大程度上取决于 JIT 编译器的能力——它们很可能位于堆栈中,在这种情况下,开销可以忽略不计。作为最后的手段,您可以定义一个替代接口来快速访问:

interface FasterArrayOfX {
    double getA(int index);
    double getB(int index);
    double getC(int index);
};

class FasterContiguousArrayOfX extends ContiguousArrayOfX implements FasterArrayOfX {
   // Exercise left to the reader
};
Run Code Online (Sandbox Code Playgroud)

通过针对接口进行编程,您以后可以随时自由选择存储。

为任何给定的类布局编写代码生成器相当简单。上面的代码可以用作样板,只有方法和数组声明取决于您想要获取的类布局。我不知道有任何现有工具。