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

标签 java

我有大量的字符串需要以非常紧凑的方式存储。目前我将字符串(32 个字符 a-f/0-9)存储在 HashSet<byte[]> 中。我只是调用.getBytes()得到这个。

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

最佳答案

一个HashSet<byte[]>无论如何都坏了,如 byte[]不覆盖 equals()hashCode() 。调用getBytes()不指定字符编码通常是一个坏主意 - 如果您只有十六进制数字可能没问题,但我仍然会尽可能避免它。

如果您的字符串始终是 32 个十六进制数字,则基本上是 16 个字节 - 您是否考虑过为此编写一个自定义集合,或者可能只是将它们封装在一个对象中?考虑到对于任何“普通”集合,您都必须有一个具有一些描述的对象来表示该元素,因此对象开销很难解决 - 尽管使用自定义集合您可以只拥有两个您保持同步的长整型数组。这将是您可能找到的最紧凑的表示形式,但只是一个带有两个 long 的对象。字段或四个 int田野将是我的起点。然后你可以覆盖 hashCodeequals实际上得到 HashSet处理值相等,而不仅仅是引用标识...并且每个元素使用的数据仍然少于 32 字节的字节数组。

关于java - 如何使用最少的内存在哈希集中存储字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7880467/

相关文章:

java - Glassfish 抛出 com.sun.xml.ws.client.ClientTransportException : The server sent HTTP status code 500: Internal Server Error

JavaMail 无法从 docker 容器发送电子邮件

java - 如何在 Java 中打印带有 2 位小数的 float ?

Java 对象引用机制

java - 多次打印数组中每 10 个元素以及 100 个元素

java - 如何在 El Capitan (OS X 10.11) 上设置需要旧版 java 的应用程序?

Java排序表监听器

java - 无法使用 Gson 将对象(使用 Room DB)序列化为 json 字符串

java - 如何在几分钟内检索两个 Date 实例之间的差异?

java - 如何使用重用 session 连接到 FTPS 服务器?