树状图和并发跳过列表图之间的区别?是否可以将 NavigableMap 与重复键的映射结构一起使用?

use*_*330 2 java dictionary

我是 Java 初学者。我有一个方法如下:

 public void time_filter(Long t1, Long t2){
    NavigableMap<Long, Operations_enter> time_map = new TreeMap<Long, Operations_enter>();
    for(int i=0; i< tm.size();i++){
        Operations_enter op = new Operations_enter();
        op.cpuid_enter = cpu.get(i);
        op.func_enter = stt.get(i);
        op.time_enter = tm.get(i);
        op.src_enter = tok.get(i);

        time_map.put(op.time_enter, op);

    }


    for(Map.Entry<Long, Operations_enter> entry: time_map.subMap(t1, true, t2, true).entrySet()){
        Integer time_func = entry.getValue().func_enter;
        System.out.println(" Filtered function numbers corresponding to given time range is" + time_func);

        }
Run Code Online (Sandbox Code Playgroud)

正如上面所看到的,我实现了一个NavigableMapwithTreeMap并且我能够使用subMapNavigableMap 中的方法过滤给定范围。但我现在有一个问题,time_enter包含一些重复的键,所以当我使用 时TreeMap,这些值会被最新添加的重复值覆盖。我明白这就是TreeMap工作原理。我也尝试使用ConcurrentSkipListMap,但结果是一样的。

ConcurrentSkipListMap和 之间的实际区别是什么TreeMap?是否有可能使用NavigableMaporTreeMap来实现ConcurrentSkipListMap,同时将重复值包含在 中NavigableMap

编辑 代码现在看起来像这样:

  NavigableMap<Long, Operations_enter> time_map = new TreeMap<Long, Operations_enter>(new Comparator<Long>() {
        public int compare(Long o1, Long o2) {
            return o1.equals(o2) ? 1 : o1.compareTo(o2);
        }
    });
    for(int i=0; i< tm.size();i++){
        Operations_enter op = new Operations_enter();
        op.cpuid_enter = cpu.get(i);
        op.func_enter = stt.get(i);
        op.time_enter = tm.get(i);
        op.src_enter = tok.get(i);

        time_map.put(op.time_enter, op);

    }

    for(Map.Entry<Long, Operations_enter> entry: time_map.subMap(t1, true, t2, true).entrySet()){

       Integer time_func = entry.getValue().func_enter;
        System.out.println(" Filtered function numbers corresponding to given time range is" + time_func);
     }
Run Code Online (Sandbox Code Playgroud)

Bas*_*que 7

ConcurrentSkipListMapTreeMap都是NavigableMap实现。实现该接口意味着他们按排序顺序保存密钥。这是他们的共同点。在其他方面,它们是截然不同的。

是否可以将 NavigableMap 与重复键的映射结构一起使用?

不,既不能TreeMapConcurrentSkipListMap不能处理重复的键。当执行 a 时put,现有键的先前值被到达的值替换。

树状图和并发跳过列表图之间的区别?

3 个差异:空值、性能和并发性。

空值

  • ATreeMap 允许空值,而键必须非空。
  • AConcurrentSkipListMap 禁止键或值中出现空值。

表现

AConcurrentSkipListMap使用跳跃列表技术。此类可以显示非常快的搜索性能,同时仍然允许快速插入。

跳跃列表是可扩展的,即使在进行插入时也能保持大量条目的性能。

并发性

正如其他人指出的那样, aConcurrentSkipListMap被设计为并发线程安全的。ATreeMap不是。

结论

  • 如果您有大量条目,请使用ConcurrentSkipListMap而不是TreeMap.
  • 如果您要NavigableMap跨线程访问,请使用ConcurrentSkipListMap, never TreeMap
  • 对于单个线程内访问的较少数量的条目,请使用TreeMap.

这是一个总结了各种Map实现的表格。单击/点击进行缩放。

描述 Java 11 中各种 Map 实现的各个方面的表格。