我正在将大量的Java UUID
以行的形式存储在 HashMap
中,使用 UUID.toString()
。由于数据量巨大,很快就会抛出 OutOfMemoryError
。现在我正在考虑一种紧凑的方式来表示 UUID
,最好是像 long
这样的东西,然后稍后我可以使用该 long
表示法轻松地重构出 UUID
。这种情况可能吗?
我正在将大量的Java UUID
以行的形式存储在 HashMap
中,使用 UUID.toString()
。由于数据量巨大,很快就会抛出 OutOfMemoryError
。现在我正在考虑一种紧凑的方式来表示 UUID
,最好是像 long
这样的东西,然后稍后我可以使用该 long
表示法轻松地重构出 UUID
。这种情况可能吗?
UUID
存储为行,使用 UUID.toString()
,并将其存储到 HashMap
中。HashMap<String, MyObject>
?UUID
本身存储在HashMap<UUID, MyObject>
中,与HashMap<String, MyObject>
相比,可以节省空间。一个UUID
占用的空间比String
少(两个long
值变成16字节,而不是72字节的char[36]
,从这里就可以节省近80%的空间)。UUID
值是否在JVM之间很重要。如果ID只需要在单个进程中是唯一的(您是否将HashMap
保存到磁盘或在Java进程之间共享?),那么可以使用int
,因为HashMap
不能超过Integer.MAX_VALUE
。所以,你将有HashMap<Integer, MyObject>
而不是HashMap<UUID, MyObject>
。更好的是,如果您将拥有小于216个对象,则可以使用Short
来节省更多的空间。但是,如果您收到OutOfMemoryError
错误消息,那么我怀疑您可能有超过65536个对象。UUID基本上是一个数字,但它是一个128位的数字,是java long的两倍大小。您可以使用BigInteger(可能与将UUID作为字符串存储一样不占用更多空间),或者您可以将UUID封装在包含两个longs的对象中 - 一个用于前64位,另一个用于后64位。
给定UUID 550e8400-e29b-41d4-a716-446655440000
,您需要创建两个longs,一个包含数字0x550e8400e29b41d4
,另一个包含数字0xa716446655440000
。