可变原语作为通用参数

时间:2016-03-13 21:37:51

标签: java performance generics

在我的应用程序中,我将拥有大约100k个单元格的数组。该阵列将以高频率更新,因此性能至关重要。 Cell是某种类型的值的容器,大多数是整数或浮点数,但是有些情况下使用了2个或更多的int,所以最好的选择是使这个类具有通用性。我想在每次更新时阻止复制并创建大量新对象。我认为对象应该是Mutable,但是要制作

 Cell<T implements Mutable<T>>

,其中

Mutable<T> 

有方法

void set(T value)

没有让我到任何地方,set(T)会复制参数。你有任何想法如何使它成为可能吗?防止复制甚至值得吗?

1 个答案:

答案 0 :(得分:0)

您的代码看起来不太清楚,但如果您尝试为性能创建可变的原始包装器,那么它不应该是通用的,因为这会导致其值为autoboxed。你会想要这样的东西:

class Cell<T> {
    private T value;

    public T getValue() {
        return value;
    }

    public void setValue(T value) {
        this.value = value;
    }
}

class IntWrapper {
    private int value;

    private int get() {
        return value;
    }

    private void set(int value) {
        this.value = value;
    }
}

现在我们可以在没有任何对象构造或自动装箱的情况下更新单元格的值:

class Main {
    private Cell<IntWrapper>[] cells;
    //...
    void updateCell(int index, int newValue) {
        cells[index].getValue().set(newValue);
    }
}

请注意,通常最好避免混淆泛型和数组,因此最好使用List<Cell<IntWrapper>>(性能差异可以忽略不计)。