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