当前位置: 首页 > 面试题库 >

Map的keySet()和entrySet()的性能注意事项

穆劲
2023-03-14
问题内容

所有,

谁能让我确切知道两者之间的性能问题?站点:CodeRanch简要概述了使用keySet()和get()时需要的内部调用。但是如果使用keySet()和get()方法时,任何人都可以提供有关流的确切详细信息,那将是很好的。这将帮助我更好地了解性能问题。


问题答案:

首先,这完全取决于您使用的地图类型。但是,由于JavaRanch线程讨论了HashMap,因此我假设这就是您所指的实现。并假设您正在谈论Sun /
Oracle的标准API实现。

其次,如果您在遍历哈希映射时担心性能,我建议您看一下LinkedHashMap。从文档:

在LinkedHashMap的集合视图上进行迭代需要的时间与地图的大小成正比,而不管其容量如何。
在HashMap上进行迭代可能会更昂贵,需要的时间与其容量成正比。

HashMap.entrySet()

此实现的源代码可用。实现基本上只是返回一个new HashMap.EntrySet。一个看起来像这样的类:

private final class EntrySet extends AbstractSet<Map.Entry<K,V>> {
    public Iterator<Map.Entry<K,V>> iterator() {
        return newEntryIterator(); // returns a HashIterator...
    }
    // ...
}

HashIterator看起来像

private abstract class HashIterator<E> implements Iterator<E> {
    Entry<K,V> next;    // next entry to return
    int expectedModCount;   // For fast-fail
    int index;      // current slot
    Entry<K,V> current; // current entry

    HashIterator() {
        expectedModCount = modCount;
        if (size > 0) { // advance to first entry
            Entry[] t = table;
            while (index < t.length && (next = t[index++]) == null)
                ;
        }
    }

    final Entry<K,V> nextEntry() {
        if (modCount != expectedModCount)
            throw new ConcurrentModificationException();
        Entry<K,V> e = next;
        if (e == null)
            throw new NoSuchElementException();

        if ((next = e.next) == null) {
            Entry[] t = table;
            while (index < t.length && (next = t[index++]) == null)
                ;
        }
    current = e;
        return e;
    }

    // ...
}

这样就可以了…那就是指示您遍历entrySet时将发生什么的代码。它遍历整个数组,该数组与地图的容量一样长。

HashMap.keySet()和.get()

在这里,您首先需要掌握这组键。这花费的时间与地图的 容量 成正比(而不是LinkedHashMap的 大小
)。完成此操作后,您需要get()为每个键调用一次。当然,在一般情况下,具有良好的hashCode实现会花费固定的时间。但是,这不可避免地需要大量的.hashCode.equals呼叫,这显然要比仅进行entry.value()呼叫花费更多的时间。



 类似资料:
  • 问题内容: 我把一个字符串数组元素是一个映射,其中字符串数组的元素是键,单词的频率是值,例如: 那么地图上将有类似 打印所有键: 打印所有键值对: 使用条目集将打印所有值: 但是下面的代码块应该输出与上面完全相同的输出,但是不会: 它打印: 但是,如果我们在while循环中取消注释第1行,即 并评论这一行 然后我们得到所有键: 如果使用with ,则迭代器没有几个键! 问题答案: 每次调用move

  • C++ 程序员偏爱性能,所以这里是一个性能专题。 由于 Hana 运行时和编译时计算处于前沿领域,我们不仅对运行时性能感兴趣,而且对编译时性能也感兴趣。 由于这两个主题是相当不相交的,我们在下面分别对待。 注意: 当我们推送到存储库时,本节中提供的基准会自动更新。 如果您发现不能承受此处声明的结果,请开一个GitHub issue; 它可能是一个性能回归。 警告: 在写这篇文章的时候,并不是所有的

  • 问题内容: 我有一个需要从我的Java程序调用的功能。我曾经将参数传递给存储的proc。我正在使用oracle瘦驱动程序(在Web逻辑服务器中根据相关的jndi条目配置)。此存储的proc没有任何OUT值。此存储的proc接受一个数字值,并根据接收到的值在db中进行很多更新。 我得到一个连接对象,然后在循环中调用此存储的proc(20次传递20个数字)。当我直接从oracle客户端调用此存储的pr

  • 问题内容: 我正在评估各种选项,以便针对Oracle中的单个临时数据集运行一堆高性能查询。在T- SQL中,我可能会使用内存中的临时表,但是Oracle没有与此功能完全相同的功能。 我目前看到这些选项: 1.全局临时表 计划: 2.取消PL / SQL表类型变量的嵌套 计划: 3.物化视图 对于这个用例,我将它们排除在外,因为所讨论的临时数据集相当复杂,并且对更新实例化视图的影响将太大。 实际数据

  • 本文向大家介绍Vue.js 和 MVVM 的注意事项,包括了Vue.js 和 MVVM 的注意事项的使用技巧和注意事项,需要的朋友参考一下 MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式,其核心是提供对View 和 View Model 的双向数据绑定,这使得View Model的状态改变可以自动传递给 View,这就是所谓的数据双向绑定。 Vue.j

  • 我正在使用Cognito,API Gateway和Authorers。授权方配置为缓存 5 分钟以提高性能。我觉得这是一个不错的功能。 我知道授权者是将身份验证逻辑保存在一个地方的好方法,并且应用程序可以假设用户已经获得授权。然而,我对此表示怀疑。 pentest报告建议,一旦注销,令牌就不能使用。这意味着为了安全起见,我不应该启用授权缓存?这也意味着所有经过身份验证的API都将有一个lambda