我们在几个类中有许多属性,其中的属性目前是整数和布尔值。int 是值,如果已设置该 int,则布尔值为 true。
我们需要这种配对,因为我们表示一个具有属性级别的对象,如果未在一个级别设置,则使用上一级的设置。这种方法允许我们在每个级别记录其值是什么,以及它是在该级别设置还是继承的。
效果很好。然而,我们最终可以得到100,000个这样的对象。这是大量的内存,大量的垃圾收集等。所以,任何想法我们如何以某种方式做得更好。我们查看了一个以枚举作为索引的整数和布尔值数组。但这感觉真的很尴尬,这通常意味着有更多的机会出错(即引入错误)。
有什么建议吗?
谢谢 - 戴夫
如果您没有使用int
的全部范围,则可以使用魔术值(如 Integer.MIN_VALUE
或 -1
)来表示"未设置"。
这方面的一个例子是 String 的 indexOf()
方法,如果未找到匹配项,它将返回-1
。
这里的大多数答案已经涵盖了我最初建议的内容,但如果这只是垃圾收集器压力的问题,而不是那么多内存占用,并且您确实需要 32 位整数的全部范围,您可以应用相同的位屏蔽技巧。
您将拥有一个具有以下函数的实用程序类
long setIntValue(int i) { return 0xFFFF0000 | i; }
int getIntValue(long l) { return (int)(0xFFFF & l); }
boolean isIntValueSet(long l) { return (0xFFFF0000 & l) != 0; }
整数是否为正且有序(或者,如果不按顺序,它们不会上升到巨大的值)? 即 1,2,3,4...99999,100000?
如果是这样,您可以使用java.util.BitSet。
可能性浮现在脑海中,
- 使用
Integer
对象并使用null
引用来指定尚未设置该值。 - 如果
int
S 值范围未涵盖整个范围,则可以选择类似Integer.MIN_INT
的值来指定尚未设置该值。
你可以做一个touple class
public class Tuple<X,Y>{
private final X x;
private final Y y;
public Tuple(X x,Y y){
this.x=x;
this.y=y;
}
public X getX(){
return x;
}
public Y getY(){
return y;
}
}
一个 int[] 和布尔 [] 各有 100K 个元素,将使用大约 500K 的内存(并且是两个对象)
您也可以使用 int
值来存储标志。但是,如果这不是一个选项,您可以使用可以存储所有可能的整数和布尔值的long
。
您可以使用像int[]
或long[]
这样的集合,甚至是int[]
和boolean[]
,即将数据存储在基于列而不是基于行的结构中。
只需使用 apache.commons.lang 中的 Pair<L,R>
。您正在进行过早的优化,而没有任何事实证明确实存在由这些对引起的性能/内存问题。