有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

public class X{

     double a;
     double b;
     double c;
}

public X array_of_x[SIZE] = new X [SIZE];

但在内部,数据将存储为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();

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

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


共 (1) 个答案

  1. # 1 楼答案

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

    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];
    };
    

    如果希望减轻GC的负担,还可以缓存ContiguousX的所有实例。如果在堆上分配ContiguousX对象,那么它们很可能存在于堆栈中,这在很大程度上取决于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
    };
    

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

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