我们在几个类中有许多属性,其中属性目前是int和boolean。 int是值,如果设置了int,则boolean为true。
我们需要这个配对,因为我们正在表示一个具有属性级别的对象,如果它没有设置在一个级别,它使用上面级别的设置。这种方法允许我们在每个级别记录它的值是什么,以及它是否设置在该级别或继承。
效果很好。然而,我们最终可能会有100,000个这样的对象。这是一个大量的记忆,大量的垃圾收集等等。所以,任何想法我们如何可以以某种方式更好地做到这一点。我们查看了一系列以int作为索引的整数和布尔值。但这感觉真的很尴尬,这通常意味着更多的机会出错(即引入错误)。
有什么建议吗?
谢谢 - 戴夫
答案 0 :(得分:7)
如果您未使用int
的全部范围,则可以使用Integer.MIN_VALUE
或-1
这样的魔术值来表示“未设置”。
这样的一个示例是String的indexOf()
方法,如果找不到匹配项,将返回-1
。
答案 1 :(得分:3)
这些整体是正的还是有序的(或者,如果没有按顺序,它们不会达到巨大的价值)?即1,2,3,4 ... 99999,100000?
如果是,您可以使用java.util.BitSet。
答案 2 :(得分:2)
我想到了2个可能性,
Integer
个对象并使用null
引用指定尚未设置该值。int
的值范围未跨越整个范围,您可以选择Integer.MIN_INT
之类的值来指定尚未设置该值。答案 3 :(得分:2)
这里的大多数答案已经涵盖了我最初建议的内容,但如果只是垃圾收集器的压力而不是内存占用,而你真的需要全范围的32位整数,你可以应用同样的比特掩盖技巧用了很长的代替。
您将拥有一个具有
等功能的实用程序类long setIntValue(int i) { return 0xFFFF0000 | i; }
int getIntValue(long l) { return (int)(0xFFFF & l); }
boolean isIntValueSet(long l) { return (0xFFFF0000 & l) != 0; }
答案 4 :(得分:1)
你可以创建一个元组类
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;
}
}
答案 5 :(得分:1)
带有100K元素的int []和boolean []每个将使用大约500K的内存(并且是两个对象)
您也可以使用int
值来存储该标志。但如果这不是一个选项,你可以使用long
来存储所有可能的int和boolean值。
您可以使用类似int[]
或long[]
或甚至int[]
和boolean[]
的集合,即将数据存储在基于列而不是基于行的结构中。
答案 6 :(得分:0)
只需使用apache.commons.lang中的Pair<L,R>
即可。你正在做premature optimization而没有任何事实证明这些对确实存在性能/内存问题。