我使用UUID
将大量的Java HashMap
存储到UUID.toString()
行中。由于数据很大,很快就会抛出OutOfMemoryError
。现在我正在考虑一种表示UUID
的简洁方式,最好是类似long
的方式,然后我可以轻松地使用UUID
表示重建long
。这可能吗?
答案 0 :(得分:7)
UUID基本上是一个数字,但它是一个128位的数字,是java long的两倍。您可以使用BigInteger(可能不比将UUID存储为字符串更节省空间),或者您可以将UUID封装在包含两个long的对象中 - 一个用于前64位,一个用于最后64位。
根据UUID 550e8400-e29b-41d4-a716-446655440000
,您需要创建两个长片,一个包含数字0x550e8400e29b41d4
,另一个包含数字0xa716446655440000
。
答案 1 :(得分:7)
我使用
UUID
将大量的JavaHashMap
存储到UUID.toString()
行。
所以你的意思是HashMap<String, MyObject>
?
与HashMap<UUID, MyObject>
相比,通过HashMap<String, MyObject>
存储UUID本身可以节省空间。 UUID
占用的空间比String
占用的空间少(两个long
值变为16个字节,而char[36]
为72个字节,这样可以节省近80%的空间)。
如果改变不够,那么考虑UUID
值是否在JVM中是重要的。如果ID只需要对于单个进程是唯一的(您是将HashMap
保存到磁盘还是在 Java进程之间共享?),那么您可以使用int
因为HashMap
无论如何都不能大于Integer.MAX_VALUE
。因此,您需要HashMap<UUID, MyObject>
而不是HashMap<Integer, MyObject>
。更好的是,如果您要使用少于2个 16 对象,则可以使用Short
,从而节省更多空间。但是,如果你得到一个OutOfMemoryError
,我怀疑你可能有超过65536个对象。
最后,如果所有其他方法都失败了,请为您的JVM分配更多内存,如this question中所示。