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

java8中的TreeMap与HashMap

诸修伟
2023-03-14

根据Java8中的这个链接,为了避免在map(HashMap, LinkedHashMap, and Converter tHashMap)中的冲突,使用平衡树来实现,而不是LinkedList

那么,如果:

>

  • TreeMap和其他映射(HashMap、LinkedHashMap和ConcurrentHashMap)都是使用自平衡树实现的,因为最坏情况下的可访问性是相同的
  • 条目的排序我可以实现如下:

    public <K extends Comparable,V extends Comparable> LinkedHashMap<K,V> sortByKeys(LinkedHashMap<K,V> map){
        List<K> keys = new LinkedList<K>(map.keySet());
        Collections.sort(keys, (Comparator<? super K>) new Comparator<String>() {
            @Override
            public int compare(String first, String second) {                
                return first.compareTo(second);
            }
        });
    }
    

    除了排序和可访问性,TreeMap的其他属性是什么?

  • 共有1个答案

    壤驷俊逸
    2023-03-14

    >

    在jdk7和旧jdk中重新计算桶索引时大小

    在jdk7的HasMap中放入这样的内容时,只有一个bucket。那么查找节点是O(N)。

    class Foo{
       int hashCode(){
           return 0;
       }
    }
    Foo first=new Foo();
    Foo last=new Foo();
    map.put(first,"anything");
    map.put(last,"anything");
    map.get(last | first);// O(N)
    

    在jdk8中,当把这样的东西放到HasMap中时,只有一个bucket,但是实现的键是可比较的。然后查找节点是O(log(N)),但是如果i相同,则查找节点将回退到O(N)。

    class Foo implements Comparable<Foo> {
        private int i;
    
        public Foo(int i) {
    
            this.i = i;
        }
    
        public int hashCode() {
            return 0;
        }
    
        @Override
        public int compareTo(Foo that) {
            return i - that.i;
        }
    }
    
    Foo first=new Foo(1);
    Foo last=new Foo(2);
    map.put(first,"anything");
    for(int i=2;i<threshold;i++)
      map.put(new Foo(i + 1), "anything");
    map.put(last,"anything");
    map.get(last | first);// O(log(N))
    

    排序LinkedHashMap您可以改为创建TreeMap实例,因为Map.keySet()返回无序集而不是列表,因此您无法通过排序其键对地图进行排序。

    public <K extends Comparable<? super K>, V> Map<K, V> sortByKeys(Map<K, V> map) {
     return new TreeMap<K, V>(map);
    }
    
     类似资料:
    • 产出: 请提供2个方法将产生不同输出的例子。

    • TreeMap是数据树的直观表示,其中每个节点可以有零个或多个子节点,以及一个父节点(根节点除外)。 每个节点都显示为一个矩形,可以根据我们指定的值进行调整大小和着色。 尺寸和颜色相对于图中的所有其他节点进行估值。 以下是树形图图表的示例。 我们已经在Google Charts Configuration Syntax一章中看到了用于绘制图表的配置 。 现在,让我们看一个TreeMap图表的示例。

    • 我对这两种算法的时间复杂度感到困惑。 usingTreeMap算法的时间复杂度正确吗?我知道在treemap中插入时间是log(n ),但是如果我们遍历一个包含10个元素的数组,它会变成nlog(n)吗?

    • 在IDE上执行程序时,它不会给出任何输出。我原以为它会给出。

    • 问题内容: import java.util.*; 输出: 我想知道为什么我们在第一条注释行中得到空值,而第二条注释行中却显示出非空值。 编辑:@null的版本似乎不起作用。我将代码更改如下: 似乎可行,但我不确定。 问题答案: 我的猜测是您的方法永远不会返回0(表示相等),从而导致该方法找不到匹配项。

    • TreeMap类使用树实现Map接口。 TreeMap提供了一种以排序顺序存储键/值对的有效方法,并允许快速检索。 您应该注意,与哈希映射不同,树映射保证其元素将按升序键顺序排序。 以下是TreeMap类支持的构造函数列表。 Sr.No. 构造函数和描述 1 TreeMap( ) 此构造函数构造一个空树图,该图将使用其键的自然顺序进行排序。 2 TreeMap(Comparator comp) 此