在Java中,什么是更快和更少的内存:int[n]
或者boolean[n]
也许Bitset(n)
?
该问题适用于小(n
最多1000
)、中(n
介于1000
和之间100000
)和大(n
大于100000
)大小的数组。谢谢你。
我想实现标志(1/0)存储。
在Java中,什么是更快和更少的内存:int[n]
或者boolean[n]
也许Bitset(n)
?
该问题适用于小(n
最多1000
)、中(n
介于1000
和之间100000
)和大(n
大于100000
)大小的数组。谢谢你。
我想实现标志(1/0)存储。
在大多数 JVM 上;数组或对象有 12-16 字节的开销。一个int
使用 4 个字节,一个boolean
使用一个字节(它不是必须的,但它与 OpenJDK/HotSpot 一起使用)BitSet 使用两个对象和更多内存用于小型集合,但每个只有一个位。因此,对于小型集合,anint[]
可以小于 a BitSet
,但随着大小的增长,BitSet 将是最小的。
如果数据结构小于你的缓存,那么最快的就是那么int[]
这是因为在闯入或一点点时存在非平凡的开销。boolean[]
BitSet
int
byte
但是,一旦您的缓存大小变得重要,与使用较慢缓存或主内存的开销相比,BitSet 的开销可能会逐渐减弱。
简而言之:如果有疑问,请使用 BitSet,因为这更清楚您的意图并且可能更快。
实际上,它依赖于JVM。例如 Sun JVM 将boolean
类型转换为int
. 这意味着即使是布尔变量也使用 32 位。但是 jvm 优化布尔数组,并为每个布尔数组单元保留 8 位。
Java 存储boolean
在int
内部。所以int[]
和boolean[]
完全一样。
BitSet
使用更少的内存。更快与否取决于您的使用模式。
内存使用的降序
int[n] > Bitset(n) > boolean[n]
但是,在访问索引时,应该没有任何区别。
考虑用枚举替换位标志。然后你可以使用例如 EnumSet 而不是 Bitset。