如何将int和boolean存储为一对

时间:2012-06-22 16:09:40

标签: java memory-management primitive-types

我们在几个类中有许多属性,其中属性目前是int和boolean。 int是值,如果设置了int,则boolean为true。

我们需要这个配对,因为我们正在表示一个具有属性级别的对象,如果它没有设置在一个级别,它使用上面级别的设置。这种方法允许我们在每个级别记录它的值是什么,以及它是否设置在该级别或继承。

效果很好。然而,我们最终可能会有100,000个这样的对象。这是一个大量的记忆,大量的垃圾收集等等。所以,任何想法我们如何可以以某种方式更好地做到这一点。我们查看了一系列以int作为索引的整数和布尔值。但这感觉真的很尴尬,这通常意味着更多的机会出错(即引入错误)。

有什么建议吗?

谢谢 - 戴夫

7 个答案:

答案 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而没有任何事实证明这些对确实存在性能/内存问题。