当前位置: 首页 > 知识库问答 >
问题:

如何存储哈希映射值(如果值重复)?

太叔景同
2023-03-14

Java是将重复值保存为唯一值还是单独保存?

假设我有以下键值对值:

A -> "a very long string...."
B -> "another very long string...."
C -> "the same very long string from A key.... (but not same string instance)"

是否将其保存为3个键和3个值,或保存为3个键和2个值(A的值与C的值完全相同)

我担心的是大小,因为我要保存的值非常大,复制它们毫无意义。

共有3个答案

怀洛华
2023-03-14

它不保留值,它保存对值的引用,因此问题归结为“”是一个很长的字符串吗......“”来自A键的相同很长的字符串......“内存中的相同对象?”

如果它们不是编译时常量,并且是在运行时获取/构造的,则它们是不同的对象。String interning和String#intern在这里可以帮助您,但有@bratkartofel提到的局限性。

什么是Java字符串实习?
什么时候我们应该在字符串文字上使用字符串的实习方法
String.intern()的性能惩罚

夹谷和韵
2023-03-14

但这并不涉及HashMap,我的意思是它不是特定于它的。将值设置为字符串也意味着另外两个不同的事情,例如字符串插入或字符串是不可变的。此外,HashMap不会复制该值(无论这意味着什么),它只存储对其他对象的引用-如何处理这些对象完全取决于您自己。如果在HashMap之外更改对象,然后根据特定的关联键查询该对象,您将看到更新。

皇甫夕
2023-03-14

哈希映射可以包含重复的值,因此在您的示例中,映射中有3个键和3个值。

但是,如果您担心大型实例作为值多次存储在Map中,则应该存储对同一实例的引用。

例如:

String val = "a very long String............";
String val2 = "a second long String.........";
map.put(1,val);
map.put(2,val2);
map.put(3,val);

只有两个大的String实例。Map包含3个对那些Strings的引用(两个对第一个String的引用和一个对第二个String的引用),但引用占用少量存储空间。

 类似资料:
  • 输入是一个哈希映射,比如 我想写一个方法,返回类型A的列表,其中有键,值属性与字符串类型,和键值从hashmap。 如何让它成为现实?

  • 我需要创建一个带有单键的哈希表,它应该包含多个字符串,数组列表,字符串,数组列表类型的值.. 爱尔兰共和国..,字符串类型的Msg,整数数组列表类型的groupdestId,字符串类型的Id,整数数组列表类型的userdestId..

  • 问题内容: 我有一个简单的问题,当我想将SHA1哈希的结果存储在MySQL数据库中时发生: 我将散列结果存储在 VARCHAR 字段中多长时间? 问题答案: 我将使用可变长度的数据,但不使用固定长度的数据。由于SHA-1值 始终为 160位长,因此将仅在固定长度字段的长度上浪费一个额外的字节。 而且我也不会存储返回的值。因为每个字符只使用4位,因此需要160/4 = 40个字符。但是,如果每个字符

  • 我从数组列表中检索数据。已有数组列表具有与哈希映射类型(key、values)相同值;在从数组列表中检索这些数据并映射到哈希映射变量之后。我必须用一个叫做tax的变量来分组。 1)在哈希映射中添加Add 之后,将这些哈希映射值添加到名为final_cart_list_1的数组列表初始化类型的Arraylist中 在此之后,我将所有产品的产品特别税值 税务的日志cat值如下所示 之后,我采取产品的具

  • 我需要从我的Android向Algolia发送数据,发送的数据应该是JSONObject格式(导入org.json.JSONObject) Algolia中的数据应采用此格式 所以在Android中,我这样设置代码 在这行代码中 那么我应该怎么做才能以JSONObject格式发送hashmap数据呢?

  • 有人能帮我找到一份没有重复的正确清单吗。 我有一个哈希映射列表,比如“HashMap map”,它的大小是4。键值对类似于以下内容 我想创建另一个Hashmap列表,其中包含“uri\u path”的单个条目以及相应计算的平均值和计数。这就是我正在尝试的。理想情况下,新列表的大小应小于原始列表的大小。有人能帮我理解是不是出了问题