如何将 int 和布尔值存储为一对



我们在几个类中有许多属性,其中的属性目前是整数和布尔值。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。

2种

可能性浮现在脑海中,

  • 使用 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>。您正在进行过早的优化,而没有任何事实证明确实存在由这些对引起的性能/内存问题。

最新更新