Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用包含相似值的两个哈希映射保留内存_Java_Memory_Hashmap - Fatal编程技术网

Java 使用包含相似值的两个哈希映射保留内存

Java 使用包含相似值的两个哈希映射保留内存,java,memory,hashmap,Java,Memory,Hashmap,我正在按顺序将两个大型数据集加载到两个单独的hashmap中。(数据集序列化为许多记录对象,如下所示)。哈希映射的表示方式如下,键作为记录的id: Map<Long, Record> recordMapA = new HashMap<>(); Map<Long, Record> recordMapB = new HashMap<>(); 在许多情况下,两个数据集之间的记录相同,只是时间戳字段不同。对于我的用例,如果除时间戳字段外的所有字段值都相同

我正在按顺序将两个大型数据集加载到两个单独的hashmap中。(数据集序列化为许多记录对象,如下所示)。哈希映射的表示方式如下,键作为记录的id:

Map<Long, Record> recordMapA = new HashMap<>();
Map<Long, Record> recordMapB = new HashMap<>();
在许多情况下,两个数据集之间的记录相同,只是时间戳字段不同。对于我的用例,如果除时间戳字段外的所有字段值都相同,则任何两个记录对象都是相等的

// These two records are the same because only the timestamp differs
Record recordA = new Record(54321, 1615270861975L, "foo", "USA"); 
Record recordB = new Record(54321, 1615357219994L, "foo", "USA"); 
为了保留内存,是否有办法使两个记录对象“相等”,那么映射a和映射B中的映射条目值都将引用内存中的同一个记录对象?我已经覆盖了Record对象的equals和hashCode方法来忽略timestamp,然后检查RecordMapA是否已经包含相同的记录。如果是这样,我将RecordMapA中的记录放入RecordMapB,而不是将数据集B中序列化的新记录放入Map B。但是,到目前为止,对内存的影响似乎可以忽略不计


需要注意的一点是,我需要保留两个地图(而不是将它们合并为一个),以便以后进行比较。

如果记录“足够小”,那么我就不会费心尝试任何新奇的东西。对于大型记录,最简单的方法似乎是做你正在做的事情

void addToMap(Long key, Record rec, Map<Long,Record> map, 
              Map<Long,Record> otherMap) {
    Record existing = otherMap.get(key);
    map.put(key, existing != null ? existing : rec);
]
void addToMap(长键、记录记录、映射、,
地图(其他地图){
记录existing=otherMap.get(键);
map.put(key,existing!=null?existing:rec);
]
假设如果该键存在,则该键所定位的记录必须相同。如果不是这样,则需要进行检查

void addToMap(Long key, Record rec, Map<Long,Record> map, 
              Map<Long,Record> otherMap) {
    Record existing = otherMap.get(key);
    if (existing != null && existing.equals(rec))
         map.put(key, existing);
    else
         map.put(key, rec);
]
void addToMap(长键、记录记录、映射、,
地图(其他地图){
记录existing=otherMap.get(键);
if(existing!=null&&existing.equals(rec))
地图放置(键,现有);
其他的
地图放置(键,记录);
]

对于任何给定记录,是否在两个地图中使用相同的键?是的,记录也对应于两个地图中的相同键。
void addToMap(Long key, Record rec, Map<Long,Record> map, 
              Map<Long,Record> otherMap) {
    Record existing = otherMap.get(key);
    if (existing != null && existing.equals(rec))
         map.put(key, existing);
    else
         map.put(key, rec);
]