Java 可变原语作为泛型参数
在我的应用程序中,我将拥有大约100k个单元的数组。该阵列将以高频更新,因此性能至关重要。Cell是某种类型的值的容器,主要是整数或浮点值,但也有使用2个或更多整数的情况,所以最好的选择是将此类设置为泛型。我希望在每次更新时防止复制和创建大量新对象。我认为对象应该是可变的,但是Java 可变原语作为泛型参数,java,performance,generics,Java,Performance,Generics,在我的应用程序中,我将拥有大约100k个单元的数组。该阵列将以高频更新,因此性能至关重要。Cell是某种类型的值的容器,主要是整数或浮点值,但也有使用2个或更多整数的情况,所以最好的选择是将此类设置为泛型。我希望在每次更新时防止复制和创建大量新对象。我认为对象应该是可变的,但是 Cell<T implements Mutable<T>> 我哪儿也找不到,set(t)将复制参数。你有什么办法使之成为可能吗?防止复制是否值得呢?不太清楚您的代码是什么样子的,但是如果您试图
Cell<T implements Mutable<T>>
我哪儿也找不到,set(t)将复制参数。你有什么办法使之成为可能吗?防止复制是否值得呢?不太清楚您的代码是什么样子的,但是如果您试图制作一个性能可变的原语包装器,它不应该是通用的,因为这会导致其值自动装箱。你会想要这样的东西:
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;
}
}
类单元{
私人T值;
公共T getValue(){
返回值;
}
公共无效设置值(T值){
这个值=值;
}
}
类IntWrapper{
私有int值;
私有int get(){
返回值;
}
私有无效集(int值){
这个值=值;
}
}
现在,我们可以在不进行任何对象构造或自动装箱的情况下更新单元格的值:
class Main {
private Cell<IntWrapper>[] cells;
//...
void updateCell(int index, int newValue) {
cells[index].getValue().set(newValue);
}
}
主类{
专用小区[]个小区;
//...
void updateCell(int索引,int newValue){
单元格[index].getValue().set(newValue);
}
}
请注意,通常最好避免将泛型和数组混合使用,因此最好使用
List
(性能差异可以忽略不计)。发布一些演示意外行为的代码。@shmosel在集合中我必须使用赋值。T必须是一个对象。旧值将被丢弃并留给GC收集。每次更新我可能会创建10万个新对象,剩下10万个旧对象供收集。我担心这会影响性能。所有这些都不能解决我的评论。单元格
的语法无效,没有任何意义,因为它意味着您希望在可变
中存储一个可变
。对于“性能至关重要”的问题,这是非常模糊的。什么样的表演?你的目标是什么?你是在秒级、毫秒级还是微秒级?这是什么样的数据?更新方式和更新内容?如何(或根本不)向用户展示?所有关于类的通用性和复制等的业务似乎都是本末倒置。
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);
}
}