Java 如何使用最少的内存在哈希集中存储字符串

Java 如何使用最少的内存在哈希集中存储字符串,java,Java,我有大量的字符串需要以非常紧凑的方式存储。目前,我正在将字符串(32个字符a-f/0-9)存储在HashSet中。我只是简单地调用.getBytes()来获取此信息 我的问题是,有没有更好的方法将这些数据存储在哈希集中 AHashSet无论如何都会被破坏,因为byte[]不会覆盖equals()或hashCode()。在不指定字符编码的情况下调用getBytes()通常是一个坏主意——如果您只有十六进制数字,这可能没什么问题,但我仍然会尽可能避免使用它 如果字符串总是32个十六进制数字,基本上是

我有大量的字符串需要以非常紧凑的方式存储。目前,我正在将字符串(32个字符a-f/0-9)存储在
HashSet
中。我只是简单地调用
.getBytes()
来获取此信息

我的问题是,有没有更好的方法将这些数据存储在哈希集中

A
HashSet
无论如何都会被破坏,因为
byte[]
不会覆盖
equals()
hashCode()
。在不指定字符编码的情况下调用
getBytes()
通常是一个坏主意——如果您只有十六进制数字,这可能没什么问题,但我仍然会尽可能避免使用它

如果字符串总是32个十六进制数字,基本上是16个字节——您是否考虑过为此编写自定义集合,或者可能只是将它们封装在一个对象中?考虑到对于任何“普通”集合,都必须有一个具有某种描述的对象来表示元素,因此很难获得对象开销——尽管对于自定义集合,您可能只有两个保持同步的long数组。这将是一个尽可能紧凑的表示形式,但只有一个包含两个
long
字段或四个
int
字段的对象才是我的起点。然后,您可以覆盖
hashCode
equals
,并实际获得
HashSet
以使用值相等,而不仅仅是引用标识。。。每个元素使用的数据仍然比32字节的字节数组少。

a
HashSet
无论如何都会被破坏,因为
byte[]
不会覆盖
equals()
hashCode()
。在不指定字符编码的情况下调用
getBytes()
通常是一个坏主意——如果您只有十六进制数字,这可能没什么问题,但我仍然会尽可能避免使用它


如果字符串总是32个十六进制数字,基本上是16个字节——您是否考虑过为此编写自定义集合,或者可能只是将它们封装在一个对象中?考虑到对于任何“普通”集合,都必须有一个具有某种描述的对象来表示元素,因此很难获得对象开销——尽管对于自定义集合,您可能只有两个保持同步的long数组。这将是一个尽可能紧凑的表示形式,但只有一个包含两个
long
字段或四个
int
字段的对象才是我的起点。然后,您可以覆盖
hashCode
equals
,并实际获得
HashSet
以使用值相等,而不仅仅是引用标识。。。而且每个元素使用的数据仍然比32字节的字节数组少。

同意。如果您有一个非常固定的数据集/大小,您可能可以进行一些很好的优化,而不是将其存储为字符串。如何保持两个数组的同步?地图怎么样?@DarthVader:我会写一个完全定制的收藏。Java集合不能很好地处理基元类型,这正是我们在本例中想要的。。。但我会从一个
哈希集开始
。同意。如果您有一个非常固定的数据集/大小,您可能可以进行一些很好的优化,而不是将其存储为字符串。如何保持两个数组的同步?地图怎么样?@DarthVader:我会写一个完全定制的收藏。Java集合不能很好地处理基元类型,这正是我们在本例中想要的。。。但我会从一个
哈希集开始。