簡體   English   中英

有效存儲Java中包含原語的對象數組

[英]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 intdouble字段不是對象; 它會作為其包含的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM