1

我们在几个类中有许多属性,这些属性目前是一个 int 和一个 boolean。int 是值,如果该 int 已设置,则布尔值为 true。

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

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

有什么建议么?

谢谢 - 戴夫

4

7 回答 7

7

如果您没有使用 的全部范围,则int可以使用类似Integer.MIN_VALUE或的魔术值-1来表示“未设置”。

这方面的一个例子是 String 的方法,如果它没有找到匹配项indexOf(),它将返回。-1

于 2012-06-22T16:12:31.830 回答
3

整数是否为正且按顺序排列(或者,如果不按顺序排列,它们不会达到巨大的值)?即 1,2,3,4...99999,100000?

如果是这样,您可以使用java.util.BitSet

于 2012-06-22T16:14:59.163 回答
3

这里的大多数答案已经涵盖了我最初的建议,但如果这只是垃圾收集器压力而不是太多内存占用的问题,并且您确实需要完整的 32 位整数,您可以应用相同类型的位掩码用长招代替。

您将拥有一个具有以下功能的实用程序类

long setIntValue(int i) { return 0xFFFF0000 | i; }
int getIntValue(long l) { return (int)(0xFFFF & l); }
boolean isIntValueSet(long l) { return (0xFFFF0000 & l) != 0; }
于 2012-06-22T16:22:58.417 回答
2

想到2个可能性,

  • 使用Integer对象并使用null引用来指定该值尚未设置。
  • 如果ints 值范围不跨越整个范围,您可以选择一个值,例如Integer.MIN_INT指定该值尚未设置。
于 2012-06-22T16:14:48.523 回答
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;
    }

}
于 2012-06-22T16:25:18.893 回答
1

每个具有 100K 元素的 int[] 和 boolean[] 将使用大约 500K 的内存(并且是两个对象)

您也可以使用一个int值来存储标志。但是,如果这不是一个选项,您可以使用 along可以存储所有可能的 int 和 boolean 值。

您可以使用像 an 或什至 an and a 这样的集合int[]long[]即将int[]数据boolean[]存储在基于列而不是基于行的结构中。

于 2012-06-22T16:26:45.513 回答
0

只需Pair<L,R>从 apache.commons.lang 使用。您正在进行过早的优化,但没有任何事实证明这些对确实存在性能/内存问题。

于 2012-06-22T16:28:42.317 回答