在java中,哪个更好 - 三个布尔数组或一个字节数组?

时间:2010-04-12 15:50:42

标签: java performance arrays memory-management primitive-types

我知道这个问题听起来很傻,但请考虑一下:我有一个ints(1..N)数组和一个标记算法。在任何时候int代表的项目都处于三个状态之一。当前版本将这些状态保存在byte数组中,其中0,1和2表示三种状态。或者,我可以有三个boolean数组 - 每个状态一个。哪个更好(消耗更少的内存)取决于jvm(sun的版本)如何存储数组 - 是一个由1位表示的布尔值?幕后还有其他魔法吗? (p.s.不要从所有这一切开始“这不是OO / Java的工作方式” - 我知道,但这里的性能就在前面。加上算法简单,即使在这种形式下也完全可读。)

非常感谢

5 个答案:

答案 0 :(得分:2)

使用BitSet - http://java.sun.com/j2se/1.4.2/docs/api/java/util/BitSet.html

,而不是两个布尔值或1个int

然后,每个标签/状态可以有两位。而BitSet是一个标准的java类,你可能会获得良好的性能。

答案 1 :(得分:2)

理论上,你需要做3个布尔数组:

firstState[n] = false;
secondState[n] = true;
thirdState[n] = false;

每当你想要改变第n个元素状态时。在这里,您可以通过索引操作和3个赋值操作看到3个元素。

使用1字节数组:

elements[n] = 1;

它更具可读性,速度提高3倍。此解决方案的另一个优点是,您可以轻松添加任意数量的新状态(使用布尔数组时,您需要引入新数组)。

但我不认为你会看到性能差异。

UPD :实际上我会更多地使用java方式(看起来你找不到简单的方法)并使用 enums 的数组。这将使它更加清晰,并会给你一些灵活性(也许将来你会认为oop不是那么糟糕):

enum ElementState {
   FIRST, SECOND, THIRD;
}

ElementState[] elementStates = new ElementState[N];
...
elementStates[i] = ElementState.FIRST;

答案 2 :(得分:1)

JVM第二版规范(http://java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html)指定布尔数组编码为(0,1),但不指定使用的类型。所以特定的JVM可能会也可能不会使用bit - 它可以使用int。

但是,如果性能至关重要,那么在任何情况下使用单个字节似乎都是您最好的选择。

编辑:我错误地说布尔数组存储为位数组 - 这是可能的但是特定于实现。

答案 3 :(得分:0)

如果你想要一个保证最小值,你可以使用三个java.util.BitSets。这些只会使用每个标志一位(虽然你会有额外的对象开销,如果标志的数量很小,可能会超过好处。)我想说如果你有大量的对象,BitSet可能是一个更好的选择,否则一个字节常量或枚举数组将导致更可读的代码(并且额外的存储不应该是一个真正的问题。)

答案 4 :(得分:0)

字节数组要好得多!

  1. boolean在每个编程语言中使用1个字节!因此,您将使用每个状态3个字节,并且您只需1个字节即可执行此操作(理论上您可以将其减少到仅1个位置(请参阅其他帖子)。
  2. 使用字节数组,您只需将其更改为您想要的字节。有三个数组,你必须改变每个数组的值!
  3. 当您开发应用程序时,您可能需要额外的状态。所以,这意味着你必须再次创建一个数组。另外,你必须改变4个值(第二点)
  4. 所以,我希望我们能说服你!

相关问题