gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 20:21:45 24 4
gpt4 key购买 nike

我想知道如何(如果可能的话)使用数据布局 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();

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

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

最佳答案

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

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)以实现快速访问:

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

通过针对接口(interface)进行编程,您以后始终可以自由选择存储。

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

关于java - 如何自动从类数组转换为数组类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13810703/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com