小编kri*_*ard的帖子

TreeMap put()会默默删除其他条目吗?

我经历了一些非常怪异的TreeMap行为,我在缩小一个小测试用例时遇到了一些麻烦,所以请耐心等待.

我想从运行时提供的文件中将大量键值对读入Map.我正在使用自定义密钥类.后来,当我把条目撤回时,我发现其中一个或多个丢失了.使用调试器和一些测试用例,我已经确定缺少的条目在读取阶段肯定会消失,但我不确定是什么导致它.

基本上:

Map<MyKey,Double> map = new TreeMap<MyKey,Double>();
map.put(key1,value1);

// ... put another ~500 entries into the map ...

assertTrue(map.containsKey(key1)); // passes
if (!map.containsKey(keyN)) { 
    map.put(keyN, valueN); // this code executes
}
assertTrue(map.containsKey(key1)); // FAILS
Run Code Online (Sandbox Code Playgroud)

......实质上,向地图添加一个全新的密钥会导致无关的条目失效.

  • 如果我只是单独添加key1和keyN,则key1保留在地图中 - 介入的500个条目在某种程度上很重要
  • 如果我从2 ..(N-1)中删除一个或两个任意键,则在添加keyN时仍会启动key1
  • 如果我从2 ..(N-1)中删除了大范围的键,则key1在添加keyN时保持不变,但是当添加keyQ时会掉出来,在行下面还有~300个键
  • 不幸的是,当keyN踢出key1的地图的大小是一样的地图的大小时keyQ踢出key1的,所以它可能不是一个有限的尺寸问题
  • 如果我使用HashMap,则key1仍保留在地图中
  • 自定义键类MyKey对Comparable,equals和hashCode使用相同的逻辑.

我最初使用TreeMap是因为我希望使用大型数据集,而TreeMap的内存效率更高一些.HashMap将是一个很好的选择,但看到TreeMap以这种方式表现仍然令人震惊 - 任何人都对这里发生的事情有所了解?

java key map treemap comparable

6
推荐指数
1
解决办法
1821
查看次数

标签 统计

comparable ×1

java ×1

key ×1

map ×1

treemap ×1