Java UUID的长表示

时间:2013-01-14 17:39:56

标签: java out-of-memory uuid

我使用UUID将大量的Java HashMap存储到UUID.toString()行中。由于数据很大,很快就会抛出OutOfMemoryError。现在我正在考虑一种表示UUID的简洁方式,最好是类似long的方式,然后我可以轻松地使用UUID表示重建long。这可能吗?

2 个答案:

答案 0 :(得分:7)

UUID基本上是一个数字,但它是一个128位的数字,是java long的两倍。您可以使用BigInteger(可能不比将UUID存储为字符串更节省空间),或者您可以将UUID封装在包含两个long的对象中 - 一个用于前64位,一个用于最后64位。

根据UUID 550e8400-e29b-41d4-a716-446655440000,您需要创建两个长片,一个包含数字0x550e8400e29b41d4,另一个包含数字0xa716446655440000

答案 1 :(得分:7)

  

我使用UUID将大量的Java HashMap存储到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中所示。