[英]Efficient storage of array of objects holding primitives in Java
將以下數據結構從C轉換為Java的最有效方法是什么?
struct {
int a; int b; int c; int d;
double e;
} foo[] = {
{ 0, 1, 2, 42, 37.972},
/* ... 100 more struct elements ... */,
{ 0, 3, -1, -4, -7.847}
}
我最好能想到的是:
class Foo {
public int a;
public int b;
public int c;
public int d;
public double e;
public Foo(int a, int b, int c, int d, double e) {
this.a = a;
this.b = b;
this.c = c;
this.d = d;
this.e = e;
}
}
Foo[] foo = new Foo[] {
new Foo(0, 1, 2, 42, 37.972),
/* ... 100 more objects ... */
new Foo(0, 3, -1, -4, -7.847)
}
但是它使用太多對象來保存簡單基元。
但是它使用太多對象來保存簡單基元。
不,不是。 Java int
或double
字段不是對象; 它會作為其包含的Foo
實例的一部分在堆上分配。
因此,根據您的情況,將有101個對象:一個Foo[]
數組和100個Foo
實例。
還是您希望所有這些都是單個“平面”陣列? 抱歉,Java無法做到,這不是它的工作原理。
再說一遍,您到底在擔心什么? 101個這樣的對象什么都不是 ,我們在這里討論的不足4KB!
使用5個並行陣列可能是管理內存最有效的方式。
但是,它處理起來要復雜得多,並且除了不太像面向對象之外,您也很容易引入錯誤(即,您不能輕易利用Java提供的有用的功能)。
因此,如果可以證明 明顯的映射(創建一個類並創建該類型的數組)是有問題的,我只會嘗試這樣做。
如果使用並行數組方法,則可以創建一個Foo
類,充當這些數組的門面對象:它通過透明地引用適當的數組來獲取索引i
並像單個結構一樣工作。
在結構的C數組中,您將首先選擇想要的行,然后選擇哪一列(a,b,c,d,e)。 您可以通過在每一列中使用單獨的數組來在Java中使用類似的存儲空間:
int[] a = new int[] { 0, ..., 0 };
int[] b = new int[] { 1, ..., 3 };
int[] c = new int[] { 2, ..., -1 };
int[] d = new int[] { 42, ..., -4 };
double[] e = new double[] { 37.972, ..., -7.847 };
改寫您的問題:“在Java中保存包含基元的對象數組的存儲非常有效”。 您甚至不應該問自己這樣的問題:數組,集合和對象是必經之路,無需事后思考就可以使用它們。
我會說:不用擔心。
32位JVM中Foo對象的大小為
8個字節的對象開銷+ 4 *(int字段為4字節)+ 1 *(double字段為8字節)= 32字節
因此,對象開銷為25%。 有幾種方法可以通過Java NIO緩沖區有效地使用內存,但是除非您要處理大量數據,否則很少值得這么做。
我不認為這應該是一個問題。 該類並不比其字段所需的空間大很多。 您當然可以使用數組來存儲所有值,但隨后您必須在數組中搜索以查找某些內容。
您可以查找在線轉換器或編寫一個簡單的程序,該程序使用regexp從c源文件捕獲數據並生成java代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.