我知道这个问题听起来很傻,但请考虑一下:我有一个ints
(1..N)数组和一个标记算法。在任何时候int
代表的项目都处于三个状态之一。当前版本将这些状态保存在byte
数组中,其中0,1和2表示三种状态。或者,我可以有三个boolean
数组 - 每个状态一个。哪个更好(消耗更少的内存)取决于jvm(sun的版本)如何存储数组 - 是一个由1位表示的布尔值?幕后还有其他魔法吗? (p.s.不要从所有这一切开始“这不是OO / Java的工作方式” - 我知道,但这里的性能就在前面。加上算法简单,即使在这种形式下也完全可读。)
非常感谢
答案 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)
字节数组要好得多!
boolean
在每个编程语言中使用1个字节!因此,您将使用每个状态3个字节,并且您只需1个字节即可执行此操作(理论上您可以将其减少到仅1个位置(请参阅其他帖子)。所以,我希望我们能说服你!