不需要new的Object的Java数组:连续分配

时间:2013-11-15 02:53:10

标签: java arrays optimization data-structures

在Java中,您声明一个数组,然后调用new来分配空间。因此,具有4个命名整数的类占用的空间更少,并且具有比大小为4的数组更好的局部性。

有没有办法让一个包含4个元素的数组,但是它的分配方式与命名的vaiables a1, a2, a3, a4

相同

对于那些了解C ++的人来说,这与要求int x[4]而不是int *x

相同
class X
{
   int x1;
   int x2;
   int x3;
   int x4;
};

[ Class OID ][x1][x2][x3][x4] = 1 ref + 4 int

class Y
{
   int y[];
};

y=new int[4];

[ Class OID ][Y] ======> [Array OID][Array Size][y][y][y][y] = 3 ref + size + 4 int

2 个答案:

答案 0 :(得分:3)

从Java 6开始,在理想情况下,对象实际上是在堆栈上而不是在堆上分配的 - 换句话说,就是你要求的东西。通常,这是针对其引用未离开创建它们的范围的对象。事实上,事实是,有时候“新”是完全免费的!虽然看起来Java代码看起来冗长而且效率低下,但是有几层优化编译器可以将您编写的代码转换为令人惊讶的高效机器代码。

答案 1 :(得分:0)

你唯一能做的就是这个

int x1, x2, x3, x4;

void set(int i, int v) {
    switch(i) {
    case 0:
        x1 = v;
        break;
    ...
    default:
        throw new IndexOutOfBoundsException();
    }
}

int get(int i) {
...

请注意,字节码中的切换已经过优化,它不会按顺序测试i,而是直接转到所需的代码

ILOAD 1
TABLESWITCH
  0: L1
  1: L2
  2: L3
  3: L4
  default: L5